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<p>Note that the categorization of matchers is a great help when you combine 61them into matcher expressions. You will usually want to form matcher expressions 62that read like english sentences by alternating between node matchers and 63narrowing or traversal matchers, like this: 64<pre> 65recordDecl(hasDescendant( 66 ifStmt(hasTrueExpression( 67 expr(hasDescendant( 68 ifStmt())))))) 69</pre> 70</p> 71 72<!-- ======================================================================= --> 73<h2 id="decl-matchers">Node Matchers</h2> 74<!-- ======================================================================= --> 75 76<p>Node matchers are at the core of matcher expressions - they specify the type 77of node that is expected. Every match expression starts with a node matcher, 78which can then be further refined with a narrowing or traversal matcher. All 79traversal matchers take node matchers as their arguments.</p> 80 81<p>For convenience, all node matchers take an arbitrary number of arguments 82and implicitly act as allOf matchers.</p> 83 84<p>Node matchers are the only matchers that support the bind("id") call to 85bind the matched node to the given string, to be later retrieved from the 86match callback.</p> 87 88<p>It is important to remember that the arguments to node matchers are 89predicates on the same node, just with additional information about the type. 90This is often useful to make matcher expression more readable by inlining bind 91calls into redundant node matchers inside another node matcher: 92<pre> 93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 94// the same node. 95recordDecl(decl().bind("id"), hasName("::MyClass")) 96</pre> 97</p> 98 99<table> 100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 101<!-- START_DECL_MATCHERS --> 102 103<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 105 106Examples matches i(42). 107 class C { 108 C() : i(42) {} 109 int i; 110 }; 111</pre></td></tr> 112 113 114<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> 115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 116 117Given 118 class C { 119 public: 120 int a; 121 }; 122accessSpecDecl() 123 matches 'public:' 124</pre></td></tr> 125 126 127<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> 128<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 129 130Example matches Z 131 template<class T> class Z {}; 132</pre></td></tr> 133 134 135<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 136<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 137 138Given 139 template<typename T> class A {}; 140 template<> class A<double> {}; 141 A<int> a; 142classTemplateSpecializationDecl() 143 matches the specializations A<int> and A<double> 144</pre></td></tr> 145 146 147<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 148<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 149 150Example matches Foo::Foo() and Foo::Foo(int) 151 class Foo { 152 public: 153 Foo(); 154 Foo(int); 155 int DoSomething(); 156 }; 157</pre></td></tr> 158 159 160<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 161<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 162 163Example matches the operator. 164 class X { operator int() const; }; 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('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 169<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 170 171Example matches Foo::~Foo() 172 class Foo { 173 public: 174 virtual ~Foo(); 175 }; 176</pre></td></tr> 177 178 179<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 180<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 181 182Example matches y 183 class X { void y(); }; 184</pre></td></tr> 185 186 187<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 188<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 189 190Example matches X, Z 191 class X; 192 template<class T> class Z {}; 193</pre></td></tr> 194 195 196<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> 197<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 198 199Examples matches X, C, and the friend declaration inside C; 200 void X(); 201 class C { 202 friend X; 203 }; 204</pre></td></tr> 205 206 207<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 208<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 209and non-type template parameter declarations). 210 211Given 212 class X { int y; }; 213declaratorDecl() 214 matches int y. 215</pre></td></tr> 216 217 218<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> 219<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 220 221Example matches A, B, C 222 enum X { 223 A, B, C 224 }; 225</pre></td></tr> 226 227 228<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> 229<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 230 231Example matches X 232 enum X { 233 A, B, C 234 }; 235</pre></td></tr> 236 237 238<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> 239<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 240 241Given 242 class X { int m; }; 243fieldDecl() 244 matches 'm'. 245</pre></td></tr> 246 247 248<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 249<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 250 251Given 252 class X { friend void foo(); }; 253friendDecl() 254 matches 'friend void foo()'. 255</pre></td></tr> 256 257 258<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> 259<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 260 261Example matches f 262 void f(); 263</pre></td></tr> 264 265 266<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 267<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 268 269Example matches f 270 template<class T> void f(T t) {} 271</pre></td></tr> 272 273 274<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 275<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 276 277Given 278 goto FOO; 279 FOO: bar(); 280labelDecl() 281 matches 'FOO:' 282</pre></td></tr> 283 284 285<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 286<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 287 288Given 289 extern "C" {} 290linkageSpecDecl() 291 matches "extern "C" {}" 292</pre></td></tr> 293 294 295<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> 296<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 297 298Example matches X, S, the anonymous union type, i, and U; 299 typedef int X; 300 struct S { 301 union { 302 int i; 303 } U; 304 }; 305</pre></td></tr> 306 307 308<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 309<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 310 311Given 312 namespace test {} 313 namespace alias = ::test; 314namespaceAliasDecl() 315 matches "namespace alias" but not "namespace test" 316</pre></td></tr> 317 318 319<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> 320<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 321 322Given 323 namespace {} 324 namespace test {} 325namespaceDecl() 326 matches "namespace {}" and "namespace test {}" 327</pre></td></tr> 328 329 330<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 331<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 332 333Given 334 template <typename T, int N> struct C {}; 335nonTypeTemplateParmDecl() 336 matches 'N', but not 'T'. 337</pre></td></tr> 338 339 340<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 341<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 342 343Example matches Foo 344 @interface Foo 345 @end 346</pre></td></tr> 347 348 349<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 350<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 351 352Given 353 void f(int x); 354parmVarDecl() 355 matches int x. 356</pre></td></tr> 357 358 359<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_1RecordDecl.html">RecordDecl</a>>...</td></tr> 360<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 361 362Example matches X, Z, U, and S 363 class X; 364 template<class T> class Z {}; 365 struct S {}; 366 union U {}; 367</pre></td></tr> 368 369 370<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 371<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 372 373Example: 374 staticAssertExpr() 375matches 376 static_assert(sizeof(S) == sizeof(int)) 377in 378 struct S { 379 int x; 380 }; 381 static_assert(sizeof(S) == sizeof(int)); 382</pre></td></tr> 383 384 385<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 386<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 387 388Given 389 template <typename T, int N> struct C {}; 390templateTypeParmDecl() 391 matches 'T', but not 'N'. 392</pre></td></tr> 393 394 395<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 396<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 397 398Given 399 int X; 400 namespace NS { 401 int Y; 402 } namespace NS 403decl(hasDeclContext(translationUnitDecl())) 404 matches "int X", but not "int Y". 405</pre></td></tr> 406 407 408<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 409<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 410 411Given 412 typedef int X; 413 using Y = int; 414typeAliasDecl() 415 matches "using Y = int", but not "typedef int X" 416</pre></td></tr> 417 418 419<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 420<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 421 422Given 423 typedef int X; 424 using Y = int; 425typedefDecl() 426 matches "typedef int X", but not "using Y = int" 427</pre></td></tr> 428 429 430<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 431<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 432 433Given 434 typedef int X; 435 using Y = int; 436typedefNameDecl() 437 matches "typedef int X" and "using Y = int" 438</pre></td></tr> 439 440 441<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 442<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 443typename. 444 445Given 446 template <typename T> 447 struct Base { typedef T Foo; }; 448 449 template<typename T> 450 struct S : private Base<T> { 451 using typename Base<T>::Foo; 452 }; 453unresolvedUsingTypenameDecl() 454 matches using Base<T>::Foo </pre></td></tr> 455 456 457<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 458<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 459 460Given 461 template<typename X> 462 class C : private X { 463 using X::x; 464 }; 465unresolvedUsingValueDecl() 466 matches using X::x </pre></td></tr> 467 468 469<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> 470<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 471 472Given 473 namespace X { int x; } 474 using X::x; 475usingDecl() 476 matches using X::x </pre></td></tr> 477 478 479<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 480<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 481 482Given 483 namespace X { int x; } 484 using namespace X; 485usingDirectiveDecl() 486 matches using namespace X </pre></td></tr> 487 488 489<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 490<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 491 492Example matches A, B, C and F 493 enum X { A, B, C }; 494 void F(); 495</pre></td></tr> 496 497 498<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> 499<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 500 501Note: this does not match declarations of member variables, which are 502"field" declarations in Clang parlance. 503 504Example matches a 505 int a; 506</pre></td></tr> 507 508 509<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> 510<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 511</pre></td></tr> 512 513 514<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> 515<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 516 517Given 518 namespace ns { 519 struct A { static void f(); }; 520 void A::f() {} 521 void g() { A::f(); } 522 } 523 ns::A a; 524nestedNameSpecifier() 525 matches "ns::" and both "A::" 526</pre></td></tr> 527 528 529<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> 530<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 531</pre></td></tr> 532 533 534<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 535<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 536 537Given 538 FOO: bar(); 539 void *ptr = &&FOO; 540 goto *bar; 541addrLabelExpr() 542 matches '&&FOO' 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('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 547<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 548 549Given 550 int i = a[1]; 551arraySubscriptExpr() 552 matches "a[1]" 553</pre></td></tr> 554 555 556<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> 557<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 558 559 int i = 100; 560 __asm("mov al, 2"); 561asmStmt() 562 matches '__asm("mov al, 2")' 563</pre></td></tr> 564 565 566<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 567<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 568Example matches __atomic_load_n(ptr, 1) 569 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 570</pre></td></tr> 571 572 573<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 574<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 575 576Example matches a ?: b 577 (a ?: b) + 42; 578</pre></td></tr> 579 580 581<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 582<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 583 584Example matches a || b 585 !(a || b) 586</pre></td></tr> 587 588 589<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 590<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 591 592Given 593 while (true) { break; } 594breakStmt() 595 matches 'break' 596</pre></td></tr> 597 598 599<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> 600<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 601 602Example: Matches (int*) 2.2f in 603 int i = (int) 2.2f; 604</pre></td></tr> 605 606 607<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> 608<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 609 610Example matches x.y() and y() 611 X x; 612 x.y(); 613 y(); 614</pre></td></tr> 615 616 617<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 618<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 619 620Given 621 switch(a) { case 42: break; default: break; } 622caseStmt() 623 matches 'case 42: break;'. 624</pre></td></tr> 625 626 627<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> 628<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 629 630Example: castExpr() matches each of the following: 631 (int) 3; 632 const_cast<Expr *>(SubExpr); 633 char c = 0; 634but does not match 635 int i = (0); 636 int k = 0; 637</pre></td></tr> 638 639 640<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> 641<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 642 643Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 644though. 645 646Example matches 'a', L'a' 647 char ch = 'a'; 648 wchar_t chw = L'a'; 649</pre></td></tr> 650 651 652<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 653<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 654 655Example match: {1}, (1, 2) 656 int array[4] = {1}; 657 vector int myvec = (vector int)(1, 2); 658</pre></td></tr> 659 660 661<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 662<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 663 664Example matches '{}' and '{{}}'in 'for (;;) {{}}' 665 for (;;) {{}} 666</pre></td></tr> 667 668 669<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 670<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 671 672Example matches a ? b : c 673 (a ? b : c) + 42 674</pre></td></tr> 675 676 677<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 678<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 679 680Given 681 while (true) { continue; } 682continueStmt() 683 matches 'continue' 684</pre></td></tr> 685 686 687<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 688<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 689 690Example matches, 691 kernel<<<i,j>>>(); 692</pre></td></tr> 693 694 695<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 696<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 697 698Example matches FunctionTakesString(GetStringByValue()) 699 (matcher = cxxBindTemporaryExpr()) 700 FunctionTakesString(GetStringByValue()); 701 FunctionTakesStringByPointer(GetStringPointer()); 702</pre></td></tr> 703 704 705<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 706<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 707 708Example matches true 709 true 710</pre></td></tr> 711 712 713<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 714<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 715 716 try {} catch(int i) {} 717cxxCatchStmt() 718 matches 'catch(int i)' 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('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 723<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 724 725Example: Matches const_cast<int*>(&r) in 726 int n = 42; 727 const int &r(n); 728 int* p = const_cast<int*>(&r); 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('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 733<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 734 735Example matches string(ptr, n) and ptr within arguments of f 736 (matcher = cxxConstructExpr()) 737 void f(const string &a, const string &b); 738 char *ptr; 739 int n; 740 f(string(ptr, n), ptr); 741</pre></td></tr> 742 743 744<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 746 747Example matches the CXXDefaultArgExpr placeholder inserted for the 748 default value of the second parameter in the call expression f(42) 749 (matcher = cxxDefaultArgExpr()) 750 void f(int x, int y = 0); 751 f(42); 752</pre></td></tr> 753 754 755<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 756<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 757 758Given 759 delete X; 760cxxDeleteExpr() 761 matches 'delete X'. 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('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 766<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 767 768Example: 769 cxxDynamicCastExpr() 770matches 771 dynamic_cast<D*>(&b); 772in 773 struct B { virtual ~B() {} }; struct D : B {}; 774 B b; 775 D* p = dynamic_cast<D*>(&b); 776</pre></td></tr> 777 778 779<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 780<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 781 782cxxForRangeStmt() matches 'for (auto a : i)' 783 int i[] = {1, 2, 3}; for (auto a : i); 784 for(int j = 0; j < 5; ++j); 785</pre></td></tr> 786 787 788<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 789<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 790 791Example: Matches Foo(bar); 792 Foo f = bar; 793 Foo g = (Foo) bar; 794 Foo h = Foo(bar); 795</pre></td></tr> 796 797 798<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 799<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 800 801Example matches x.y() 802 X x; 803 x.y(); 804</pre></td></tr> 805 806 807<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 808<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 809 810Given 811 new X; 812cxxNewExpr() 813 matches 'new X'. 814</pre></td></tr> 815 816 817<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 818<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 819</pre></td></tr> 820 821 822<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 823<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 824 825Note that if an operator isn't overloaded, it won't match. Instead, use 826binaryOperator matcher. 827Currently it does not match operators such as new delete. 828FIXME: figure out why these do not match? 829 830Example matches both operator<<((o << b), c) and operator<<(o, b) 831 (matcher = cxxOperatorCallExpr()) 832 ostream &operator<< (ostream &out, int i) { }; 833 ostream &o; int b = 1, c = 1; 834 o << b << c; 835</pre></td></tr> 836 837 838<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 839<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 840 841Either the source expression or the destination type can be matched 842using has(), but hasDestinationType() is more specific and can be 843more readable. 844 845Example matches reinterpret_cast<char*>(&p) in 846 void* p = reinterpret_cast<char*>(&p); 847</pre></td></tr> 848 849 850<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 851<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 852 853See also: hasDestinationType 854See also: reinterpretCast 855 856Example: 857 cxxStaticCastExpr() 858matches 859 static_cast<long>(8) 860in 861 long eight(static_cast<long>(8)); 862</pre></td></tr> 863 864 865<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 866<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 867 868Example: Matches Foo(bar, bar) 869 Foo h = Foo(bar, bar); 870</pre></td></tr> 871 872 873<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 874<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 875 876Example matches the implicit this expression in "return i". 877 (matcher = cxxThisExpr()) 878struct foo { 879 int i; 880 int f() { return i; } 881}; 882</pre></td></tr> 883 884 885<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 886<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 887 888 try { throw 5; } catch(int i) {} 889cxxThrowExpr() 890 matches 'throw 5' 891</pre></td></tr> 892 893 894<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 895<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 896 897 try {} catch(int i) {} 898cxxTryStmt() 899 matches 'try {}' 900</pre></td></tr> 901 902 903<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 904<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 905 906Example matches T(t) in return statement of f 907 (matcher = cxxUnresolvedConstructExpr()) 908 template <typename T> 909 void f(const T& t) { return T(t); } 910</pre></td></tr> 911 912 913<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> 914<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 915 916Example matches x in if (x) 917 bool x; 918 if (x) {} 919</pre></td></tr> 920 921 922<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> 923<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 924 925Given 926 int a; 927declStmt() 928 matches 'int a'. 929</pre></td></tr> 930 931 932<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 933<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 934 935Given 936 switch(a) { case 42: break; default: break; } 937defaultStmt() 938 matches 'default: break;'. 939</pre></td></tr> 940 941 942<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 943<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 944 945Example: Matches { [2].y = 1.0, [0].x = 1.0 } 946 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 947</pre></td></tr> 948 949 950<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> 951<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 952 953Given 954 do {} while (true); 955doStmt() 956 matches 'do {} while(true)' 957</pre></td></tr> 958 959 960<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> 961<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 962 963Matches any cast expression written in user code, whether it be a 964C-style cast, a functional-style cast, or a keyword cast. 965 966Does not match implicit conversions. 967 968Note: the name "explicitCast" is chosen to match Clang's terminology, as 969Clang uses the term "cast" to apply to implicit conversions as well as to 970actual cast expressions. 971 972See also: hasDestinationType. 973 974Example: matches all five of the casts in 975 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 976but does not match the implicit conversion in 977 long ell = 42; 978</pre></td></tr> 979 980 981<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> 982<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 983 984Example matches x() 985 void f() { x(); } 986</pre></td></tr> 987 988 989<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 990<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 991of the sub-expression's evaluation. 992 993Example matches std::string() 994 const std::string str = std::string(); 995</pre></td></tr> 996 997 998<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 999<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g. 10001.0, 1.0f, 1.0L and 1e10. 1001 1002Does not match implicit conversions such as 1003 float a = 10; 1004</pre></td></tr> 1005 1006 1007<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> 1008<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1009 1010Example matches 'for (;;) {}' 1011 for (;;) {} 1012 int i[] = {1, 2, 3}; for (auto a : i); 1013</pre></td></tr> 1014 1015 1016<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1017<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1018</pre></td></tr> 1019 1020 1021<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> 1022<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1023 1024Given 1025 goto FOO; 1026 FOO: bar(); 1027gotoStmt() 1028 matches 'goto FOO' 1029</pre></td></tr> 1030 1031 1032<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> 1033<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1034 1035Example matches 'if (x) {}' 1036 if (x) {} 1037</pre></td></tr> 1038 1039 1040<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> 1041<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1042 1043This matches many different places, including function call return value 1044eliding, as well as any type conversions. 1045</pre></td></tr> 1046 1047 1048<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1049<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1050 1051Given 1052 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1053implicitValueInitExpr() 1054 matches "[0].y" (implicitly) 1055</pre></td></tr> 1056 1057 1058<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> 1059<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1060 1061Given 1062 int a[] = { 1, 2 }; 1063 struct B { int x, y; }; 1064 B b = { 5, 6 }; 1065initListExpr() 1066 matches "{ 1, 2 }" and "{ 5, 6 }" 1067</pre></td></tr> 1068 1069 1070<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> 1071<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g. 10721, 1L, 0x1 and 1U. 1073 1074Does not match character-encoded integers such as L'a'. 1075</pre></td></tr> 1076 1077 1078<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> 1079<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1080 1081Given 1082 goto FOO; 1083 FOO: bar(); 1084labelStmt() 1085 matches 'FOO:' 1086</pre></td></tr> 1087 1088 1089<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> 1090<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1091 1092Example matches [&](){return 5;} 1093 [&](){return 5;} 1094</pre></td></tr> 1095 1096 1097<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> 1098<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1099 1100Example: Given 1101 struct T {void func()}; 1102 T f(); 1103 void g(T); 1104materializeTemporaryExpr() matches 'f()' in these statements 1105 T u(f()); 1106 g(f()); 1107but does not match 1108 f(); 1109 f().func(); 1110</pre></td></tr> 1111 1112 1113<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> 1114<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1115 1116Given 1117 class Y { 1118 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1119 int a; static int b; 1120 }; 1121memberExpr() 1122 matches this->x, x, y.x, a, this->b 1123</pre></td></tr> 1124 1125 1126<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> 1127<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1128 1129 foo();; 1130nullStmt() 1131 matches the second ';' 1132</pre></td></tr> 1133 1134 1135<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1136<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1137 1138The innermost message send invokes the "alloc" class method on the 1139NSString class, while the outermost message send invokes the 1140"initWithString" instance method on the object returned from 1141NSString's "alloc". This matcher should match both message sends. 1142 [[NSString alloc] initWithString:@"Hello"] 1143</pre></td></tr> 1144 1145 1146<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1147<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1148to reference another expressions and can be met 1149in BinaryConditionalOperators, for example. 1150 1151Example matches 'a' 1152 (a ?: c) + 42; 1153</pre></td></tr> 1154 1155 1156<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 1157<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1158 1159Example matches (foo() + 1) 1160 int foo() { return 1; } 1161 int a = (foo() + 1); 1162</pre></td></tr> 1163 1164 1165<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 1166<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1167ParenListExprs don't have a predefined type and are used for late parsing. 1168In the final AST, they can be met in template declarations. 1169 1170Given 1171 template<typename T> class X { 1172 void f() { 1173 X x(*this); 1174 int a = 0, b = 1; int i = (a, b); 1175 } 1176 }; 1177parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1178has a predefined type and is a ParenExpr, not a ParenListExpr. 1179</pre></td></tr> 1180 1181 1182<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 1183<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1184 1185Example: Matches __func__ 1186 printf("%s", __func__); 1187</pre></td></tr> 1188 1189 1190<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> 1191<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1192 1193Given 1194 return 1; 1195returnStmt() 1196 matches 'return 1' 1197</pre></td></tr> 1198 1199 1200<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> 1201<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1202 1203Given 1204 { ++a; } 1205stmt() 1206 matches both the compound statement '{ ++a; }' and '++a'. 1207</pre></td></tr> 1208 1209 1210<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 1211<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1212 1213Example match: ({ int X = 4; X; }) 1214 int C = ({ int X = 4; X; }); 1215</pre></td></tr> 1216 1217 1218<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> 1219<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1220 1221Example matches "abcd", L"abcd" 1222 char *s = "abcd"; 1223 wchar_t *ws = L"abcd"; 1224</pre></td></tr> 1225 1226 1227<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1228<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1229 1230Given 1231 template <int N> 1232 struct A { static const int n = N; }; 1233 struct B : public A<42> {}; 1234substNonTypeTemplateParmExpr() 1235 matches "N" in the right-hand side of "static const int n = N;" 1236</pre></td></tr> 1237 1238 1239<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> 1240<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1241 1242Given 1243 switch(a) { case 42: break; default: break; } 1244switchCase() 1245 matches 'case 42: break;' and 'default: break;'. 1246</pre></td></tr> 1247 1248 1249<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> 1250<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1251 1252Given 1253 switch(a) { case 42: break; default: break; } 1254switchStmt() 1255 matches 'switch(a)'. 1256</pre></td></tr> 1257 1258 1259<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> 1260<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1261 1262Given 1263 Foo x = bar; 1264 int y = sizeof(x) + alignof(x); 1265unaryExprOrTypeTraitExpr() 1266 matches sizeof(x) and alignof(x) 1267</pre></td></tr> 1268 1269 1270<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> 1271<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1272 1273Example matches !a 1274 !a || b 1275</pre></td></tr> 1276 1277 1278<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 1279<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 1280but could not be resolved to a specific declaration. 1281 1282Given 1283 template<typename T> 1284 T foo() { T a; return a; } 1285 template<typename T> 1286 void bar() { 1287 foo<T>(); 1288 } 1289unresolvedLookupExpr() 1290 matches foo<T>() </pre></td></tr> 1291 1292 1293<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> 1294<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1295 1296Example match: "foo"_suffix 1297</pre></td></tr> 1298 1299 1300<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> 1301<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1302 1303Given 1304 while (true) {} 1305whileStmt() 1306 matches 'while (true) {}'. 1307</pre></td></tr> 1308 1309 1310<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 1311<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1312 1313Given 1314 template <typename T> struct C {}; 1315 C<int> c; 1316templateArgument() 1317 matches 'int' in C<int>. 1318</pre></td></tr> 1319 1320 1321<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> 1322<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1323</pre></td></tr> 1324 1325 1326<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> 1327<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1328 1329Given 1330 int a[] = { 2, 3 }; 1331 int b[4]; 1332 void f() { int c[a[0]]; } 1333arrayType() 1334 matches "int a[]", "int b[4]" and "int c[a[0]]"; 1335</pre></td></tr> 1336 1337 1338<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 1339<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1340 1341Given 1342 _Atomic(int) i; 1343atomicType() 1344 matches "_Atomic(int) i" 1345</pre></td></tr> 1346 1347 1348<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> 1349<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1350 1351Given: 1352 auto n = 4; 1353 int v[] = { 2, 3 } 1354 for (auto i : v) { } 1355autoType() 1356 matches "auto n" and "auto i" 1357</pre></td></tr> 1358 1359 1360<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> 1361<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1362"void (^)(int)". 1363 1364The pointee is always required to be a FunctionType. 1365</pre></td></tr> 1366 1367 1368<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> 1369<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1370 1371Given 1372 struct A {}; 1373 A a; 1374 int b; 1375 float c; 1376 bool d; 1377builtinType() 1378 matches "int b", "float c" and "bool d" 1379</pre></td></tr> 1380 1381 1382<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> 1383<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1384 1385Given 1386 _Complex float f; 1387complexType() 1388 matches "_Complex float f" 1389</pre></td></tr> 1390 1391 1392<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> 1393<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1394 1395Given 1396 void() { 1397 int a[2]; 1398 int b[] = { 2, 3 }; 1399 int c[b[0]]; 1400 } 1401constantArrayType() 1402 matches "int a[2]" 1403</pre></td></tr> 1404 1405 1406<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 1407<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1408Example matches i[] in declaration of f. 1409 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1410Example matches i[1]. 1411 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1412 void f(int i[]) { 1413 i[1] = 0; 1414 } 1415</pre></td></tr> 1416 1417 1418<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> 1419<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1420 1421Given 1422 template<typename T, int Size> 1423 class array { 1424 T data[Size]; 1425 }; 1426dependentSizedArrayType 1427 matches "T data[Size]" 1428</pre></td></tr> 1429 1430 1431<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> 1432<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1433qualified name. 1434 1435Given 1436 namespace N { 1437 namespace M { 1438 class D {}; 1439 } 1440 } 1441 class C {}; 1442 1443 class C c; 1444 N::M::D d; 1445 1446elaboratedType() matches the type of the variable declarations of both 1447c and d. 1448</pre></td></tr> 1449 1450 1451<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 1452<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 1453 1454Given 1455 enum C { Green }; 1456 enum S { Red }; 1457 1458 C c; 1459 S s; 1460 1461enumType() matches the type of the variable declarations of both c and 1462s. 1463</pre></td></tr> 1464 1465 1466<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 1467<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 1468 1469Given 1470 int (*f)(int); 1471 void g(); 1472functionProtoType() 1473 matches "int (*f)(int)" and the type of "g" in C++ mode. 1474 In C mode, "g" is not matched because it does not contain a prototype. 1475</pre></td></tr> 1476 1477 1478<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> 1479<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1480 1481Given 1482 int (*f)(int); 1483 void g(); 1484functionType() 1485 matches "int (*f)(int)" and the type of "g". 1486</pre></td></tr> 1487 1488 1489<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> 1490<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1491 1492Given 1493 int a[] = { 2, 3 }; 1494 int b[42]; 1495 void f(int c[]) { int d[a[0]]; }; 1496incompleteArrayType() 1497 matches "int a[]" and "int c[]" 1498</pre></td></tr> 1499 1500 1501<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 1502<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1503 1504Example matches S s, but not S<T> s. 1505 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1506 template <typename T> struct S { 1507 void f(S s); 1508 void g(S<T> s); 1509 }; 1510</pre></td></tr> 1511 1512 1513<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> 1514<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1515 1516Given: 1517 int *a; 1518 int &b = *a; 1519 int &&c = 1; 1520 auto &d = b; 1521 auto &&e = c; 1522 auto &&f = 2; 1523 int g = 5; 1524 1525lValueReferenceType() matches the types of b, d, and e. e is 1526matched since the type is deduced as int& by reference collapsing rules. 1527</pre></td></tr> 1528 1529 1530<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> 1531<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1532Given 1533 struct A { int i; } 1534 A::* ptr = A::i; 1535memberPointerType() 1536 matches "A::* ptr" 1537</pre></td></tr> 1538 1539 1540<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 1541<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1542a pointer type, despite being syntactically similar. 1543 1544Given 1545 int *a; 1546 1547 @interface Foo 1548 @end 1549 Foo *f; 1550pointerType() 1551 matches "Foo *f", but does not match "int *a". 1552</pre></td></tr> 1553 1554 1555<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> 1556<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1557 1558Given 1559 int (*ptr_to_array)[4]; 1560 int *array_of_ptrs[4]; 1561 1562varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1563array_of_ptrs. 1564</pre></td></tr> 1565 1566 1567<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> 1568<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1569types. 1570 1571Given 1572 int *a; 1573 int &b = *a; 1574 int c = 5; 1575 1576 @interface Foo 1577 @end 1578 Foo *f; 1579pointerType() 1580 matches "int *a", but does not match "Foo *f". 1581</pre></td></tr> 1582 1583 1584<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> 1585<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1586 1587Given: 1588 int *a; 1589 int &b = *a; 1590 int &&c = 1; 1591 auto &d = b; 1592 auto &&e = c; 1593 auto &&f = 2; 1594 int g = 5; 1595 1596rValueReferenceType() matches the types of c and f. e is not 1597matched as it is deduced to int& by reference collapsing rules. 1598</pre></td></tr> 1599 1600 1601<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> 1602<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1603 1604Given 1605 class C {}; 1606 struct S {}; 1607 1608 C c; 1609 S s; 1610 1611recordType() matches the type of the variable declarations of both c 1612and s. 1613</pre></td></tr> 1614 1615 1616<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> 1617<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 1618 1619Given 1620 int *a; 1621 int &b = *a; 1622 int &&c = 1; 1623 auto &d = b; 1624 auto &&e = c; 1625 auto &&f = 2; 1626 int g = 5; 1627 1628referenceType() matches the types of b, c, d, e, and f. 1629</pre></td></tr> 1630 1631 1632<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 1633<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 1634template type parameter. 1635 1636Given 1637 template <typename T> 1638 void F(T t) { 1639 int i = 1 + t; 1640 } 1641 1642substTemplateTypeParmType() matches the type of 't' but not '1' 1643</pre></td></tr> 1644 1645 1646<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> 1647<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 1648 1649Given 1650 template <typename T> 1651 class C { }; 1652 1653 template class C<int>; A 1654 C<char> var; B 1655 1656templateSpecializationType() matches the type of the explicit 1657instantiation in A and the type of the variable declaration in B. 1658</pre></td></tr> 1659 1660 1661<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 1662<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 1663 1664Example matches T, but not int. 1665 (matcher = templateTypeParmType()) 1666 template <typename T> void f(int i); 1667</pre></td></tr> 1668 1669 1670<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> 1671<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 1672</pre></td></tr> 1673 1674 1675<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> 1676<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 1677 1678Given 1679 typedef int X; 1680typedefType() 1681 matches "typedef int X" 1682</pre></td></tr> 1683 1684 1685<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 1686<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 1687 1688Given: 1689 typedef __underlying_type(T) type; 1690unaryTransformType() 1691 matches "__underlying_type(T)" 1692</pre></td></tr> 1693 1694 1695<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> 1696<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 1697integer-constant-expression. 1698 1699Given 1700 void f() { 1701 int a[] = { 2, 3 } 1702 int b[42]; 1703 int c[a[0]]; 1704 } 1705variableArrayType() 1706 matches "int c[a[0]]" 1707</pre></td></tr> 1708 1709<!--END_DECL_MATCHERS --> 1710</table> 1711 1712<!-- ======================================================================= --> 1713<h2 id="narrowing-matchers">Narrowing Matchers</h2> 1714<!-- ======================================================================= --> 1715 1716<p>Narrowing matchers match certain attributes on the current node, thus 1717narrowing down the set of nodes of the current type to match on.</p> 1718 1719<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 1720which allow users to create more powerful match expressions.</p> 1721 1722<table> 1723<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 1724<!-- START_NARROWING_MATCHERS --> 1725 1726<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1727<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 1728 1729Usable as: Any Matcher 1730</pre></td></tr> 1731 1732 1733<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1734<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 1735 1736Usable as: Any Matcher 1737</pre></td></tr> 1738 1739 1740<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 1741<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 1742 1743Useful when another matcher requires a child matcher, but there's no 1744additional constraint. This will often be used with an explicit conversion 1745to an internal::Matcher<> type such as TypeMatcher. 1746 1747Example: DeclarationMatcher(anything()) matches all declarations, e.g., 1748"int* p" and "void f()" in 1749 int* p; 1750 void f(); 1751 1752Usable as: Any Matcher 1753</pre></td></tr> 1754 1755 1756<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 1757<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 1758 1759Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 1760 class X {}; 1761 class Y {}; 1762 1763Usable as: Any Matcher 1764</pre></td></tr> 1765 1766 1767<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> 1768<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 1769unary). 1770 1771Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 1772 !(a || b) 1773</pre></td></tr> 1774 1775 1776<tr><td>Matcher<CXXBoolLiteral></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr> 1777<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value. 1778 1779Example matches true (matcher = cxxBoolLiteral(equals(true))) 1780 true 1781 1782Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1783 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>> 1784</pre></td></tr> 1785 1786 1787<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr> 1788<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 1789 1790Given 1791 try { 1792 ... 1793 } catch (int) { 1794 ... 1795 } catch (...) { 1796 ... 1797 } 1798endcode 1799cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 1800</pre></td></tr> 1801 1802 1803<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 1804<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 1805a specific number of arguments (including absent default arguments). 1806 1807Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 1808 void f(int x, int y); 1809 f(0, 0); 1810</pre></td></tr> 1811 1812 1813<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr> 1814<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 1815</pre></td></tr> 1816 1817 1818<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 1819<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 1820zero initialization. 1821 1822Given 1823void foo() { 1824 struct point { double x; double y; }; 1825 point pt[2] = { { 1.0, 2.0 } }; 1826} 1827initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 1828will match the implicit array filler for pt[1]. 1829</pre></td></tr> 1830 1831 1832<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr> 1833<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 1834 1835Given 1836 struct S { 1837 S(); #1 1838 S(const S &); #2 1839 S(S &&); #3 1840 }; 1841cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 1842</pre></td></tr> 1843 1844 1845<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 1846<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 1847 1848Given 1849 struct S { 1850 S(); #1 1851 S(const S &); #2 1852 S(S &&); #3 1853 }; 1854cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 1855</pre></td></tr> 1856 1857 1858<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 1859<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 1860 1861Given 1862 struct S { 1863 S(); #1 1864 S(int) {} #2 1865 S(S &&) : S() {} #3 1866 }; 1867 S::S() : S(0) {} #4 1868cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 1869#1 or #2. 1870</pre></td></tr> 1871 1872 1873<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 1874<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with 1875the explicit keyword. 1876 1877Given 1878 struct S { 1879 S(int); #1 1880 explicit S(double); #2 1881 operator int(); #3 1882 explicit operator bool(); #4 1883 }; 1884cxxConstructorDecl(isExplicit()) will match #2, but not #1. 1885cxxConversionDecl(isExplicit()) will match #4, but not #3. 1886</pre></td></tr> 1887 1888 1889<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr> 1890<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 1891 1892Given 1893 struct S { 1894 S(); #1 1895 S(const S &); #2 1896 S(S &&); #3 1897 }; 1898cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 1899</pre></td></tr> 1900 1901 1902<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr> 1903<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with 1904the explicit keyword. 1905 1906Given 1907 struct S { 1908 S(int); #1 1909 explicit S(double); #2 1910 operator int(); #3 1911 explicit operator bool(); #4 1912 }; 1913cxxConstructorDecl(isExplicit()) will match #2, but not #1. 1914cxxConversionDecl(isExplicit()) will match #4, but not #3. 1915</pre></td></tr> 1916 1917 1918<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr> 1919<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 1920opposed to a member. 1921 1922Given 1923 struct B {}; 1924 struct D : B { 1925 int I; 1926 D(int i) : I(i) {} 1927 }; 1928 struct E : B { 1929 E() : B() {} 1930 }; 1931cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 1932 will match E(), but not match D(int). 1933</pre></td></tr> 1934 1935 1936<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr> 1937<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 1938opposed to a base. 1939 1940Given 1941 struct B {}; 1942 struct D : B { 1943 int I; 1944 D(int i) : I(i) {} 1945 }; 1946 struct E : B { 1947 E() : B() {} 1948 }; 1949cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 1950 will match D(int), but not match E(). 1951</pre></td></tr> 1952 1953 1954<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> 1955<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 1956code (as opposed to implicitly added by the compiler). 1957 1958Given 1959 struct Foo { 1960 Foo() { } 1961 Foo(int) : foo_("A") { } 1962 string foo_; 1963 }; 1964cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 1965 will match Foo(int), but not Foo() 1966</pre></td></tr> 1967 1968 1969<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> 1970<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 1971 1972Given 1973struct A { 1974 void foo() const; 1975 void bar(); 1976}; 1977 1978cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 1979</pre></td></tr> 1980 1981 1982<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 1983<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 1984operator. 1985 1986Given 1987struct A { 1988 A &operator=(const A &); 1989 A &operator=(A &&); 1990}; 1991 1992cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 1993the second one. 1994</pre></td></tr> 1995 1996 1997<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 1998<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 1999 2000Given: 2001 class A final {}; 2002 2003 struct B { 2004 virtual void f(); 2005 }; 2006 2007 struct C : B { 2008 void f() final; 2009 }; 2010matches A and C::f, but not B, C, or B::f 2011</pre></td></tr> 2012 2013 2014<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 2015<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2016operator. 2017 2018Given 2019struct A { 2020 A &operator=(const A &); 2021 A &operator=(A &&); 2022}; 2023 2024cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2025the first one. 2026</pre></td></tr> 2027 2028 2029<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> 2030<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2031 2032Given 2033 class A { 2034 public: 2035 virtual void x(); 2036 }; 2037 class B : public A { 2038 public: 2039 virtual void x(); 2040 }; 2041 matches B::x 2042</pre></td></tr> 2043 2044 2045<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 2046<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2047 2048Given 2049 class A { 2050 public: 2051 virtual void x() = 0; 2052 }; 2053 matches A::x 2054</pre></td></tr> 2055 2056 2057<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 2058<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2059 2060Given 2061 struct S { 2062 S(); #1 2063 S(const S &) = default; #2 2064 S(S &&) = delete; #3 2065 }; 2066cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2067</pre></td></tr> 2068 2069 2070<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> 2071<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual. 2072 2073Given 2074 class A { 2075 public: 2076 virtual void x(); 2077 }; 2078 matches A::x 2079</pre></td></tr> 2080 2081 2082<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 2083<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2084 2085Given 2086 class A { 2087 public: 2088 virtual void x(); 2089 }; 2090 class B : public A { 2091 public: 2092 void x(); 2093 }; 2094 matches A::x but not B::x 2095</pre></td></tr> 2096 2097 2098<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> 2099<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2100 2101Matches overloaded operator names specified in strings without the 2102"operator" prefix: e.g. "<<". 2103 2104Given: 2105 class A { int operator*(); }; 2106 const A &operator<<(const A &a, const A &b); 2107 A a; 2108 a << a; <-- This matches 2109 2110cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2111specified line and 2112cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2113matches the declaration of A. 2114 2115Usable 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_1FunctionDecl.html">FunctionDecl</a>> 2116</pre></td></tr> 2117 2118 2119<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>std::string BaseName</td></tr> 2120<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2121</pre></td></tr> 2122 2123 2124<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> 2125<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2126static member variable template instantiations. 2127 2128Given 2129 template<typename T> void A(T t) { } 2130 template<> void A(int N) { } 2131functionDecl(isExplicitTemplateSpecialization()) 2132 matches the specialization A<int>(). 2133 2134Usable 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>> 2135</pre></td></tr> 2136 2137 2138<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr> 2139<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2140 2141Given: 2142 class A final {}; 2143 2144 struct B { 2145 virtual void f(); 2146 }; 2147 2148 struct C : B { 2149 void f() final; 2150 }; 2151matches A and C::f, but not B, C, or B::f 2152</pre></td></tr> 2153 2154 2155<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 2156<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2157 2158Given: 2159 auto x = []{}; 2160 2161cxxRecordDecl(isLambda()) matches the implicit class declaration of 2162decltype(x) 2163</pre></td></tr> 2164 2165 2166<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>std::string BaseName</td></tr> 2167<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for 2168isSameOrDerivedFrom(hasName(...)). 2169</pre></td></tr> 2170 2171 2172<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> 2173<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2174member variable template instantiations. 2175 2176Given 2177 template <typename T> class X {}; class A {}; X<A> x; 2178or 2179 template <typename T> class X {}; class A {}; template class X<A>; 2180cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2181 matches the template instantiation of X<A>. 2182 2183But given 2184 template <typename T> class X {}; class A {}; 2185 template <> class X<A> {}; X<A> x; 2186cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2187 does not match, as X<A> is an explicit template specialization. 2188 2189Usable 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>> 2190</pre></td></tr> 2191 2192 2193<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> 2194<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2195a specific number of arguments (including absent default arguments). 2196 2197Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2198 void f(int x, int y); 2199 f(0, 0); 2200</pre></td></tr> 2201 2202 2203<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 2204<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2205 2206Example: matches the implicit cast around 0 2207(matcher = castExpr(hasCastKind(CK_NullToPointer))) 2208 int *p = 0; 2209</pre></td></tr> 2210 2211 2212<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> 2213<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value. 2214 2215Example matches true (matcher = cxxBoolLiteral(equals(true))) 2216 true 2217 2218Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2219 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>> 2220</pre></td></tr> 2221 2222 2223<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 2224<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2225 2226Given 2227 template<typename T> struct C {}; 2228 C<int> c; 2229classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2230 matches C<int>. 2231</pre></td></tr> 2232 2233 2234<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> 2235<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2236child statements. 2237 2238Example: Given 2239 { for (;;) {} } 2240compoundStmt(statementCountIs(0))) 2241 matches '{}' 2242 but does not match the outer compound statement. 2243</pre></td></tr> 2244 2245 2246<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> 2247<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2248 2249Given 2250 int a[42]; 2251 int b[2 * 21]; 2252 int c[41], d[43]; 2253 char *s = "abcd"; 2254 wchar_t *ws = L"abcd"; 2255 char *w = "a"; 2256constantArrayType(hasSize(42)) 2257 matches "int a[42]" and "int b[2 * 21]" 2258stringLiteral(hasSize(4)) 2259 matches "abcd", L"abcd" 2260</pre></td></tr> 2261 2262 2263<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> 2264<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2265declarations. 2266 2267Example: Given 2268 int a, b; 2269 int c; 2270 int d = 2, e; 2271declCountIs(2) 2272 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 2273</pre></td></tr> 2274 2275 2276<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 2277<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 2278 2279Matches a node if it equals the node previously bound to ID. 2280 2281Given 2282 class X { int a; int b; }; 2283cxxRecordDecl( 2284 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2285 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2286 matches the class X, as a and b have the same type. 2287 2288Note that when multiple matches are involved via forEach* matchers, 2289equalsBoundNodes acts as a filter. 2290For example: 2291compoundStmt( 2292 forEachDescendant(varDecl().bind("d")), 2293 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2294will trigger a match for each combination of variable declaration 2295and reference to that variable declaration within a compound statement. 2296</pre></td></tr> 2297 2298 2299<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>const Decl* Other</td></tr> 2300<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 2301 2302Decl has pointer identity in the AST. 2303</pre></td></tr> 2304 2305 2306<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr> 2307<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 2308 2309Given 2310 __attribute__((device)) void f() { ... } 2311decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 2312f. If the matcher is use from clang-query, attr::Kind parameter should be 2313passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 2314</pre></td></tr> 2315 2316 2317<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 2318<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 2319partially matching a given regex. 2320 2321Example matches Y but not X 2322 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2323 #include "ASTMatcher.h" 2324 class X {}; 2325ASTMatcher.h: 2326 class Y {}; 2327 2328Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2329</pre></td></tr> 2330 2331 2332<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr> 2333<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 2334 2335Example matches X but not Y 2336 (matcher = cxxRecordDecl(isExpansionInMainFile()) 2337 #include <Y.h> 2338 class X {}; 2339Y.h: 2340 class Y {}; 2341 2342Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2343</pre></td></tr> 2344 2345 2346<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 2347<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 2348 2349Example matches Y but not X 2350 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2351 #include <SystemHeader.h> 2352 class X {}; 2353SystemHeader.h: 2354 class Y {}; 2355 2356Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2357</pre></td></tr> 2358 2359 2360<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr> 2361<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 2362by the compiler (eg. implicit defaultcopy constructors). 2363</pre></td></tr> 2364 2365 2366<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> 2367<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. 2368 2369Given 2370 class C { 2371 public: int a; 2372 protected: int b; 2373 private: int c; 2374 }; 2375fieldDecl(isPrivate()) 2376 matches 'int c;' 2377</pre></td></tr> 2378 2379 2380<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> 2381<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations. 2382 2383Given 2384 class C { 2385 public: int a; 2386 protected: int b; 2387 private: int c; 2388 }; 2389fieldDecl(isProtected()) 2390 matches 'int b;' 2391</pre></td></tr> 2392 2393 2394<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> 2395<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations. 2396 2397Given 2398 class C { 2399 public: int a; 2400 protected: int b; 2401 private: int c; 2402 }; 2403fieldDecl(isPublic()) 2404 matches 'int a;' 2405</pre></td></tr> 2406 2407 2408<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr> 2409<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 2410a specific number of designators. 2411 2412Example: Given 2413 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 2414 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 2415designatorCountIs(2) 2416 matches '{ [2].y = 1.0, [0].x = 1.0 }', 2417 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 2418</pre></td></tr> 2419 2420 2421<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> 2422<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value. 2423 2424Example matches true (matcher = cxxBoolLiteral(equals(true))) 2425 true 2426 2427Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2428 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>> 2429</pre></td></tr> 2430 2431 2432<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 2433<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 2434 2435Given: 2436 void f(); 2437 void g() noexcept; 2438 void h() noexcept(true); 2439 void i() noexcept(false); 2440 void j() throw(); 2441 void k() throw(int); 2442 void l() throw(...); 2443functionDecl(hasDynamicExceptionSpec()) and 2444 functionProtoType(hasDynamicExceptionSpec()) 2445 match the declarations of j, k, and l, but not f, g, h, or i. 2446</pre></td></tr> 2447 2448 2449<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 2450<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 2451 2452Matches overloaded operator names specified in strings without the 2453"operator" prefix: e.g. "<<". 2454 2455Given: 2456 class A { int operator*(); }; 2457 const A &operator<<(const A &a, const A &b); 2458 A a; 2459 a << a; <-- This matches 2460 2461cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2462specified line and 2463cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2464matches the declaration of A. 2465 2466Usable 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_1FunctionDecl.html">FunctionDecl</a>> 2467</pre></td></tr> 2468 2469 2470<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> 2471<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations. 2472 2473Given: 2474 constexpr int foo = 42; 2475 constexpr int bar(); 2476varDecl(isConstexpr()) 2477 matches the declaration of foo. 2478functionDecl(isConstexpr()) 2479 matches the declaration of bar. 2480</pre></td></tr> 2481 2482 2483<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 2484<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 2485 2486Given: 2487 class A { ~A(); }; 2488 class B { ~B() = default; }; 2489functionDecl(isDefaulted()) 2490 matches the declaration of ~B, but not ~A. 2491</pre></td></tr> 2492 2493 2494<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> 2495<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 2496 2497Example matches A, va, fa 2498 class A {}; 2499 class B; Doesn't match, as it has no body. 2500 int va; 2501 extern int vb; Doesn't match, as it doesn't define the variable. 2502 void fa() {} 2503 void fb(); Doesn't match, as it has no body. 2504 2505Usable 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>> 2506</pre></td></tr> 2507 2508 2509<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr> 2510<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 2511 2512Given: 2513 void Func(); 2514 void DeletedFunc() = delete; 2515functionDecl(isDeleted()) 2516 matches the declaration of DeletedFunc, but not Func. 2517</pre></td></tr> 2518 2519 2520<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> 2521<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 2522static member variable template instantiations. 2523 2524Given 2525 template<typename T> void A(T t) { } 2526 template<> void A(int N) { } 2527functionDecl(isExplicitTemplateSpecialization()) 2528 matches the specialization A<int>(). 2529 2530Usable 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>> 2531</pre></td></tr> 2532 2533 2534<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> 2535<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations. 2536 2537Given: 2538 extern "C" void f() {} 2539 extern "C" { void g() {} } 2540 void h() {} 2541functionDecl(isExternC()) 2542 matches the declaration of f and g, but not the declaration h 2543</pre></td></tr> 2544 2545 2546<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> 2547<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 2548the inline keyword. 2549 2550Given 2551 inline void f(); 2552 void g(); 2553 namespace n { 2554 inline namespace m {} 2555 } 2556functionDecl(isInline()) will match ::f(). 2557namespaceDecl(isInline()) will match n::m. 2558</pre></td></tr> 2559 2560 2561<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 2562<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 2563 2564Given: 2565 void f(); 2566 void g() noexcept; 2567 void h() throw(); 2568 void i() throw(int); 2569 void j() noexcept(false); 2570functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2571 match the declarations of g, and h, but not f, i or j. 2572</pre></td></tr> 2573 2574 2575<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> 2576<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 2577member variable template instantiations. 2578 2579Given 2580 template <typename T> class X {}; class A {}; X<A> x; 2581or 2582 template <typename T> class X {}; class A {}; template class X<A>; 2583cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2584 matches the template instantiation of X<A>. 2585 2586But given 2587 template <typename T> class X {}; class A {}; 2588 template <> class X<A> {}; X<A> x; 2589cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2590 does not match, as X<A> is an explicit template specialization. 2591 2592Usable 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>> 2593</pre></td></tr> 2594 2595 2596<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr> 2597<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 2598 2599Example matches f, but not g or h. The function i will not match, even when 2600compiled in C mode. 2601 void f(...); 2602 void g(int); 2603 template <typename... Ts> void h(Ts...); 2604 void i(); 2605</pre></td></tr> 2606 2607 2608<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> 2609<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2610specific parameter count. 2611 2612Given 2613 void f(int i) {} 2614 void g(int i, int j) {} 2615 void h(int i, int j); 2616 void j(int i); 2617 void k(int x, int y, int z, ...); 2618functionDecl(parameterCountIs(2)) 2619 matches void g(int i, int j) {} 2620functionProtoType(parameterCountIs(2)) 2621 matches void h(int i, int j) 2622functionProtoType(parameterCountIs(3)) 2623 matches void k(int x, int y, int z, ...); 2624</pre></td></tr> 2625 2626 2627<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 2628<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 2629 2630Given: 2631 void f(); 2632 void g() noexcept; 2633 void h() noexcept(true); 2634 void i() noexcept(false); 2635 void j() throw(); 2636 void k() throw(int); 2637 void l() throw(...); 2638functionDecl(hasDynamicExceptionSpec()) and 2639 functionProtoType(hasDynamicExceptionSpec()) 2640 match the declarations of j, k, and l, but not f, g, h, or i. 2641</pre></td></tr> 2642 2643 2644<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 2645<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 2646 2647Given: 2648 void f(); 2649 void g() noexcept; 2650 void h() throw(); 2651 void i() throw(int); 2652 void j() noexcept(false); 2653functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2654 match the declarations of g, and h, but not f, i or j. 2655</pre></td></tr> 2656 2657 2658<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 2659<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2660specific parameter count. 2661 2662Given 2663 void f(int i) {} 2664 void g(int i, int j) {} 2665 void h(int i, int j); 2666 void j(int i); 2667 void k(int x, int y, int z, ...); 2668functionDecl(parameterCountIs(2)) 2669 matches void g(int i, int j) {} 2670functionProtoType(parameterCountIs(2)) 2671 matches void h(int i, int j) 2672functionProtoType(parameterCountIs(3)) 2673 matches void k(int x, int y, int z, ...); 2674</pre></td></tr> 2675 2676 2677<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> 2678<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value. 2679 2680Example matches true (matcher = cxxBoolLiteral(equals(true))) 2681 true 2682 2683Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2684 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>> 2685</pre></td></tr> 2686 2687 2688<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> 2689<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 2690to '.'. 2691 2692Member calls on the implicit this pointer match as called with '->'. 2693 2694Given 2695 class Y { 2696 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2697 int a; 2698 static int b; 2699 }; 2700memberExpr(isArrow()) 2701 matches this->x, x, y.x, a, this->b 2702</pre></td></tr> 2703 2704 2705<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> 2706<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 2707 2708Supports specifying enclosing namespaces or classes by prefixing the name 2709with '<enclosing>::'. 2710Does not match typedefs of an underlying type with the given name. 2711 2712Example matches X (Name == "X") 2713 class X; 2714 2715Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 2716 namespace a { namespace b { class X; } } 2717</pre></td></tr> 2718 2719 2720<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> 2721<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 2722a substring matched by the given RegExp. 2723 2724Supports specifying enclosing namespaces or classes by 2725prefixing the name with '<enclosing>::'. Does not match typedefs 2726of an underlying type with the given name. 2727 2728Example matches X (regexp == "::X") 2729 class X; 2730 2731Example matches X (regexp is one of "::X", "^foo::.*X", among others) 2732 namespace foo { namespace bar { class X; } } 2733</pre></td></tr> 2734 2735 2736<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr> 2737<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 2738 2739Given 2740 namespace n { 2741 namespace {} #1 2742 } 2743namespaceDecl(isAnonymous()) will match #1 but not ::n. 2744</pre></td></tr> 2745 2746 2747<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr> 2748<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 2749the inline keyword. 2750 2751Given 2752 inline void f(); 2753 void g(); 2754 namespace n { 2755 inline namespace m {} 2756 } 2757functionDecl(isInline()) will match ::f(). 2758namespaceDecl(isInline()) will match n::m. 2759</pre></td></tr> 2760 2761 2762<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2763<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 2764a specific number of arguments (including absent default arguments). 2765 2766Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2767 void f(int x, int y); 2768 f(0, 0); 2769</pre></td></tr> 2770 2771 2772<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr> 2773<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 2774 2775objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 2776message expression in 2777 2778 UIWebView *webView = ...; 2779 CGRect bodyFrame = webView.frame; 2780 bodyFrame.size.height = self.bodyContentHeight; 2781 webView.frame = bodyFrame; 2782 ^---- matches here 2783</pre></td></tr> 2784 2785 2786<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr> 2787<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 2788 2789Matches only when the selector of the objCMessageExpr is NULL. This may 2790represent an error condition in the tree! 2791</pre></td></tr> 2792 2793 2794<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr> 2795<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 2796 2797 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 2798 matches the outer message expr in the code below, but NOT the message 2799 invocation for self.bodyView. 2800 [self.bodyView loadHTMLString:html baseURL:NULL]; 2801</pre></td></tr> 2802 2803 2804<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr> 2805<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 2806 2807 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 2808 matches self.bodyView in the code below, but NOT the outer message 2809 invocation of "loadHTMLString:baseURL:". 2810 [self.bodyView loadHTMLString:html baseURL:NULL]; 2811</pre></td></tr> 2812 2813 2814<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr> 2815<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 2816a substring matched by the given RegExp. 2817 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 2818 invocation for self.bodyView. 2819 [self.bodyView loadHTMLString:html baseURL:NULL]; 2820</pre></td></tr> 2821 2822 2823<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr> 2824<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 2825 2826 matcher = objCMessageExpr(numSelectorArgs(0)); 2827 matches self.bodyView in the code below 2828 2829 matcher = objCMessageExpr(numSelectorArgs(2)); 2830 matches the invocation of "loadHTMLString:baseURL:" but not that 2831 of self.bodyView 2832 [self.bodyView loadHTMLString:html baseURL:NULL]; 2833</pre></td></tr> 2834 2835 2836<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> 2837<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 2838 2839Given 2840 class Y { public: void x(); }; 2841 void z() { Y* y; y->x(); } 2842cxxMemberCallExpr(on(hasType(asString("class Y *")))) 2843 matches y->x() 2844</pre></td></tr> 2845 2846 2847<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 2848<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 2849 2850Matches a node if it equals the node previously bound to ID. 2851 2852Given 2853 class X { int a; int b; }; 2854cxxRecordDecl( 2855 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2856 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2857 matches the class X, as a and b have the same type. 2858 2859Note that when multiple matches are involved via forEach* matchers, 2860equalsBoundNodes acts as a filter. 2861For example: 2862compoundStmt( 2863 forEachDescendant(varDecl().bind("d")), 2864 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2865will trigger a match for each combination of variable declaration 2866and reference to that variable declaration within a compound statement. 2867</pre></td></tr> 2868 2869 2870<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> 2871<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 2872the node, not hidden within a typedef. 2873 2874Given 2875 typedef const int const_int; 2876 const_int i; 2877 int *const j; 2878 int *volatile k; 2879 int m; 2880varDecl(hasType(hasLocalQualifiers())) matches only j and k. 2881i is const-qualified but the qualifier is not local. 2882</pre></td></tr> 2883 2884 2885<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 2886<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 2887 2888Given 2889 void a(char); 2890 void b(wchar_t); 2891 void c(double); 2892functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 2893matches "a(char)", "b(wchar_t)", but not "c(double)". 2894</pre></td></tr> 2895 2896 2897<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr> 2898<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 2899the Objective-C object pointer type, which is different despite being 2900syntactically similar. 2901 2902Given 2903 int *i = nullptr; 2904 2905 @interface Foo 2906 @end 2907 Foo *f; 2908 2909 int j; 2910varDecl(hasType(isAnyPointer())) 2911 matches "int *i" and "Foo *f", but not "int j". 2912</pre></td></tr> 2913 2914 2915<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> 2916<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 2917include "top-level" const. 2918 2919Given 2920 void a(int); 2921 void b(int const); 2922 void c(const int); 2923 void d(const int*); 2924 void e(int const) {}; 2925functionDecl(hasAnyParameter(hasType(isConstQualified()))) 2926 matches "void b(int const)", "void c(const int)" and 2927 "void e(int const) {}". It does not match d as there 2928 is no top-level const on the parameter type "const int *". 2929</pre></td></tr> 2930 2931 2932<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> 2933<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 2934 2935Given 2936 void a(int); 2937 void b(long); 2938 void c(double); 2939functionDecl(hasAnyParameter(hasType(isInteger()))) 2940matches "a(int)", "b(long)", but not "c(double)". 2941</pre></td></tr> 2942 2943 2944<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr> 2945<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 2946include "top-level" volatile. 2947 2948Given 2949 void a(int); 2950 void b(int volatile); 2951 void c(volatile int); 2952 void d(volatile int*); 2953 void e(int volatile) {}; 2954functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 2955 matches "void b(int volatile)", "void c(volatile int)" and 2956 "void e(int volatile) {}". It does not match d as there 2957 is no top-level volatile on the parameter type "volatile int *". 2958</pre></td></tr> 2959 2960 2961<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 2962<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 2963 2964Example matches C, but not S or U. 2965 struct S {}; 2966 class C {}; 2967 union U {}; 2968</pre></td></tr> 2969 2970 2971<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 2972<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 2973 2974Example matches S, but not C or U. 2975 struct S {}; 2976 class C {}; 2977 union U {}; 2978</pre></td></tr> 2979 2980 2981<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 2982<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 2983 2984Example matches U, but not C or S. 2985 struct S {}; 2986 class C {}; 2987 union U {}; 2988</pre></td></tr> 2989 2990 2991<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 2992<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 2993 2994Matches a node if it equals the node previously bound to ID. 2995 2996Given 2997 class X { int a; int b; }; 2998cxxRecordDecl( 2999 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3000 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3001 matches the class X, as a and b have the same type. 3002 3003Note that when multiple matches are involved via forEach* matchers, 3004equalsBoundNodes acts as a filter. 3005For example: 3006compoundStmt( 3007 forEachDescendant(varDecl().bind("d")), 3008 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3009will trigger a match for each combination of variable declaration 3010and reference to that variable declaration within a compound statement. 3011</pre></td></tr> 3012 3013 3014<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>const Stmt* Other</td></tr> 3015<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 3016 3017Stmt has pointer identity in the AST. 3018</pre></td></tr> 3019 3020 3021<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 3022<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 3023partially matching a given regex. 3024 3025Example matches Y but not X 3026 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3027 #include "ASTMatcher.h" 3028 class X {}; 3029ASTMatcher.h: 3030 class Y {}; 3031 3032Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3033</pre></td></tr> 3034 3035 3036<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr> 3037<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 3038 3039Example matches X but not Y 3040 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3041 #include <Y.h> 3042 class X {}; 3043Y.h: 3044 class Y {}; 3045 3046Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3047</pre></td></tr> 3048 3049 3050<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3051<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 3052 3053Example matches Y but not X 3054 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3055 #include <SystemHeader.h> 3056 class X {}; 3057SystemHeader.h: 3058 class Y {}; 3059 3060Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3061</pre></td></tr> 3062 3063 3064<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr> 3065<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 3066 3067Given 3068 int a[42]; 3069 int b[2 * 21]; 3070 int c[41], d[43]; 3071 char *s = "abcd"; 3072 wchar_t *ws = L"abcd"; 3073 char *w = "a"; 3074constantArrayType(hasSize(42)) 3075 matches "int a[42]" and "int b[2 * 21]" 3076stringLiteral(hasSize(4)) 3077 matches "abcd", L"abcd" 3078</pre></td></tr> 3079 3080 3081<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> 3082<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 3083 3084Example matches A, va, fa 3085 class A {}; 3086 class B; Doesn't match, as it has no body. 3087 int va; 3088 extern int vb; Doesn't match, as it doesn't define the variable. 3089 void fa() {} 3090 void fb(); Doesn't match, as it has no body. 3091 3092Usable 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>> 3093</pre></td></tr> 3094 3095 3096<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 3097<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 3098 3099Note that 'Value' is a string as the template argument's value is 3100an arbitrary precision integer. 'Value' must be euqal to the canonical 3101representation of that integral value in base 10. 3102 3103Given 3104 template<int T> struct A {}; 3105 C<42> c; 3106classTemplateSpecializationDecl( 3107 hasAnyTemplateArgument(equalsIntegralValue("42"))) 3108 matches the implicit instantiation of C in C<42>. 3109</pre></td></tr> 3110 3111 3112<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr> 3113<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 3114 3115Given 3116 template<int T> struct A {}; 3117 C<42> c; 3118classTemplateSpecializationDecl( 3119 hasAnyTemplateArgument(isIntegral())) 3120 matches the implicit instantiation of C in C<42> 3121 with isIntegral() matching 42. 3122</pre></td></tr> 3123 3124 3125<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 3126<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 3127 3128Given 3129 template<typename T> struct C {}; 3130 C<int> c; 3131classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3132 matches C<int>. 3133</pre></td></tr> 3134 3135 3136<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 3137<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 3138partially matching a given regex. 3139 3140Example matches Y but not X 3141 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3142 #include "ASTMatcher.h" 3143 class X {}; 3144ASTMatcher.h: 3145 class Y {}; 3146 3147Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3148</pre></td></tr> 3149 3150 3151<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr> 3152<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 3153 3154Example matches X but not Y 3155 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3156 #include <Y.h> 3157 class X {}; 3158Y.h: 3159 class Y {}; 3160 3161Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3162</pre></td></tr> 3163 3164 3165<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3166<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 3167 3168Example matches Y but not X 3169 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3170 #include <SystemHeader.h> 3171 class X {}; 3172SystemHeader.h: 3173 class Y {}; 3174 3175Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3176</pre></td></tr> 3177 3178 3179<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr> 3180<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 3181 3182Given 3183 struct S { bool func(); }; 3184functionDecl(returns(booleanType())) 3185 matches "bool func();" 3186</pre></td></tr> 3187 3188 3189<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3190<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 3191 3192Matches a node if it equals the node previously bound to ID. 3193 3194Given 3195 class X { int a; int b; }; 3196cxxRecordDecl( 3197 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3198 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3199 matches the class X, as a and b have the same type. 3200 3201Note that when multiple matches are involved via forEach* matchers, 3202equalsBoundNodes acts as a filter. 3203For example: 3204compoundStmt( 3205 forEachDescendant(varDecl().bind("d")), 3206 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3207will trigger a match for each combination of variable declaration 3208and reference to that variable declaration within a compound statement. 3209</pre></td></tr> 3210 3211 3212<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr> 3213<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 3214 3215Type has pointer identity in the AST. 3216</pre></td></tr> 3217 3218 3219<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr> 3220<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 3221 3222Given 3223 int i; 3224 float f; 3225realFloatingPointType() 3226 matches "float f" but not "int i" 3227</pre></td></tr> 3228 3229 3230<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr> 3231<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 3232 3233Given 3234 struct S { void func(); }; 3235functionDecl(returns(voidType())) 3236 matches "void func();" 3237</pre></td></tr> 3238 3239 3240<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> 3241<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 3242 3243Given 3244 int x; 3245 int s = sizeof(x) + alignof(x) 3246unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 3247 matches sizeof(x) 3248</pre></td></tr> 3249 3250 3251<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> 3252<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3253unary). 3254 3255Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3256 !(a || b) 3257</pre></td></tr> 3258 3259 3260<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr> 3261<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 3262 3263Example matches x, but not y, z, or a. 3264(matcher = varDecl(hasAutomaticStorageDuration()) 3265void f() { 3266 int x; 3267 static int y; 3268 thread_local int z; 3269} 3270int a; 3271</pre></td></tr> 3272 3273 3274<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr> 3275<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 3276 3277Example matches y and z (matcher = varDecl(hasGlobalStorage()) 3278void f() { 3279 int x; 3280 static int y; 3281} 3282int z; 3283</pre></td></tr> 3284 3285 3286<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr> 3287<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 3288non-static local variable. 3289 3290Example matches x (matcher = varDecl(hasLocalStorage()) 3291void f() { 3292 int x; 3293 static int y; 3294} 3295int z; 3296</pre></td></tr> 3297 3298 3299<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr> 3300<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 3301 3302Example matches y and a, but not x or z. 3303(matcher = varDecl(hasStaticStorageDuration()) 3304void f() { 3305 int x; 3306 static int y; 3307 thread_local int z; 3308} 3309int a; 3310</pre></td></tr> 3311 3312 3313<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr> 3314<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 3315 3316Example matches z, but not x, z, or a. 3317(matcher = varDecl(hasThreadStorageDuration()) 3318void f() { 3319 int x; 3320 static int y; 3321 thread_local int z; 3322} 3323int a; 3324</pre></td></tr> 3325 3326 3327<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr> 3328<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. 3329 3330Given: 3331 constexpr int foo = 42; 3332 constexpr int bar(); 3333varDecl(isConstexpr()) 3334 matches the declaration of foo. 3335functionDecl(isConstexpr()) 3336 matches the declaration of bar. 3337</pre></td></tr> 3338 3339 3340<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> 3341<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 3342 3343Example matches A, va, fa 3344 class A {}; 3345 class B; Doesn't match, as it has no body. 3346 int va; 3347 extern int vb; Doesn't match, as it doesn't define the variable. 3348 void fa() {} 3349 void fb(); Doesn't match, as it has no body. 3350 3351Usable 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>> 3352</pre></td></tr> 3353 3354 3355<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr> 3356<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 3357a C++ catch block, or an Objective-C statement. 3358 3359Example matches x (matcher = varDecl(isExceptionVariable()) 3360void f(int y) { 3361 try { 3362 } catch (int x) { 3363 } 3364} 3365</pre></td></tr> 3366 3367 3368<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> 3369<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 3370static member variable template instantiations. 3371 3372Given 3373 template<typename T> void A(T t) { } 3374 template<> void A(int N) { } 3375functionDecl(isExplicitTemplateSpecialization()) 3376 matches the specialization A<int>(). 3377 3378Usable 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>> 3379</pre></td></tr> 3380 3381 3382<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> 3383<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 3384member variable template instantiations. 3385 3386Given 3387 template <typename T> class X {}; class A {}; X<A> x; 3388or 3389 template <typename T> class X {}; class A {}; template class X<A>; 3390cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3391 matches the template instantiation of X<A>. 3392 3393But given 3394 template <typename T> class X {}; class A {}; 3395 template <> class X<A> {}; X<A> x; 3396cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3397 does not match, as X<A> is an explicit template specialization. 3398 3399Usable 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>> 3400</pre></td></tr> 3401 3402 3403<tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr> 3404<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3405template instantiations. 3406 3407Given 3408 template<typename T> void A(T t) { T i; } 3409 A(0); 3410 A(0U); 3411functionDecl(isInstantiated()) 3412 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3413</pre></td></tr> 3414 3415 3416<tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr> 3417<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3418GNU's __null, C++11's nullptr, or C's NULL macro. 3419 3420Given: 3421 void *v1 = NULL; 3422 void *v2 = nullptr; 3423 void *v3 = __null; GNU extension 3424 char *cp = (char *)0; 3425 int *ip = 0; 3426 int i = 0; 3427expr(nullPointerConstant()) 3428 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3429 initializer for i. 3430</pre></td></tr> 3431 3432 3433<tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr> 3434<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3435 3436This matcher is only provided as a performance optimization of hasName. 3437 hasAnyName(a, b, c) 3438 is equivalent to, but faster than 3439 anyOf(hasName(a), hasName(b), hasName(c)) 3440</pre></td></tr> 3441 3442 3443<tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr> 3444<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 3445 3446Given 3447 int j; 3448 template<typename T> void A(T t) { T i; j += 42;} 3449 A(0); 3450 A(0U); 3451declStmt(isInTemplateInstantiation()) 3452 matches 'int i;' and 'unsigned i'. 3453unless(stmt(isInTemplateInstantiation())) 3454 will NOT match j += 42; as it's shared between the template definition and 3455 instantiation. 3456</pre></td></tr> 3457 3458<!--END_NARROWING_MATCHERS --> 3459</table> 3460 3461<!-- ======================================================================= --> 3462<h2 id="traversal-matchers">AST Traversal Matchers</h2> 3463<!-- ======================================================================= --> 3464 3465<p>Traversal matchers specify the relationship to other nodes that are 3466reachable from the current node.</p> 3467 3468<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 3469forEachDescendant) which work on all nodes and allow users to write more generic 3470match expressions.</p> 3471 3472<table> 3473<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 3474<!-- START_TRAVERSAL_MATCHERS --> 3475 3476<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 3477<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 3478 3479Unlike anyOf, eachOf will generate a match result for each 3480matching submatcher. 3481 3482For example, in: 3483 class A { int a; int b; }; 3484The matcher: 3485 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 3486 has(fieldDecl(hasName("b")).bind("v")))) 3487will generate two results binding "v", the first of which binds 3488the field declaration of a, the second the field declaration of 3489b. 3490 3491Usable as: Any Matcher 3492</pre></td></tr> 3493 3494 3495<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 3496<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3497provided matcher. 3498 3499Example matches X, A, B, C 3500 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 3501 class X {}; Matches X, because X::X is a class of name X inside X. 3502 class A { class X {}; }; 3503 class B { class C { class X {}; }; }; 3504 3505DescendantT must be an AST base type. 3506 3507As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 3508each result that matches instead of only on the first one. 3509 3510Note: Recursively combined ForEachDescendant can cause many matches: 3511 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 3512 forEachDescendant(cxxRecordDecl()) 3513 ))) 3514will match 10 times (plus injected class name matches) on: 3515 class A { class B { class C { class D { class E {}; }; }; }; }; 3516 3517Usable as: Any Matcher 3518</pre></td></tr> 3519 3520 3521<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 3522<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 3523provided matcher. 3524 3525Example matches X, Y 3526 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 3527 class X {}; Matches X, because X::X is a class of name X inside X. 3528 class Y { class X {}; }; 3529 class Z { class Y { class X {}; }; }; Does not match Z. 3530 3531ChildT must be an AST base type. 3532 3533As opposed to 'has', 'forEach' will cause a match for each result that 3534matches instead of only on the first one. 3535 3536Usable as: Any Matcher 3537</pre></td></tr> 3538 3539 3540<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 3541<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 3542matcher. 3543 3544Given 3545void f() { if (true) { int x = 42; } } 3546void g() { for (;;) { int x = 43; } } 3547expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 3548 3549Usable as: Any Matcher 3550</pre></td></tr> 3551 3552 3553<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 3554<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3555provided matcher. 3556 3557Example matches X, Y, Z 3558 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 3559 class X {}; Matches X, because X::X is a class of name X inside X. 3560 class Y { class X {}; }; 3561 class Z { class Y { class X {}; }; }; 3562 3563DescendantT must be an AST base type. 3564 3565Usable as: Any Matcher 3566</pre></td></tr> 3567 3568 3569<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 3570<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 3571provided matcher. 3572 3573Example matches X, Y 3574 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 3575 class X {}; Matches X, because X::X is a class of name X inside X. 3576 class Y { class X {}; }; 3577 class Z { class Y { class X {}; }; }; Does not match Z. 3578 3579ChildT must be an AST base type. 3580 3581Usable as: Any Matcher 3582Note that has is direct matcher, so it also matches things like implicit 3583casts and paren casts. If you are matching with expr then you should 3584probably consider using ignoringParenImpCasts like: 3585has(ignoringParenImpCasts(expr())). 3586</pre></td></tr> 3587 3588 3589<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 3590<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 3591matcher. 3592 3593Given 3594void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 3595compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 3596 3597Usable as: Any Matcher 3598</pre></td></tr> 3599 3600 3601<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3602<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 3603switch statement or conditional operator. 3604 3605Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 3606 if (true) {} 3607</pre></td></tr> 3608 3609 3610<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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> 3611<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 3612(binary or ternary). 3613 3614Example matches b 3615 condition ? a : b 3616 condition ?: b 3617</pre></td></tr> 3618 3619 3620<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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> 3621<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 3622 3623Example 1 (conditional ternary operator): matches a 3624 condition ? a : b 3625 3626Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 3627 condition ?: b 3628</pre></td></tr> 3629 3630 3631<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3632<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 3633matches the given matcher. 3634 3635The associated declaration is: 3636- for type nodes, the declaration of the underlying type 3637- for CallExpr, the declaration of the callee 3638- for MemberExpr, the declaration of the referenced member 3639- for CXXConstructExpr, the declaration of the constructor 3640 3641Also usable as Matcher<T> for any T supporting the getDecl() member 3642function. e.g. various subtypes of clang::Type and various expressions. 3643 3644Usable as: 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>>, 3645 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3646 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 3647 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3648 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3649 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3650</pre></td></tr> 3651 3652 3653<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> 3654<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 3655 3656Given 3657 int i[5]; 3658 void f() { i[1] = 42; } 3659arraySubscriptExpression(hasBase(implicitCastExpr( 3660 hasSourceExpression(declRefExpr())))) 3661 matches i[1] with the declRefExpr() matching i 3662</pre></td></tr> 3663 3664 3665<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> 3666<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 3667 3668Given 3669 int i[5]; 3670 void f() { i[1] = 42; } 3671arraySubscriptExpression(hasIndex(integerLiteral())) 3672 matches i[1] with the integerLiteral() matching 1 3673</pre></td></tr> 3674 3675 3676<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3677<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 3678 3679Example matches a (matcher = binaryOperator(hasLHS())) 3680 a || b 3681</pre></td></tr> 3682 3683 3684<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3685<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 3686 3687Example matches b (matcher = binaryOperator(hasRHS())) 3688 a || b 3689</pre></td></tr> 3690 3691 3692<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</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> 3693<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 3694type. 3695 3696Given 3697 struct A {}; 3698 A a[7]; 3699 int b[7]; 3700arrayType(hasElementType(builtinType())) 3701 matches "int b[7]" 3702 3703Usable 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>> 3704</pre></td></tr> 3705 3706 3707<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</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> 3708<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 3709type. 3710 3711Given 3712 struct A {}; 3713 A a[7]; 3714 int b[7]; 3715arrayType(hasElementType(builtinType())) 3716 matches "int b[7]" 3717 3718Usable 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>> 3719</pre></td></tr> 3720 3721 3722<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> 3723<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 3724 3725Given 3726 _Atomic(int) i; 3727 _Atomic(float) f; 3728atomicType(hasValueType(isInteger())) 3729 matches "_Atomic(int) i" 3730 3731Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3732</pre></td></tr> 3733 3734 3735<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> 3736<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 3737 3738Given 3739 _Atomic(int) i; 3740 _Atomic(float) f; 3741atomicType(hasValueType(isInteger())) 3742 matches "_Atomic(int) i" 3743 3744Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3745</pre></td></tr> 3746 3747 3748<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> 3749<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 3750 3751Note: There is no TypeLoc for the deduced type and thus no 3752getDeducedLoc() matcher. 3753 3754Given 3755 auto a = 1; 3756 auto b = 2.0; 3757autoType(hasDeducedType(isInteger())) 3758 matches "auto a" 3759 3760Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 3761</pre></td></tr> 3762 3763 3764<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> 3765<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 3766binary operator matches. 3767</pre></td></tr> 3768 3769 3770<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> 3771<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 3772 3773Example matches a (matcher = binaryOperator(hasLHS())) 3774 a || b 3775</pre></td></tr> 3776 3777 3778<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> 3779<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 3780 3781Example matches b (matcher = binaryOperator(hasRHS())) 3782 a || b 3783</pre></td></tr> 3784 3785 3786<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</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> 3787<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 3788pointee matches a given matcher. 3789 3790Given 3791 int *a; 3792 int const *b; 3793 float const *f; 3794pointerType(pointee(isConstQualified(), isInteger())) 3795 matches "int const *b" 3796 3797Usable 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>>, 3798 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>> 3799</pre></td></tr> 3800 3801 3802<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</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> 3803<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 3804pointee matches a given matcher. 3805 3806Given 3807 int *a; 3808 int const *b; 3809 float const *f; 3810pointerType(pointee(isConstQualified(), isInteger())) 3811 matches "int const *b" 3812 3813Usable 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>>, 3814 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>> 3815</pre></td></tr> 3816 3817 3818<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 3819<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 3820 3821Given 3822 void f(int i); 3823 int y; 3824 f(y); 3825callExpr(declRefExpr(to(varDecl(hasName("y")))), 3826parmVarDecl(hasType(isInteger()))) 3827 matches f(y); 3828with declRefExpr(...) 3829 matching int y 3830and parmVarDecl(...) 3831 matching int i 3832</pre></td></tr> 3833 3834 3835<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3836<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 3837expression. 3838 3839Given 3840 void x(int, int, int) { int y; x(1, y, 42); } 3841callExpr(hasAnyArgument(declRefExpr())) 3842 matches x(1, y, 42) 3843with hasAnyArgument(...) 3844 matching y 3845</pre></td></tr> 3846 3847 3848<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3849<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 3850call expression. 3851 3852Example matches y in x(y) 3853 (matcher = callExpr(hasArgument(0, declRefExpr()))) 3854 void x(int) { int y; x(y); } 3855</pre></td></tr> 3856 3857 3858<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3859<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 3860matches the given matcher. 3861 3862The associated declaration is: 3863- for type nodes, the declaration of the underlying type 3864- for CallExpr, the declaration of the callee 3865- for MemberExpr, the declaration of the referenced member 3866- for CXXConstructExpr, the declaration of the constructor 3867 3868Also usable as Matcher<T> for any T supporting the getDecl() member 3869function. e.g. various subtypes of clang::Type and various expressions. 3870 3871Usable as: 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>>, 3872 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3873 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 3874 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3875 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3876 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3877</pre></td></tr> 3878 3879 3880<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 3881<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 3882 3883Given 3884 class A { A() : i(42), j(42) {} int i; int j; }; 3885cxxConstructorDecl(forEachConstructorInitializer( 3886 forField(decl().bind("x")) 3887)) 3888 will trigger two matches, binding for 'i' and 'j' respectively. 3889</pre></td></tr> 3890 3891 3892<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> 3893<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 3894 3895Given 3896 struct Foo { 3897 Foo() : foo_(1) { } 3898 int foo_; 3899 }; 3900cxxRecordDecl(has(cxxConstructorDecl( 3901 hasAnyConstructorInitializer(anything()) 3902))) 3903 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 3904</pre></td></tr> 3905 3906 3907<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> 3908<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 3909 3910Given 3911 struct Foo { 3912 Foo() : foo_(1) { } 3913 int foo_; 3914 }; 3915cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3916 forField(hasName("foo_")))))) 3917 matches Foo 3918with forField matching foo_ 3919</pre></td></tr> 3920 3921 3922<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> 3923<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 3924 3925Given 3926 struct Foo { 3927 Foo() : foo_(1) { } 3928 int foo_; 3929 }; 3930cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3931 withInitializer(integerLiteral(equals(1))))))) 3932 matches Foo 3933with withInitializer matching (1) 3934</pre></td></tr> 3935 3936 3937<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3938<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 3939definition that has a given body. 3940 3941Given 3942 for (;;) {} 3943hasBody(compoundStmt()) 3944 matches 'for (;;) {}' 3945with compoundStmt() 3946 matching '{}' 3947</pre></td></tr> 3948 3949 3950<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 3951<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 3952 3953Example: 3954 forStmt(hasLoopVariable(anything())) 3955matches 'int x' in 3956 for (int x : a) { } 3957</pre></td></tr> 3958 3959 3960<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3961<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 3962 3963Example: 3964 forStmt(hasRangeInit(anything())) 3965matches 'a' in 3966 for (int x : a) { } 3967</pre></td></tr> 3968 3969 3970<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> 3971<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 3972 3973 3974<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> 3975<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 3976 3977Example matches y.x() 3978 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) 3979 class Y { public: void x(); }; 3980 void z() { Y y; y.x(); }", 3981 3982FIXME: Overload to allow directly matching types? 3983</pre></td></tr> 3984 3985 3986<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> 3987<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 3988</pre></td></tr> 3989 3990 3991<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 3992<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 3993matcher, or is a pointer to a type that matches the InnerMatcher. 3994</pre></td></tr> 3995 3996 3997<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 3998<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may 3999produce multiple matches. 4000 4001Given 4002 class A { virtual void f(); }; 4003 class B : public A { void f(); }; 4004 class C : public B { void f(); }; 4005cxxMethodDecl(ofClass(hasName("C")), 4006 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4007 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 4008 that B::f is not overridden by C::f). 4009 4010The check can produce multiple matches in case of multiple inheritance, e.g. 4011 class A1 { virtual void f(); }; 4012 class A2 { virtual void f(); }; 4013 class C : public A1, public A2 { void f(); }; 4014cxxMethodDecl(ofClass(hasName("C")), 4015 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4016 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 4017 once with "b" binding "A2::f" and "d" binding "C::f". 4018</pre></td></tr> 4019 4020 4021<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> 4022<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 4023belongs to. 4024 4025FIXME: Generalize this for other kinds of declarations. 4026FIXME: What other kind of declarations would we need to generalize 4027this to? 4028 4029Example matches A() in the last line 4030 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 4031 ofClass(hasName("A")))))) 4032 class A { 4033 public: 4034 A(); 4035 }; 4036 A a = A(); 4037</pre></td></tr> 4038 4039 4040<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> 4041<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 4042 4043Given: 4044 class A { void func(); }; 4045 class B { void member(); }; 4046 4047cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 4048A but not B. 4049</pre></td></tr> 4050 4051 4052<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> 4053<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 4054a class matching Base. 4055 4056Note that a class is not considered to be derived from itself. 4057 4058Example matches Y, Z, C (Base == hasName("X")) 4059 class X; 4060 class Y : public X {}; directly derived 4061 class Z : public Y {}; indirectly derived 4062 typedef X A; 4063 typedef A B; 4064 class C : public B {}; derived from a typedef of X 4065 4066In the following example, Bar matches isDerivedFrom(hasName("X")): 4067 class Foo; 4068 typedef Foo X; 4069 class Bar : public Foo {}; derived from a type that X is a typedef of 4070</pre></td></tr> 4071 4072 4073<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> 4074<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 4075match Base. 4076</pre></td></tr> 4077 4078 4079<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> 4080<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 4081given matcher. 4082 4083Example matches y.x() (matcher = callExpr(callee( 4084 cxxMethodDecl(hasName("x"))))) 4085 class Y { public: void x(); }; 4086 void z() { Y y; y.x(); } 4087</pre></td></tr> 4088 4089 4090<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4091<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 4092 4093Given 4094 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 4095 void f() { f(); } 4096callExpr(callee(expr())) 4097 matches this->x(), x(), y.x(), f() 4098with callee(...) 4099 matching this->x, x, y.x, f respectively 4100 4101Note: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 4102because this introduces ambiguous overloads with calls to Callee taking a 4103internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 4104implemented in terms of implicit casts. 4105</pre></td></tr> 4106 4107 4108<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 4109<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 4110 4111Given 4112 void f(int i); 4113 int y; 4114 f(y); 4115callExpr(declRefExpr(to(varDecl(hasName("y")))), 4116parmVarDecl(hasType(isInteger()))) 4117 matches f(y); 4118with declRefExpr(...) 4119 matching int y 4120and parmVarDecl(...) 4121 matching int i 4122</pre></td></tr> 4123 4124 4125<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> 4126<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 4127expression. 4128 4129Given 4130 void x(int, int, int) { int y; x(1, y, 42); } 4131callExpr(hasAnyArgument(declRefExpr())) 4132 matches x(1, y, 42) 4133with hasAnyArgument(...) 4134 matching y 4135</pre></td></tr> 4136 4137 4138<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> 4139<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 4140call expression. 4141 4142Example matches y in x(y) 4143 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4144 void x(int) { int y; x(y); } 4145</pre></td></tr> 4146 4147 4148<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4149<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 4150matches the given matcher. 4151 4152The associated declaration is: 4153- for type nodes, the declaration of the underlying type 4154- for CallExpr, the declaration of the callee 4155- for MemberExpr, the declaration of the referenced member 4156- for CXXConstructExpr, the declaration of the constructor 4157 4158Also usable as Matcher<T> for any T supporting the getDecl() member 4159function. e.g. various subtypes of clang::Type and various expressions. 4160 4161Usable as: 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>>, 4162 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4163 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4164 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4165 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4166 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4167</pre></td></tr> 4168 4169 4170<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>></td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4171<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 4172extension, matches the constant given in the statement. 4173 4174Given 4175 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 4176caseStmt(hasCaseConstant(integerLiteral())) 4177 matches "case 1:" 4178</pre></td></tr> 4179 4180 4181<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> 4182<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr> 4183 4184 4185<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> 4186<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one 4187TemplateArgument matching the given InnerMatcher. 4188 4189Given 4190 template<typename T> class A {}; 4191 template<> class A<double> {}; 4192 A<int> a; 4193classTemplateSpecializationDecl(hasAnyTemplateArgument( 4194 refersToType(asString("int")))) 4195 matches the specialization A<int> 4196</pre></td></tr> 4197 4198 4199<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> 4200<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 4201matches the given InnerMatcher. 4202 4203Given 4204 template<typename T, typename U> class A {}; 4205 A<bool, int> b; 4206 A<int, bool> c; 4207classTemplateSpecializationDecl(hasTemplateArgument( 4208 1, refersToType(asString("int")))) 4209 matches the specialization A<bool, int> 4210</pre></td></tr> 4211 4212 4213<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</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> 4214<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 4215type. 4216 4217Given 4218 struct A {}; 4219 A a[7]; 4220 int b[7]; 4221arrayType(hasElementType(builtinType())) 4222 matches "int b[7]" 4223 4224Usable 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>> 4225</pre></td></tr> 4226 4227 4228<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</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> 4229<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 4230type. 4231 4232Given 4233 struct A {}; 4234 A a[7]; 4235 int b[7]; 4236arrayType(hasElementType(builtinType())) 4237 matches "int b[7]" 4238 4239Usable 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>> 4240</pre></td></tr> 4241 4242 4243<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> 4244<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 4245a given matcher. Also matches StmtExprs that have CompoundStmt as children. 4246 4247Given 4248 { {}; 1+2; } 4249hasAnySubstatement(compoundStmt()) 4250 matches '{ {}; 1+2; }' 4251with compoundStmt() 4252 matching '{}' 4253</pre></td></tr> 4254 4255 4256<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>></td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr> 4257<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 4258</pre></td></tr> 4259 4260 4261<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4262<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 4263matches the given matcher. 4264 4265The associated declaration is: 4266- for type nodes, the declaration of the underlying type 4267- for CallExpr, the declaration of the callee 4268- for MemberExpr, the declaration of the referenced member 4269- for CXXConstructExpr, the declaration of the constructor 4270 4271Also usable as Matcher<T> for any T supporting the getDecl() member 4272function. e.g. various subtypes of clang::Type and various expressions. 4273 4274Usable as: 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>>, 4275 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4276 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4277 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4278 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4279 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4280</pre></td></tr> 4281 4282 4283<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> 4284<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 4285specific using shadow declaration. 4286 4287Given 4288 namespace a { void f() {} } 4289 using a::f; 4290 void g() { 4291 f(); Matches this .. 4292 a::f(); .. but not this. 4293 } 4294declRefExpr(throughUsingDecl(anything())) 4295 matches f() 4296</pre></td></tr> 4297 4298 4299<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> 4300<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 4301specified matcher. 4302 4303Example matches x in if(x) 4304 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 4305 bool x; 4306 if (x) {} 4307</pre></td></tr> 4308 4309 4310<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> 4311<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 4312 4313Note that this does not work for global declarations because the AST 4314breaks up multiple-declaration DeclStmt's into multiple single-declaration 4315DeclStmt's. 4316Example: Given non-global declarations 4317 int a, b = 0; 4318 int c; 4319 int d = 2, e; 4320declStmt(containsDeclaration( 4321 0, varDecl(hasInitializer(anything())))) 4322 matches only 'int d = 2, e;', and 4323declStmt(containsDeclaration(1, varDecl())) 4324 matches 'int a, b = 0' as well as 'int d = 2, e;' 4325 but 'int c;' is not matched. 4326</pre></td></tr> 4327 4328 4329<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> 4330<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 4331 4332Given 4333 int a, b; 4334 int c; 4335declStmt(hasSingleDecl(anything())) 4336 matches 'int c;' but not 'int a, b;'. 4337</pre></td></tr> 4338 4339 4340<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 4341<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 4342the inner matcher. 4343 4344Given 4345 int x; 4346declaratorDecl(hasTypeLoc(loc(asString("int")))) 4347 matches int x 4348</pre></td></tr> 4349 4350 4351<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> 4352<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 4353Decl, matches InnerMatcher. 4354 4355Given 4356 namespace N { 4357 namespace M { 4358 class D {}; 4359 } 4360 } 4361 4362cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 4363declaration of class D. 4364</pre></td></tr> 4365 4366 4367<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> 4368<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 4369definition that has a given body. 4370 4371Given 4372 for (;;) {} 4373hasBody(compoundStmt()) 4374 matches 'for (;;) {}' 4375with compoundStmt() 4376 matching '{}' 4377</pre></td></tr> 4378 4379 4380<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> 4381<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 4382switch statement or conditional operator. 4383 4384Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4385 if (true) {} 4386</pre></td></tr> 4387 4388 4389<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> 4390<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 4391matches InnerMatcher if the qualifier exists. 4392 4393Given 4394 namespace N { 4395 namespace M { 4396 class D {}; 4397 } 4398 } 4399 N::M::D d; 4400 4401elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 4402matches the type of the variable declaration of d. 4403</pre></td></tr> 4404 4405 4406<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> 4407<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 4408 4409Given 4410 namespace N { 4411 namespace M { 4412 class D {}; 4413 } 4414 } 4415 N::M::D d; 4416 4417elaboratedType(namesType(recordType( 4418hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 4419declaration of d. 4420</pre></td></tr> 4421 4422 4423<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4424<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 4425matches the given matcher. 4426 4427The associated declaration is: 4428- for type nodes, the declaration of the underlying type 4429- for CallExpr, the declaration of the callee 4430- for MemberExpr, the declaration of the referenced member 4431- for CXXConstructExpr, the declaration of the constructor 4432 4433Also usable as Matcher<T> for any T supporting the getDecl() member 4434function. e.g. various subtypes of clang::Type and various expressions. 4435 4436Usable as: 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>>, 4437 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4438 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4439 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4440 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4441 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4442</pre></td></tr> 4443 4444 4445<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> 4446<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 4447 4448(Note: Clang's AST refers to other conversions as "casts" too, and calls 4449actual casts "explicit" casts.) 4450</pre></td></tr> 4451 4452 4453<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> 4454<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 4455declaration's type. 4456 4457In case of a value declaration (for example a variable declaration), 4458this resolves one layer of indirection. For example, in the value 4459declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 4460X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 4461declaration of x. 4462 4463Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4464 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4465 class X {}; 4466 void y(X &x) { x; X z; } 4467 4468Usable 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>> 4469</pre></td></tr> 4470 4471 4472<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4473<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 4474matcher. 4475 4476Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4477 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4478 and U (matcher = typedefDecl(hasType(asString("int"))) 4479 class X {}; 4480 void y(X &x) { x; X z; } 4481 typedef int U; 4482</pre></td></tr> 4483 4484 4485<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> 4486<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 4487are stripped off. 4488 4489Parentheses and explicit casts are not discarded. 4490Given 4491 int arr[5]; 4492 int a = 0; 4493 char b = 0; 4494 const int c = a; 4495 int *d = arr; 4496 long e = (long) 0l; 4497The matchers 4498 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 4499 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 4500would match the declarations for a, b, c, and d, but not e. 4501While 4502 varDecl(hasInitializer(integerLiteral())) 4503 varDecl(hasInitializer(declRefExpr())) 4504only match the declarations for b, c, and d. 4505</pre></td></tr> 4506 4507 4508<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>ast_matchers::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4509<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 4510nodes are stripped off. 4511 4512Parentheses and explicit casts are not discarded. 4513Given 4514 class C {}; 4515 C a = C(); 4516 C b; 4517 C c = b; 4518The matchers 4519 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 4520would match the declarations for a, b, and c. 4521While 4522 varDecl(hasInitializer(cxxConstructExpr())) 4523only match the declarations for b and c. 4524</pre></td></tr> 4525 4526 4527<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> 4528<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 4529casts are stripped off. 4530 4531Implicit and non-C Style casts are also discarded. 4532Given 4533 int a = 0; 4534 char b = (0); 4535 void* c = reinterpret_cast<char*>(0); 4536 char d = char(0); 4537The matcher 4538 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 4539would match the declarations for a, b, c, and d. 4540while 4541 varDecl(hasInitializer(integerLiteral())) 4542only match the declaration for a. 4543</pre></td></tr> 4544 4545 4546<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> 4547<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 4548parentheses are stripped off. 4549 4550Explicit casts are not discarded. 4551Given 4552 int arr[5]; 4553 int a = 0; 4554 char b = (0); 4555 const int c = a; 4556 int *d = (arr); 4557 long e = ((long) 0l); 4558The matchers 4559 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 4560 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 4561would match the declarations for a, b, c, and d, but not e. 4562while 4563 varDecl(hasInitializer(integerLiteral())) 4564 varDecl(hasInitializer(declRefExpr())) 4565would only match the declaration for a. 4566</pre></td></tr> 4567 4568 4569<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> 4570<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 4571definition that has a given body. 4572 4573Given 4574 for (;;) {} 4575hasBody(compoundStmt()) 4576 matches 'for (;;) {}' 4577with compoundStmt() 4578 matching '{}' 4579</pre></td></tr> 4580 4581 4582<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> 4583<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 4584switch statement or conditional operator. 4585 4586Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4587 if (true) {} 4588</pre></td></tr> 4589 4590 4591<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> 4592<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 4593 4594Example: 4595 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 4596matches '++x' in 4597 for (x; x < N; ++x) { } 4598</pre></td></tr> 4599 4600 4601<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> 4602<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 4603 4604Example: 4605 forStmt(hasLoopInit(declStmt())) 4606matches 'int x = 0' in 4607 for (int x = 0; x < N; ++x) { } 4608</pre></td></tr> 4609 4610 4611<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> 4612<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration. 4613 4614Does not match the 'this' parameter of a method. 4615 4616Given 4617 class X { void f(int x, int y, int z) {} }; 4618cxxMethodDecl(hasAnyParameter(hasName("y"))) 4619 matches f(int x, int y, int z) {} 4620with hasAnyParameter(...) 4621 matching int y 4622</pre></td></tr> 4623 4624 4625<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4626<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 4627definition that has a given body. 4628 4629Given 4630 for (;;) {} 4631hasBody(compoundStmt()) 4632 matches 'for (;;) {}' 4633with compoundStmt() 4634 matching '{}' 4635</pre></td></tr> 4636 4637 4638<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> 4639<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration. 4640 4641Given 4642 class X { void f(int x) {} }; 4643cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 4644 matches f(int x) {} 4645with hasParameter(...) 4646 matching int x 4647</pre></td></tr> 4648 4649 4650<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> 4651<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 4652 4653Given: 4654 class X { int f() { return 1; } }; 4655cxxMethodDecl(returns(asString("int"))) 4656 matches int f() { return 1; } 4657</pre></td></tr> 4658 4659 4660<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> 4661<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 4662switch statement or conditional operator. 4663 4664Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4665 if (true) {} 4666</pre></td></tr> 4667 4668 4669<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> 4670<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 4671 4672Given 4673 if (A* a = GetAPointer()) {} 4674hasConditionVariableStatement(...) 4675 matches 'A* a = GetAPointer()'. 4676</pre></td></tr> 4677 4678 4679<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4680<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 4681 4682Examples matches the if statement 4683 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 4684 if (false) false; else true; 4685</pre></td></tr> 4686 4687 4688<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4689<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 4690 4691Examples matches the if statement 4692 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 4693 if (false) true; else false; 4694</pre></td></tr> 4695 4696 4697<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> 4698<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 4699matcher. 4700 4701FIXME: Unit test this matcher 4702</pre></td></tr> 4703 4704 4705<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4706<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 4707(if expression have it). 4708</pre></td></tr> 4709 4710 4711<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4712<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 4713matches the given matcher. 4714 4715The associated declaration is: 4716- for type nodes, the declaration of the underlying type 4717- for CallExpr, the declaration of the callee 4718- for MemberExpr, the declaration of the referenced member 4719- for CXXConstructExpr, the declaration of the constructor 4720 4721Also usable as Matcher<T> for any T supporting the getDecl() member 4722function. e.g. various subtypes of clang::Type and various expressions. 4723 4724Usable as: 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>>, 4725 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4726 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4727 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4728 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4729 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4730</pre></td></tr> 4731 4732 4733<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4734<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 4735matches the given matcher. 4736 4737The associated declaration is: 4738- for type nodes, the declaration of the underlying type 4739- for CallExpr, the declaration of the callee 4740- for MemberExpr, the declaration of the referenced member 4741- for CXXConstructExpr, the declaration of the constructor 4742 4743Also usable as Matcher<T> for any T supporting the getDecl() member 4744function. e.g. various subtypes of clang::Type and various expressions. 4745 4746Usable as: 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>>, 4747 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4748 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4749 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4750 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4751 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4752</pre></td></tr> 4753 4754 4755<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4756<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 4757matches the given matcher. 4758 4759The associated declaration is: 4760- for type nodes, the declaration of the underlying type 4761- for CallExpr, the declaration of the callee 4762- for MemberExpr, the declaration of the referenced member 4763- for CXXConstructExpr, the declaration of the constructor 4764 4765Also usable as Matcher<T> for any T supporting the getDecl() member 4766function. e.g. various subtypes of clang::Type and various expressions. 4767 4768Usable as: 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>>, 4769 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4770 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4771 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4772 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4773 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4774</pre></td></tr> 4775 4776 4777<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> 4778<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 4779matched by a given matcher. 4780 4781Given 4782 struct X { int m; }; 4783 void f(X x) { x.m; m; } 4784memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) 4785 matches "x.m" and "m" 4786with hasObjectExpression(...) 4787 matching "x" and the implicit object expression of "m" which has type X*. 4788</pre></td></tr> 4789 4790 4791<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> 4792<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 4793given matcher. 4794 4795Given 4796 struct { int first, second; } first, second; 4797 int i(second.first); 4798 int j(first.second); 4799memberExpr(member(hasName("first"))) 4800 matches second.first 4801 but not first.second (because the member name there is "second"). 4802</pre></td></tr> 4803 4804 4805<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</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> 4806<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 4807pointee matches a given matcher. 4808 4809Given 4810 int *a; 4811 int const *b; 4812 float const *f; 4813pointerType(pointee(isConstQualified(), isInteger())) 4814 matches "int const *b" 4815 4816Usable 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>>, 4817 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>> 4818</pre></td></tr> 4819 4820 4821<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</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> 4822<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 4823pointee matches a given matcher. 4824 4825Given 4826 int *a; 4827 int const *b; 4828 float const *f; 4829pointerType(pointee(isConstQualified(), isInteger())) 4830 matches "int const *b" 4831 4832Usable 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>>, 4833 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>> 4834</pre></td></tr> 4835 4836 4837<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> 4838<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 4839 4840Given 4841 struct A { struct B { struct C {}; }; }; 4842 A::B::C c; 4843nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 4844 matches "A::" 4845</pre></td></tr> 4846 4847 4848<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> 4849<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 4850given TypeLoc. 4851 4852Given 4853 struct A { struct B { struct C {}; }; }; 4854 A::B::C c; 4855nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 4856 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 4857 matches "A::" 4858</pre></td></tr> 4859 4860 4861<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> 4862<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 4863 4864Given 4865 struct A { struct B { struct C {}; }; }; 4866 A::B::C c; 4867nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 4868 matches "A::" 4869</pre></td></tr> 4870 4871 4872<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> 4873<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 4874given namespace matcher. 4875 4876Given 4877 namespace ns { struct A {}; } 4878 ns::A a; 4879nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 4880 matches "ns::" 4881</pre></td></tr> 4882 4883 4884<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> 4885<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 4886given QualType matcher without qualifiers. 4887 4888Given 4889 struct A { struct B { struct C {}; }; }; 4890 A::B::C c; 4891nestedNameSpecifier(specifiesType( 4892 hasDeclaration(cxxRecordDecl(hasName("A"))) 4893)) 4894 matches "A::" 4895</pre></td></tr> 4896 4897 4898<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4899<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 4900call expression. 4901 4902Example matches y in x(y) 4903 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4904 void x(int) { int y; x(y); } 4905</pre></td></tr> 4906 4907 4908<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4909<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 4910 4911Example 4912matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *"))); 4913matches the [webView ...] message invocation. 4914 NSString *webViewJavaScript = ... 4915 UIWebView *webView = ... 4916 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 4917</pre></td></tr> 4918 4919 4920<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4921<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr> 4922 4923 4924<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> 4925<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 4926 4927Given 4928 int (*ptr_to_array)[4]; 4929 int (*ptr_to_func)(int); 4930 4931varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 4932ptr_to_func but not ptr_to_array. 4933 4934Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 4935</pre></td></tr> 4936 4937 4938<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</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> 4939<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 4940pointee matches a given matcher. 4941 4942Given 4943 int *a; 4944 int const *b; 4945 float const *f; 4946pointerType(pointee(isConstQualified(), isInteger())) 4947 matches "int const *b" 4948 4949Usable 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>>, 4950 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>> 4951</pre></td></tr> 4952 4953 4954<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</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> 4955<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 4956pointee matches a given matcher. 4957 4958Given 4959 int *a; 4960 int const *b; 4961 float const *f; 4962pointerType(pointee(isConstQualified(), isInteger())) 4963 matches "int const *b" 4964 4965Usable 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>>, 4966 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>> 4967</pre></td></tr> 4968 4969 4970<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> 4971<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 4972 4973Given: 4974 typedef int &int_ref; 4975 int a; 4976 int_ref b = a; 4977 4978varDecl(hasType(qualType(referenceType()))))) will not match the 4979declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 4980</pre></td></tr> 4981 4982 4983<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4984<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 4985matches the given matcher. 4986 4987The associated declaration is: 4988- for type nodes, the declaration of the underlying type 4989- for CallExpr, the declaration of the callee 4990- for MemberExpr, the declaration of the referenced member 4991- for CXXConstructExpr, the declaration of the constructor 4992 4993Also usable as Matcher<T> for any T supporting the getDecl() member 4994function. e.g. various subtypes of clang::Type and various expressions. 4995 4996Usable as: 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>>, 4997 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4998 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4999 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5000 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5001 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5002</pre></td></tr> 5003 5004 5005<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5006<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 5007 5008Given 5009 void (*fp)(void); 5010The matcher 5011 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 5012would match the declaration for fp. 5013</pre></td></tr> 5014 5015 5016<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> 5017<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 5018</pre></td></tr> 5019 5020 5021<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5022<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 5023matches the specified matcher. 5024 5025Example matches y->x() 5026 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 5027 cxxRecordDecl(hasName("Y"))))))) 5028 class Y { public: void x(); }; 5029 void z() { Y *y; y->x(); } 5030</pre></td></tr> 5031 5032 5033<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> 5034<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 5035</pre></td></tr> 5036 5037 5038<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5039<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 5040type matches the specified matcher. 5041 5042Example matches X &x and const X &y 5043 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 5044 class X { 5045 void a(X b) { 5046 X &x = b; 5047 const X &y = b; 5048 } 5049 }; 5050</pre></td></tr> 5051 5052 5053<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</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> 5054<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 5055matches the given matcher. 5056 5057The associated declaration is: 5058- for type nodes, the declaration of the underlying type 5059- for CallExpr, the declaration of the callee 5060- for MemberExpr, the declaration of the referenced member 5061- for CXXConstructExpr, the declaration of the constructor 5062 5063Also usable as Matcher<T> for any T supporting the getDecl() member 5064function. e.g. various subtypes of clang::Type and various expressions. 5065 5066Usable as: 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>>, 5067 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5068 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5069 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5070 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5071 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5072</pre></td></tr> 5073 5074 5075<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</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> 5076<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 5077pointee matches a given matcher. 5078 5079Given 5080 int *a; 5081 int const *b; 5082 float const *f; 5083pointerType(pointee(isConstQualified(), isInteger())) 5084 matches "int const *b" 5085 5086Usable 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>>, 5087 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>> 5088</pre></td></tr> 5089 5090 5091<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</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> 5092<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 5093pointee matches a given matcher. 5094 5095Given 5096 int *a; 5097 int const *b; 5098 float const *f; 5099pointerType(pointee(isConstQualified(), isInteger())) 5100 matches "int const *b" 5101 5102Usable 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>>, 5103 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>> 5104</pre></td></tr> 5105 5106 5107<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>></td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5108<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 5109 5110Given 5111 return a + b; 5112hasReturnValue(binaryOperator()) 5113 matches 'return a + b' 5114with binaryOperator() 5115 matching 'a + b' 5116</pre></td></tr> 5117 5118 5119<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 5120<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 5121a given matcher. Also matches StmtExprs that have CompoundStmt as children. 5122 5123Given 5124 { {}; 1+2; } 5125hasAnySubstatement(compoundStmt()) 5126 matches '{ {}; 1+2; }' 5127with compoundStmt() 5128 matching '{}' 5129</pre></td></tr> 5130 5131 5132<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> 5133<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5134alignof. 5135</pre></td></tr> 5136 5137 5138<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr> 5139<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statemenet belongs to 5140 5141Given: 5142F& operator=(const F& o) { 5143 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 5144 return *this; 5145} 5146returnStmt(forFunction(hasName("operator="))) 5147 matches 'return *this' 5148 but does match 'return > 0' 5149</pre></td></tr> 5150 5151 5152<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> 5153<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5154sizeof. 5155</pre></td></tr> 5156 5157 5158<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr> 5159<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 5160statement. This matcher may produce multiple matches. 5161 5162Given 5163 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 5164switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 5165 matches four times, with "c" binding each of "case 1:", "case 2:", 5166"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 5167"switch (1)", "switch (2)" and "switch (2)". 5168</pre></td></tr> 5169 5170 5171<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</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> 5172<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 5173switch statement or conditional operator. 5174 5175Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5176 if (true) {} 5177</pre></td></tr> 5178 5179 5180<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</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> 5181<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 5182matches the given matcher. 5183 5184The associated declaration is: 5185- for type nodes, the declaration of the underlying type 5186- for CallExpr, the declaration of the callee 5187- for MemberExpr, the declaration of the referenced member 5188- for CXXConstructExpr, the declaration of the constructor 5189 5190Also usable as Matcher<T> for any T supporting the getDecl() member 5191function. e.g. various subtypes of clang::Type and various expressions. 5192 5193Usable as: 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>>, 5194 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5195 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5196 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5197 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5198 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5199</pre></td></tr> 5200 5201 5202<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5203<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 5204 5205Given 5206 template<typename T> struct A {}; 5207 struct B { B* next; }; 5208 A<&B::next> a; 5209templateSpecializationType(hasAnyTemplateArgument( 5210 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 5211 matches the specialization A<&B::next> with fieldDecl(...) matching 5212 B::next 5213</pre></td></tr> 5214 5215 5216<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> 5217<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 5218declaration. 5219 5220Given 5221 template<typename T> struct A {}; 5222 struct B { B* next; }; 5223 A<&B::next> a; 5224classTemplateSpecializationDecl(hasAnyTemplateArgument( 5225 refersToDeclaration(fieldDecl(hasName("next")))) 5226 matches the specialization A<&B::next> with fieldDecl(...) matching 5227 B::next 5228</pre></td></tr> 5229 5230 5231<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5232<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 5233 5234Given 5235 template<int T> struct A {}; 5236 C<42> c; 5237classTemplateSpecializationDecl( 5238 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 5239 matches the implicit instantiation of C in C<42>. 5240</pre></td></tr> 5241 5242 5243<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> 5244<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 5245 5246Given 5247 struct X {}; 5248 template<typename T> struct A {}; 5249 A<X> a; 5250classTemplateSpecializationDecl(hasAnyTemplateArgument( 5251 refersToType(class(hasName("X"))))) 5252 matches the specialization A<X> 5253</pre></td></tr> 5254 5255 5256<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5257<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one 5258TemplateArgument matching the given InnerMatcher. 5259 5260Given 5261 template<typename T> class A {}; 5262 template<> class A<double> {}; 5263 A<int> a; 5264classTemplateSpecializationDecl(hasAnyTemplateArgument( 5265 refersToType(asString("int")))) 5266 matches the specialization A<int> 5267</pre></td></tr> 5268 5269 5270<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</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> 5271<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 5272matches the given matcher. 5273 5274The associated declaration is: 5275- for type nodes, the declaration of the underlying type 5276- for CallExpr, the declaration of the callee 5277- for MemberExpr, the declaration of the referenced member 5278- for CXXConstructExpr, the declaration of the constructor 5279 5280Also usable as Matcher<T> for any T supporting the getDecl() member 5281function. e.g. various subtypes of clang::Type and various expressions. 5282 5283Usable as: 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>>, 5284 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5285 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5286 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5287 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5288 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5289</pre></td></tr> 5290 5291 5292<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5293<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 5294matches the given InnerMatcher. 5295 5296Given 5297 template<typename T, typename U> class A {}; 5298 A<bool, int> b; 5299 A<int, bool> c; 5300classTemplateSpecializationDecl(hasTemplateArgument( 5301 1, refersToType(asString("int")))) 5302 matches the specialization A<bool, int> 5303</pre></td></tr> 5304 5305 5306<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</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> 5307<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 5308matches the given matcher. 5309 5310The associated declaration is: 5311- for type nodes, the declaration of the underlying type 5312- for CallExpr, the declaration of the callee 5313- for MemberExpr, the declaration of the referenced member 5314- for CXXConstructExpr, the declaration of the constructor 5315 5316Also usable as Matcher<T> for any T supporting the getDecl() member 5317function. e.g. various subtypes of clang::Type and various expressions. 5318 5319Usable as: 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>>, 5320 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5321 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5322 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5323 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5324 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5325</pre></td></tr> 5326 5327 5328<tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<T> Matcher</td></tr> 5329<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5330 5331Generates results for each match. 5332 5333For example, in: 5334 class A { class B {}; class C {}; }; 5335The matcher: 5336 cxxRecordDecl(hasName("::A"), 5337 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5338will generate results for A, B and C. 5339 5340Usable as: Any Matcher 5341</pre></td></tr> 5342 5343 5344<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5345<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 5346matcher. 5347 5348Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5349 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5350 and U (matcher = typedefDecl(hasType(asString("int"))) 5351 class X {}; 5352 void y(X &x) { x; X z; } 5353 typedef int U; 5354</pre></td></tr> 5355 5356 5357<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> 5358<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 5359matches the given matcher. 5360 5361The associated declaration is: 5362- for type nodes, the declaration of the underlying type 5363- for CallExpr, the declaration of the callee 5364- for MemberExpr, the declaration of the referenced member 5365- for CXXConstructExpr, the declaration of the constructor 5366 5367Also usable as Matcher<T> for any T supporting the getDecl() member 5368function. e.g. various subtypes of clang::Type and various expressions. 5369 5370Usable as: 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>>, 5371 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5372 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5373 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5374 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5375 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5376</pre></td></tr> 5377 5378 5379<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> 5380<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 5381 5382Given 5383 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 5384unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 5385 matches sizeof(a) and alignof(c) 5386</pre></td></tr> 5387 5388 5389<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> 5390<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 5391 5392Example matches true (matcher = hasUnaryOperand( 5393 cxxBoolLiteral(equals(true)))) 5394 !true 5395</pre></td></tr> 5396 5397 5398<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</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> 5399<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 5400matches the given matcher. 5401 5402The associated declaration is: 5403- for type nodes, the declaration of the underlying type 5404- for CallExpr, the declaration of the callee 5405- for MemberExpr, the declaration of the referenced member 5406- for CXXConstructExpr, the declaration of the constructor 5407 5408Also usable as Matcher<T> for any T supporting the getDecl() member 5409function. e.g. various subtypes of clang::Type and various expressions. 5410 5411Usable as: 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>>, 5412 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5413 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5414 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5415 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5416 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5417</pre></td></tr> 5418 5419 5420<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> 5421<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 5422 5423Given 5424 namespace X { void b(); } 5425 using X::b; 5426usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 5427 matches using X::b </pre></td></tr> 5428 5429 5430<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> 5431<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 5432matched by the given matcher. 5433 5434Given 5435 namespace X { int a; void b(); } 5436 using X::a; 5437 using X::b; 5438usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 5439 matches using X::b but not using X::a </pre></td></tr> 5440 5441 5442<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5443<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 5444declaration's type. 5445 5446In case of a value declaration (for example a variable declaration), 5447this resolves one layer of indirection. For example, in the value 5448declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5449X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5450declaration of x. 5451 5452Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5453 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5454 class X {}; 5455 void y(X &x) { x; X z; } 5456 5457Usable 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>> 5458</pre></td></tr> 5459 5460 5461<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_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5462<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 5463matcher. 5464 5465Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5466 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5467 and U (matcher = typedefDecl(hasType(asString("int"))) 5468 class X {}; 5469 void y(X &x) { x; X z; } 5470 typedef int U; 5471</pre></td></tr> 5472 5473 5474<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> 5475<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 5476that matches the given matcher. 5477 5478Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 5479 bool y() { return true; } 5480 bool x = y(); 5481</pre></td></tr> 5482 5483 5484<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> 5485<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 5486expression. 5487 5488Given 5489 void f(int b) { 5490 int a[b]; 5491 } 5492variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 5493 varDecl(hasName("b"))))))) 5494 matches "int a[b]" 5495</pre></td></tr> 5496 5497 5498<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> 5499<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 5500definition that has a given body. 5501 5502Given 5503 for (;;) {} 5504hasBody(compoundStmt()) 5505 matches 'for (;;) {}' 5506with compoundStmt() 5507 matching '{}' 5508</pre></td></tr> 5509 5510 5511<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> 5512<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 5513switch statement or conditional operator. 5514 5515Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5516 if (true) {} 5517</pre></td></tr> 5518 5519 5520<tr><td>Matcher<internal::BindableMatcher<<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> 5521<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 5522NestedNameSpecifier-matcher matches. 5523</pre></td></tr> 5524 5525 5526<tr><td>Matcher<internal::BindableMatcher<<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> 5527<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 5528QualType-matcher matches. 5529</pre></td></tr> 5530 5531<!--END_TRAVERSAL_MATCHERS --> 5532</table> 5533 5534</div> 5535</body> 5536</html> 5537 5538 5539