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('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 341<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 342 343Example matches Foo (Additions) 344 @interface Foo (Additions) 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('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 350<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 351 352Example matches Foo (Additions) 353 @implementation Foo (Additions) 354 @end 355</pre></td></tr> 356 357 358<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 359<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 360 361Example matches Foo 362 @implementation Foo 363 @end 364</pre></td></tr> 365 366 367<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> 368<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 369 370Example matches Foo 371 @interface Foo 372 @end 373</pre></td></tr> 374 375 376<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 377<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 378 379Example matches _enabled 380 @implementation Foo { 381 BOOL _enabled; 382 } 383 @end 384</pre></td></tr> 385 386 387<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 388<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 389 390Example matches both declaration and definition of -[Foo method] 391 @interface Foo 392 - (void)method; 393 @end 394 395 @implementation Foo 396 - (void)method {} 397 @end 398</pre></td></tr> 399 400 401<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 402<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 403 404Example matches enabled 405 @interface Foo 406 @property BOOL enabled; 407 @end 408</pre></td></tr> 409 410 411<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 412<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 413 414Example matches FooDelegate 415 @protocol FooDelegate 416 @end 417</pre></td></tr> 418 419 420<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> 421<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 422 423Given 424 void f(int x); 425parmVarDecl() 426 matches int x. 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('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 431<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 432 433Example matches X, Z, U, and S 434 class X; 435 template<class T> class Z {}; 436 struct S {}; 437 union U {}; 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('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 442<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 443 444Example: 445 staticAssertExpr() 446matches 447 static_assert(sizeof(S) == sizeof(int)) 448in 449 struct S { 450 int x; 451 }; 452 static_assert(sizeof(S) == sizeof(int)); 453</pre></td></tr> 454 455 456<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> 457<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 458 459Given 460 template <typename T, int N> struct C {}; 461templateTypeParmDecl() 462 matches 'T', but not 'N'. 463</pre></td></tr> 464 465 466<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> 467<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 468 469Given 470 int X; 471 namespace NS { 472 int Y; 473 } namespace NS 474decl(hasDeclContext(translationUnitDecl())) 475 matches "int X", but not "int Y". 476</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('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 480<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 481 482Given 483 typedef int X; 484 using Y = int; 485typeAliasDecl() 486 matches "using Y = int", but not "typedef int X" 487</pre></td></tr> 488 489 490<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 491<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 492 493typeAliasTemplateDecl() matches 494 template <typename T> 495 using Y = X<T>; 496</pre></td></tr> 497 498 499<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> 500<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 501 502Given 503 typedef int X; 504 using Y = int; 505typedefDecl() 506 matches "typedef int X", but not "using Y = int" 507</pre></td></tr> 508 509 510<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> 511<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 512 513Given 514 typedef int X; 515 using Y = int; 516typedefNameDecl() 517 matches "typedef int X" and "using Y = int" 518</pre></td></tr> 519 520 521<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> 522<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 523typename. 524 525Given 526 template <typename T> 527 struct Base { typedef T Foo; }; 528 529 template<typename T> 530 struct S : private Base<T> { 531 using typename Base<T>::Foo; 532 }; 533unresolvedUsingTypenameDecl() 534 matches using Base<T>::Foo </pre></td></tr> 535 536 537<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> 538<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 539 540Given 541 template<typename X> 542 class C : private X { 543 using X::x; 544 }; 545unresolvedUsingValueDecl() 546 matches using X::x </pre></td></tr> 547 548 549<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> 550<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 551 552Given 553 namespace X { int x; } 554 using X::x; 555usingDecl() 556 matches using X::x </pre></td></tr> 557 558 559<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> 560<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 561 562Given 563 namespace X { int x; } 564 using namespace X; 565usingDirectiveDecl() 566 matches using namespace X </pre></td></tr> 567 568 569<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> 570<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 571 572Example matches A, B, C and F 573 enum X { A, B, C }; 574 void F(); 575</pre></td></tr> 576 577 578<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> 579<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 580 581Note: this does not match declarations of member variables, which are 582"field" declarations in Clang parlance. 583 584Example matches a 585 int a; 586</pre></td></tr> 587 588 589<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> 590<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 591</pre></td></tr> 592 593 594<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> 595<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 596 597Given 598 namespace ns { 599 struct A { static void f(); }; 600 void A::f() {} 601 void g() { A::f(); } 602 } 603 ns::A a; 604nestedNameSpecifier() 605 matches "ns::" and both "A::" 606</pre></td></tr> 607 608 609<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> 610<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 611</pre></td></tr> 612 613 614<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> 615<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 616 617Given 618 FOO: bar(); 619 void *ptr = &&FOO; 620 goto *bar; 621addrLabelExpr() 622 matches '&&FOO' 623</pre></td></tr> 624 625 626<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> 627<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 628 629Given 630 int i = a[1]; 631arraySubscriptExpr() 632 matches "a[1]" 633</pre></td></tr> 634 635 636<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> 637<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 638 639 int i = 100; 640 __asm("mov al, 2"); 641asmStmt() 642 matches '__asm("mov al, 2")' 643</pre></td></tr> 644 645 646<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 647<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 648Example matches __atomic_load_n(ptr, 1) 649 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 650</pre></td></tr> 651 652 653<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> 654<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 655 656Example matches a ?: b 657 (a ?: b) + 42; 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('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 662<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 663 664Example matches a || b 665 !(a || b) 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('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 670<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 671 672Given 673 while (true) { break; } 674breakStmt() 675 matches 'break' 676</pre></td></tr> 677 678 679<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> 680<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 681 682Example: Matches (int) 2.2f in 683 int i = (int) 2.2f; 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('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 688<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 689 690Example matches x.y() and y() 691 X x; 692 x.y(); 693 y(); 694</pre></td></tr> 695 696 697<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> 698<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 699 700Given 701 switch(a) { case 42: break; default: break; } 702caseStmt() 703 matches 'case 42:'. 704</pre></td></tr> 705 706 707<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> 708<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 709 710Example: castExpr() matches each of the following: 711 (int) 3; 712 const_cast<Expr *>(SubExpr); 713 char c = 0; 714but does not match 715 int i = (0); 716 int k = 0; 717</pre></td></tr> 718 719 720<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> 721<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 722 723Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 724though. 725 726Example matches 'a', L'a' 727 char ch = 'a'; 728 wchar_t chw = L'a'; 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('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 733<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 734 735Example match: {1}, (1, 2) 736 int array[4] = {1}; 737 vector int myvec = (vector int)(1, 2); 738</pre></td></tr> 739 740 741<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 742<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 743 744Example matches '{}' and '{{}}' in 'for (;;) {{}}' 745 for (;;) {{}} 746</pre></td></tr> 747 748 749<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> 750<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 751 752Example matches a ? b : c 753 (a ? b : c) + 42 754</pre></td></tr> 755 756 757<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 758<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 759 760Given 761 while (true) { continue; } 762continueStmt() 763 matches 'continue' 764</pre></td></tr> 765 766 767<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 768<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 769 770Example matches, 771 kernel<<<i,j>>>(); 772</pre></td></tr> 773 774 775<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 776<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 777 778Example matches FunctionTakesString(GetStringByValue()) 779 (matcher = cxxBindTemporaryExpr()) 780 FunctionTakesString(GetStringByValue()); 781 FunctionTakesStringByPointer(GetStringPointer()); 782</pre></td></tr> 783 784 785<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 786<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 787 788Example matches true 789 true 790</pre></td></tr> 791 792 793<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> 794<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 795 796 try {} catch(int i) {} 797cxxCatchStmt() 798 matches 'catch(int i)' 799</pre></td></tr> 800 801 802<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 803<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 804 805Example: Matches const_cast<int*>(&r) in 806 int n = 42; 807 const int &r(n); 808 int* p = const_cast<int*>(&r); 809</pre></td></tr> 810 811 812<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> 813<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 814 815Example matches string(ptr, n) and ptr within arguments of f 816 (matcher = cxxConstructExpr()) 817 void f(const string &a, const string &b); 818 char *ptr; 819 int n; 820 f(string(ptr, n), ptr); 821</pre></td></tr> 822 823 824<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> 825<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 826 827Example matches the CXXDefaultArgExpr placeholder inserted for the 828 default value of the second parameter in the call expression f(42) 829 (matcher = cxxDefaultArgExpr()) 830 void f(int x, int y = 0); 831 f(42); 832</pre></td></tr> 833 834 835<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 836<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 837 838Given 839 delete X; 840cxxDeleteExpr() 841 matches 'delete X'. 842</pre></td></tr> 843 844 845<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> 846<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 847 848Example: 849 cxxDynamicCastExpr() 850matches 851 dynamic_cast<D*>(&b); 852in 853 struct B { virtual ~B() {} }; struct D : B {}; 854 B b; 855 D* p = dynamic_cast<D*>(&b); 856</pre></td></tr> 857 858 859<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> 860<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 861 862cxxForRangeStmt() matches 'for (auto a : i)' 863 int i[] = {1, 2, 3}; for (auto a : i); 864 for(int j = 0; j < 5; ++j); 865</pre></td></tr> 866 867 868<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> 869<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 870 871Example: Matches Foo(bar); 872 Foo f = bar; 873 Foo g = (Foo) bar; 874 Foo h = Foo(bar); 875</pre></td></tr> 876 877 878<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> 879<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 880 881Example matches x.y() 882 X x; 883 x.y(); 884</pre></td></tr> 885 886 887<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> 888<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 889 890Given 891 new X; 892cxxNewExpr() 893 matches 'new X'. 894</pre></td></tr> 895 896 897<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> 898<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 899</pre></td></tr> 900 901 902<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> 903<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 904 905Note that if an operator isn't overloaded, it won't match. Instead, use 906binaryOperator matcher. 907Currently it does not match operators such as new delete. 908FIXME: figure out why these do not match? 909 910Example matches both operator<<((o << b), c) and operator<<(o, b) 911 (matcher = cxxOperatorCallExpr()) 912 ostream &operator<< (ostream &out, int i) { }; 913 ostream &o; int b = 1, c = 1; 914 o << b << c; 915</pre></td></tr> 916 917 918<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> 919<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 920 921Either the source expression or the destination type can be matched 922using has(), but hasDestinationType() is more specific and can be 923more readable. 924 925Example matches reinterpret_cast<char*>(&p) in 926 void* p = reinterpret_cast<char*>(&p); 927</pre></td></tr> 928 929 930<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> 931<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 932 933See also: hasDestinationType 934See also: reinterpretCast 935 936Example: 937 cxxStaticCastExpr() 938matches 939 static_cast<long>(8) 940in 941 long eight(static_cast<long>(8)); 942</pre></td></tr> 943 944 945<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 946<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 947 948Given 949 std::vector<int> a({ 1, 2, 3 }); 950 std::vector<int> b = { 4, 5 }; 951 int c[] = { 6, 7 }; 952 std::pair<int, int> d = { 8, 9 }; 953cxxStdInitializerListExpr() 954 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 955</pre></td></tr> 956 957 958<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> 959<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 960 961Example: Matches Foo(bar, bar) 962 Foo h = Foo(bar, bar); 963</pre></td></tr> 964 965 966<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> 967<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 968 969Example matches the implicit this expression in "return i". 970 (matcher = cxxThisExpr()) 971struct foo { 972 int i; 973 int f() { return i; } 974}; 975</pre></td></tr> 976 977 978<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> 979<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 980 981 try { throw 5; } catch(int i) {} 982cxxThrowExpr() 983 matches 'throw 5' 984</pre></td></tr> 985 986 987<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> 988<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 989 990 try {} catch(int i) {} 991cxxTryStmt() 992 matches 'try {}' 993</pre></td></tr> 994 995 996<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> 997<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 998 999Example matches T(t) in return statement of f 1000 (matcher = cxxUnresolvedConstructExpr()) 1001 template <typename T> 1002 void f(const T& t) { return T(t); } 1003</pre></td></tr> 1004 1005 1006<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> 1007<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1008 1009Example matches x in if (x) 1010 bool x; 1011 if (x) {} 1012</pre></td></tr> 1013 1014 1015<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> 1016<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1017 1018Given 1019 int a; 1020declStmt() 1021 matches 'int a'. 1022</pre></td></tr> 1023 1024 1025<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> 1026<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1027 1028Given 1029 switch(a) { case 42: break; default: break; } 1030defaultStmt() 1031 matches 'default:'. 1032</pre></td></tr> 1033 1034 1035<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> 1036<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1037 1038Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1039 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1040</pre></td></tr> 1041 1042 1043<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> 1044<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1045 1046Given 1047 do {} while (true); 1048doStmt() 1049 matches 'do {} while(true)' 1050</pre></td></tr> 1051 1052 1053<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> 1054<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1055 1056Matches any cast expression written in user code, whether it be a 1057C-style cast, a functional-style cast, or a keyword cast. 1058 1059Does not match implicit conversions. 1060 1061Note: the name "explicitCast" is chosen to match Clang's terminology, as 1062Clang uses the term "cast" to apply to implicit conversions as well as to 1063actual cast expressions. 1064 1065See also: hasDestinationType. 1066 1067Example: matches all five of the casts in 1068 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1069but does not match the implicit conversion in 1070 long ell = 42; 1071</pre></td></tr> 1072 1073 1074<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> 1075<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1076 1077Example matches x() 1078 void f() { x(); } 1079</pre></td></tr> 1080 1081 1082<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> 1083<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1084of the sub-expression's evaluation. 1085 1086Example matches std::string() 1087 const std::string str = std::string(); 1088</pre></td></tr> 1089 1090 1091<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> 1092<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g. 10931.0, 1.0f, 1.0L and 1e10. 1094 1095Does not match implicit conversions such as 1096 float a = 10; 1097</pre></td></tr> 1098 1099 1100<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> 1101<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1102 1103Example matches 'for (;;) {}' 1104 for (;;) {} 1105 int i[] = {1, 2, 3}; for (auto a : i); 1106</pre></td></tr> 1107 1108 1109<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> 1110<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1111</pre></td></tr> 1112 1113 1114<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> 1115<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1116 1117Given 1118 goto FOO; 1119 FOO: bar(); 1120gotoStmt() 1121 matches 'goto FOO' 1122</pre></td></tr> 1123 1124 1125<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> 1126<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1127 1128Example matches 'if (x) {}' 1129 if (x) {} 1130</pre></td></tr> 1131 1132 1133<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> 1134<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1135 1136This matches many different places, including function call return value 1137eliding, as well as any type conversions. 1138</pre></td></tr> 1139 1140 1141<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> 1142<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1143 1144Given 1145 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1146implicitValueInitExpr() 1147 matches "[0].y" (implicitly) 1148</pre></td></tr> 1149 1150 1151<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> 1152<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1153 1154Given 1155 int a[] = { 1, 2 }; 1156 struct B { int x, y; }; 1157 B b = { 5, 6 }; 1158initListExpr() 1159 matches "{ 1, 2 }" and "{ 5, 6 }" 1160</pre></td></tr> 1161 1162 1163<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> 1164<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g. 11651, 1L, 0x1 and 1U. 1166 1167Does not match character-encoded integers such as L'a'. 1168</pre></td></tr> 1169 1170 1171<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> 1172<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1173 1174Given 1175 goto FOO; 1176 FOO: bar(); 1177labelStmt() 1178 matches 'FOO:' 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('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1183<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1184 1185Example matches [&](){return 5;} 1186 [&](){return 5;} 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('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1191<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1192 1193Example: Given 1194 struct T {void func();}; 1195 T f(); 1196 void g(T); 1197materializeTemporaryExpr() matches 'f()' in these statements 1198 T u(f()); 1199 g(f()); 1200 f().func(); 1201but does not match 1202 f(); 1203</pre></td></tr> 1204 1205 1206<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> 1207<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1208 1209Given 1210 class Y { 1211 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1212 int a; static int b; 1213 }; 1214memberExpr() 1215 matches this->x, x, y.x, a, this->b 1216</pre></td></tr> 1217 1218 1219<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> 1220<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1221 1222 foo();; 1223nullStmt() 1224 matches the second ';' 1225</pre></td></tr> 1226 1227 1228<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1229<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1230 1231Example matches @catch 1232 @try {} 1233 @catch (...) {} 1234</pre></td></tr> 1235 1236 1237<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1238<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1239 1240Example matches @finally 1241 @try {} 1242 @finally {} 1243</pre></td></tr> 1244 1245 1246<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> 1247<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1248 1249The innermost message send invokes the "alloc" class method on the 1250NSString class, while the outermost message send invokes the 1251"initWithString" instance method on the object returned from 1252NSString's "alloc". This matcher should match both message sends. 1253 [[NSString alloc] initWithString:@"Hello"] 1254</pre></td></tr> 1255 1256 1257<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 1258<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1259 1260Example matches @throw obj; 1261</pre></td></tr> 1262 1263 1264<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 1265<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1266 1267Example matches @try 1268 @try {} 1269 @catch (...) {} 1270</pre></td></tr> 1271 1272 1273<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> 1274<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1275to reference another expressions and can be met 1276in BinaryConditionalOperators, for example. 1277 1278Example matches 'a' 1279 (a ?: c) + 42; 1280</pre></td></tr> 1281 1282 1283<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> 1284<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1285 1286Example matches (foo() + 1) 1287 int foo() { return 1; } 1288 int a = (foo() + 1); 1289</pre></td></tr> 1290 1291 1292<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> 1293<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1294ParenListExprs don't have a predefined type and are used for late parsing. 1295In the final AST, they can be met in template declarations. 1296 1297Given 1298 template<typename T> class X { 1299 void f() { 1300 X x(*this); 1301 int a = 0, b = 1; int i = (a, b); 1302 } 1303 }; 1304parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1305has a predefined type and is a ParenExpr, not a ParenListExpr. 1306</pre></td></tr> 1307 1308 1309<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> 1310<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1311 1312Example: Matches __func__ 1313 printf("%s", __func__); 1314</pre></td></tr> 1315 1316 1317<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> 1318<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1319 1320Given 1321 return 1; 1322returnStmt() 1323 matches 'return 1' 1324</pre></td></tr> 1325 1326 1327<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> 1328<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1329 1330Given 1331 { ++a; } 1332stmt() 1333 matches both the compound statement '{ ++a; }' and '++a'. 1334</pre></td></tr> 1335 1336 1337<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> 1338<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1339 1340Example match: ({ int X = 4; X; }) 1341 int C = ({ int X = 4; X; }); 1342</pre></td></tr> 1343 1344 1345<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> 1346<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1347 1348Example matches "abcd", L"abcd" 1349 char *s = "abcd"; 1350 wchar_t *ws = L"abcd"; 1351</pre></td></tr> 1352 1353 1354<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> 1355<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1356 1357Given 1358 template <int N> 1359 struct A { static const int n = N; }; 1360 struct B : public A<42> {}; 1361substNonTypeTemplateParmExpr() 1362 matches "N" in the right-hand side of "static const int n = N;" 1363</pre></td></tr> 1364 1365 1366<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> 1367<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1368 1369Given 1370 switch(a) { case 42: break; default: break; } 1371switchCase() 1372 matches 'case 42:' and 'default:'. 1373</pre></td></tr> 1374 1375 1376<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> 1377<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1378 1379Given 1380 switch(a) { case 42: break; default: break; } 1381switchStmt() 1382 matches 'switch(a)'. 1383</pre></td></tr> 1384 1385 1386<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> 1387<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1388 1389Given 1390 Foo x = bar; 1391 int y = sizeof(x) + alignof(x); 1392unaryExprOrTypeTraitExpr() 1393 matches sizeof(x) and alignof(x) 1394</pre></td></tr> 1395 1396 1397<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> 1398<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1399 1400Example matches !a 1401 !a || b 1402</pre></td></tr> 1403 1404 1405<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> 1406<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 1407but could not be resolved to a specific declaration. 1408 1409Given 1410 template<typename T> 1411 T foo() { T a; return a; } 1412 template<typename T> 1413 void bar() { 1414 foo<T>(); 1415 } 1416unresolvedLookupExpr() 1417 matches foo<T>() </pre></td></tr> 1418 1419 1420<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> 1421<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1422 1423Example match: "foo"_suffix 1424</pre></td></tr> 1425 1426 1427<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> 1428<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1429 1430Given 1431 while (true) {} 1432whileStmt() 1433 matches 'while (true) {}'. 1434</pre></td></tr> 1435 1436 1437<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> 1438<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1439 1440Given 1441 template <typename T> struct C {}; 1442 C<int> c; 1443templateArgument() 1444 matches 'int' in C<int>. 1445</pre></td></tr> 1446 1447 1448<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 1449<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 1450 1451Given 1452 template <typename T> class X { }; 1453 X<int> xi; 1454templateName() 1455 matches 'X' in X<int>. 1456</pre></td></tr> 1457 1458 1459<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> 1460<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1461</pre></td></tr> 1462 1463 1464<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> 1465<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1466 1467Given 1468 int a[] = { 2, 3 }; 1469 int b[4]; 1470 void f() { int c[a[0]]; } 1471arrayType() 1472 matches "int a[]", "int b[4]" and "int c[a[0]]"; 1473</pre></td></tr> 1474 1475 1476<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> 1477<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1478 1479Given 1480 _Atomic(int) i; 1481atomicType() 1482 matches "_Atomic(int) i" 1483</pre></td></tr> 1484 1485 1486<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> 1487<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1488 1489Given: 1490 auto n = 4; 1491 int v[] = { 2, 3 } 1492 for (auto i : v) { } 1493autoType() 1494 matches "auto n" and "auto i" 1495</pre></td></tr> 1496 1497 1498<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> 1499<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1500"void (^)(int)". 1501 1502The pointee is always required to be a FunctionType. 1503</pre></td></tr> 1504 1505 1506<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> 1507<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1508 1509Given 1510 struct A {}; 1511 A a; 1512 int b; 1513 float c; 1514 bool d; 1515builtinType() 1516 matches "int b", "float c" and "bool d" 1517</pre></td></tr> 1518 1519 1520<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> 1521<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1522 1523Given 1524 _Complex float f; 1525complexType() 1526 matches "_Complex float f" 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('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 1531<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1532 1533Given 1534 void() { 1535 int a[2]; 1536 int b[] = { 2, 3 }; 1537 int c[b[0]]; 1538 } 1539constantArrayType() 1540 matches "int a[2]" 1541</pre></td></tr> 1542 1543 1544<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> 1545<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1546Example matches i[] in declaration of f. 1547 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1548Example matches i[1]. 1549 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1550 void f(int i[]) { 1551 i[1] = 0; 1552 } 1553</pre></td></tr> 1554 1555 1556<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> 1557<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1558 1559Given 1560 template<typename T, int Size> 1561 class array { 1562 T data[Size]; 1563 }; 1564dependentSizedArrayType 1565 matches "T data[Size]" 1566</pre></td></tr> 1567 1568 1569<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> 1570<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1571qualified name. 1572 1573Given 1574 namespace N { 1575 namespace M { 1576 class D {}; 1577 } 1578 } 1579 class C {}; 1580 1581 class C c; 1582 N::M::D d; 1583 1584elaboratedType() matches the type of the variable declarations of both 1585c and d. 1586</pre></td></tr> 1587 1588 1589<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> 1590<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 1591 1592Given 1593 enum C { Green }; 1594 enum class S { Red }; 1595 1596 C c; 1597 S s; 1598 1599enumType() matches the type of the variable declarations of both c and 1600s. 1601</pre></td></tr> 1602 1603 1604<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> 1605<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 1606 1607Given 1608 int (*f)(int); 1609 void g(); 1610functionProtoType() 1611 matches "int (*f)(int)" and the type of "g" in C++ mode. 1612 In C mode, "g" is not matched because it does not contain a prototype. 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('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 1617<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1618 1619Given 1620 int (*f)(int); 1621 void g(); 1622functionType() 1623 matches "int (*f)(int)" and the type of "g". 1624</pre></td></tr> 1625 1626 1627<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> 1628<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1629 1630Given 1631 int a[] = { 2, 3 }; 1632 int b[42]; 1633 void f(int c[]) { int d[a[0]]; }; 1634incompleteArrayType() 1635 matches "int a[]" and "int c[]" 1636</pre></td></tr> 1637 1638 1639<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> 1640<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1641 1642Example matches S s, but not S<T> s. 1643 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1644 template <typename T> struct S { 1645 void f(S s); 1646 void g(S<T> s); 1647 }; 1648</pre></td></tr> 1649 1650 1651<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> 1652<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1653 1654Given: 1655 int *a; 1656 int &b = *a; 1657 int &&c = 1; 1658 auto &d = b; 1659 auto &&e = c; 1660 auto &&f = 2; 1661 int g = 5; 1662 1663lValueReferenceType() matches the types of b, d, and e. e is 1664matched since the type is deduced as int& by reference collapsing rules. 1665</pre></td></tr> 1666 1667 1668<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> 1669<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1670Given 1671 struct A { int i; } 1672 A::* ptr = A::i; 1673memberPointerType() 1674 matches "A::* ptr" 1675</pre></td></tr> 1676 1677 1678<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> 1679<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1680a pointer type, despite being syntactically similar. 1681 1682Given 1683 int *a; 1684 1685 @interface Foo 1686 @end 1687 Foo *f; 1688pointerType() 1689 matches "Foo *f", but does not match "int *a". 1690</pre></td></tr> 1691 1692 1693<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> 1694<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1695 1696Given 1697 int (*ptr_to_array)[4]; 1698 int *array_of_ptrs[4]; 1699 1700varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1701array_of_ptrs. 1702</pre></td></tr> 1703 1704 1705<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> 1706<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1707types. 1708 1709Given 1710 int *a; 1711 int &b = *a; 1712 int c = 5; 1713 1714 @interface Foo 1715 @end 1716 Foo *f; 1717pointerType() 1718 matches "int *a", but does not match "Foo *f". 1719</pre></td></tr> 1720 1721 1722<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> 1723<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1724 1725Given: 1726 int *a; 1727 int &b = *a; 1728 int &&c = 1; 1729 auto &d = b; 1730 auto &&e = c; 1731 auto &&f = 2; 1732 int g = 5; 1733 1734rValueReferenceType() matches the types of c and f. e is not 1735matched as it is deduced to int& by reference collapsing rules. 1736</pre></td></tr> 1737 1738 1739<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> 1740<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1741 1742Given 1743 class C {}; 1744 struct S {}; 1745 1746 C c; 1747 S s; 1748 1749recordType() matches the type of the variable declarations of both c 1750and s. 1751</pre></td></tr> 1752 1753 1754<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> 1755<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 1756 1757Given 1758 int *a; 1759 int &b = *a; 1760 int &&c = 1; 1761 auto &d = b; 1762 auto &&e = c; 1763 auto &&f = 2; 1764 int g = 5; 1765 1766referenceType() matches the types of b, c, d, e, and f. 1767</pre></td></tr> 1768 1769 1770<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> 1771<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 1772template type parameter. 1773 1774Given 1775 template <typename T> 1776 void F(T t) { 1777 int i = 1 + t; 1778 } 1779 1780substTemplateTypeParmType() matches the type of 't' but not '1' 1781</pre></td></tr> 1782 1783 1784<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 1785<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 1786 1787Given 1788 enum E {}; 1789 class C {}; 1790 1791 E e; 1792 C c; 1793 1794tagType() matches the type of the variable declarations of both e 1795and c. 1796</pre></td></tr> 1797 1798 1799<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> 1800<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 1801 1802Given 1803 template <typename T> 1804 class C { }; 1805 1806 template class C<int>; A 1807 C<char> var; B 1808 1809templateSpecializationType() matches the type of the explicit 1810instantiation in A and the type of the variable declaration in B. 1811</pre></td></tr> 1812 1813 1814<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> 1815<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 1816 1817Example matches T, but not int. 1818 (matcher = templateTypeParmType()) 1819 template <typename T> void f(int i); 1820</pre></td></tr> 1821 1822 1823<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> 1824<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 1825</pre></td></tr> 1826 1827 1828<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> 1829<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 1830 1831Given 1832 typedef int X; 1833typedefType() 1834 matches "typedef int X" 1835</pre></td></tr> 1836 1837 1838<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> 1839<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 1840 1841Given: 1842 typedef __underlying_type(T) type; 1843unaryTransformType() 1844 matches "__underlying_type(T)" 1845</pre></td></tr> 1846 1847 1848<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> 1849<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 1850integer-constant-expression. 1851 1852Given 1853 void f() { 1854 int a[] = { 2, 3 } 1855 int b[42]; 1856 int c[a[0]]; 1857 } 1858variableArrayType() 1859 matches "int c[a[0]]" 1860</pre></td></tr> 1861 1862<!--END_DECL_MATCHERS --> 1863</table> 1864 1865<!-- ======================================================================= --> 1866<h2 id="narrowing-matchers">Narrowing Matchers</h2> 1867<!-- ======================================================================= --> 1868 1869<p>Narrowing matchers match certain attributes on the current node, thus 1870narrowing down the set of nodes of the current type to match on.</p> 1871 1872<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 1873which allow users to create more powerful match expressions.</p> 1874 1875<table> 1876<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 1877<!-- START_NARROWING_MATCHERS --> 1878 1879<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1880<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 1881 1882Usable as: Any Matcher 1883</pre></td></tr> 1884 1885 1886<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1887<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 1888 1889Usable as: Any Matcher 1890</pre></td></tr> 1891 1892 1893<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 1894<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 1895 1896Useful when another matcher requires a child matcher, but there's no 1897additional constraint. This will often be used with an explicit conversion 1898to an internal::Matcher<> type such as TypeMatcher. 1899 1900Example: DeclarationMatcher(anything()) matches all declarations, e.g., 1901"int* p" and "void f()" in 1902 int* p; 1903 void f(); 1904 1905Usable as: Any Matcher 1906</pre></td></tr> 1907 1908 1909<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 1910<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 1911 1912Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 1913 class X {}; 1914 class Y {}; 1915 1916Usable as: Any Matcher 1917</pre></td></tr> 1918 1919 1920<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> 1921<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 1922unary). 1923 1924Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 1925 !(a || b) 1926</pre></td></tr> 1927 1928 1929<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr> 1930<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 1931 1932Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 1933 if (a == b) 1934 a += b; 1935 1936Example 2: matches s1 = s2 1937 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 1938 struct S { S& operator=(const S&); }; 1939 void x() { S s1, s2; s1 = s2; }) 1940</pre></td></tr> 1941 1942 1943<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> 1944<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 1945 1946 1947<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr> 1948<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 1949 1950Given 1951 f('false, 3.14, 42); 1952characterLiteral(equals(0)) 1953 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 1954 match false 1955floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 1956 match 3.14 1957integerLiteral(equals(42)) 1958 matches 42 1959 1960Note that you cannot directly match a negative numeric literal because the 1961minus sign is not part of the literal: It is a unary operator whose operand 1962is the positive numeric literal. Instead, you must use a unaryOperator() 1963matcher to match the minus sign: 1964 1965unaryOperator(hasOperatorName("-"), 1966 hasUnaryOperand(integerLiteral(equals(13)))) 1967 1968Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 1969 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>> 1970</pre></td></tr> 1971 1972 1973<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr> 1974<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 1975 1976 1977<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr> 1978<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 1979 1980 1981<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> 1982<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 1983 1984Given 1985 try { 1986 ... 1987 } catch (int) { 1988 ... 1989 } catch (...) { 1990 ... 1991 } 1992endcode 1993cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 1994</pre></td></tr> 1995 1996 1997<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> 1998<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 1999a specific number of arguments (including absent default arguments). 2000 2001Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2002 void f(int x, int y); 2003 f(0, 0); 2004</pre></td></tr> 2005 2006 2007<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> 2008<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2009</pre></td></tr> 2010 2011 2012<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> 2013<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2014zero initialization. 2015 2016Given 2017void foo() { 2018 struct point { double x; double y; }; 2019 point pt[2] = { { 1.0, 2.0 } }; 2020} 2021initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2022will match the implicit array filler for pt[1]. 2023</pre></td></tr> 2024 2025 2026<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> 2027<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2028 2029Given 2030 struct S { 2031 S(); #1 2032 S(const S &); #2 2033 S(S &&); #3 2034 }; 2035cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2036</pre></td></tr> 2037 2038 2039<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> 2040<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2041 2042Given 2043 struct S { 2044 S(); #1 2045 S(const S &); #2 2046 S(S &&); #3 2047 }; 2048cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2049</pre></td></tr> 2050 2051 2052<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> 2053<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2054 2055Given 2056 struct S { 2057 S(); #1 2058 S(int) {} #2 2059 S(S &&) : S() {} #3 2060 }; 2061 S::S() : S(0) {} #4 2062cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2063#1 or #2. 2064</pre></td></tr> 2065 2066 2067<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> 2068<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with 2069the explicit keyword. 2070 2071Given 2072 struct S { 2073 S(int); #1 2074 explicit S(double); #2 2075 operator int(); #3 2076 explicit operator bool(); #4 2077 }; 2078cxxConstructorDecl(isExplicit()) will match #2, but not #1. 2079cxxConversionDecl(isExplicit()) will match #4, but not #3. 2080</pre></td></tr> 2081 2082 2083<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> 2084<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2085 2086Given 2087 struct S { 2088 S(); #1 2089 S(const S &); #2 2090 S(S &&); #3 2091 }; 2092cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2093</pre></td></tr> 2094 2095 2096<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> 2097<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with 2098the explicit keyword. 2099 2100Given 2101 struct S { 2102 S(int); #1 2103 explicit S(double); #2 2104 operator int(); #3 2105 explicit operator bool(); #4 2106 }; 2107cxxConstructorDecl(isExplicit()) will match #2, but not #1. 2108cxxConversionDecl(isExplicit()) will match #4, but not #3. 2109</pre></td></tr> 2110 2111 2112<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> 2113<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2114opposed to a member. 2115 2116Given 2117 struct B {}; 2118 struct D : B { 2119 int I; 2120 D(int i) : I(i) {} 2121 }; 2122 struct E : B { 2123 E() : B() {} 2124 }; 2125cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 2126 will match E(), but not match D(int). 2127</pre></td></tr> 2128 2129 2130<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> 2131<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 2132opposed to a base. 2133 2134Given 2135 struct B {}; 2136 struct D : B { 2137 int I; 2138 D(int i) : I(i) {} 2139 }; 2140 struct E : B { 2141 E() : B() {} 2142 }; 2143cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 2144 will match D(int), but not match E(). 2145</pre></td></tr> 2146 2147 2148<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> 2149<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 2150code (as opposed to implicitly added by the compiler). 2151 2152Given 2153 struct Foo { 2154 Foo() { } 2155 Foo(int) : foo_("A") { } 2156 string foo_; 2157 }; 2158cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 2159 will match Foo(int), but not Foo() 2160</pre></td></tr> 2161 2162 2163<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> 2164<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 2165 2166Given 2167struct A { 2168 void foo() const; 2169 void bar(); 2170}; 2171 2172cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 2173</pre></td></tr> 2174 2175 2176<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> 2177<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 2178operator. 2179 2180Given 2181struct A { 2182 A &operator=(const A &); 2183 A &operator=(A &&); 2184}; 2185 2186cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 2187the second one. 2188</pre></td></tr> 2189 2190 2191<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> 2192<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 2193 2194Given: 2195 class A final {}; 2196 2197 struct B { 2198 virtual void f(); 2199 }; 2200 2201 struct C : B { 2202 void f() final; 2203 }; 2204matches A and C::f, but not B, C, or B::f 2205</pre></td></tr> 2206 2207 2208<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> 2209<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2210operator. 2211 2212Given 2213struct A { 2214 A &operator=(const A &); 2215 A &operator=(A &&); 2216}; 2217 2218cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2219the first one. 2220</pre></td></tr> 2221 2222 2223<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> 2224<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2225 2226Given 2227 class A { 2228 public: 2229 virtual void x(); 2230 }; 2231 class B : public A { 2232 public: 2233 virtual void x(); 2234 }; 2235 matches B::x 2236</pre></td></tr> 2237 2238 2239<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> 2240<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2241 2242Given 2243 class A { 2244 public: 2245 virtual void x() = 0; 2246 }; 2247 matches A::x 2248</pre></td></tr> 2249 2250 2251<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> 2252<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2253 2254Given 2255 struct S { 2256 S(); #1 2257 S(const S &) = default; #2 2258 S(S &&) = delete; #3 2259 }; 2260cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2261</pre></td></tr> 2262 2263 2264<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> 2265<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual. 2266 2267Given 2268 class A { 2269 public: 2270 virtual void x(); 2271 }; 2272 matches A::x 2273</pre></td></tr> 2274 2275 2276<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> 2277<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2278 2279Given 2280 class A { 2281 public: 2282 virtual void x(); 2283 }; 2284 class B : public A { 2285 public: 2286 void x(); 2287 }; 2288 matches A::x but not B::x 2289</pre></td></tr> 2290 2291 2292<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr> 2293<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 2294 2295Given: 2296 MyClass *p1 = new MyClass[10]; 2297cxxNewExpr(isArray()) 2298 matches the expression 'new MyClass[10]'. 2299</pre></td></tr> 2300 2301 2302<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> 2303<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2304 2305Matches overloaded operator names specified in strings without the 2306"operator" prefix: e.g. "<<". 2307 2308Given: 2309 class A { int operator*(); }; 2310 const A &operator<<(const A &a, const A &b); 2311 A a; 2312 a << a; <-- This matches 2313 2314cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2315specified line and 2316cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2317matches the declaration of A. 2318 2319Usable 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>> 2320</pre></td></tr> 2321 2322 2323<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr> 2324<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 2325 2326Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2327 if (a == b) 2328 a += b; 2329 2330Example 2: matches s1 = s2 2331 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2332 struct S { S& operator=(const S&); }; 2333 void x() { S s1, s2; s1 = s2; }) 2334</pre></td></tr> 2335 2336 2337<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> 2338<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 2339 2340Example matches x (matcher = cxxRecordDecl(hasDefinition())) 2341class x {}; 2342class y; 2343</pre></td></tr> 2344 2345 2346<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> 2347<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2348</pre></td></tr> 2349 2350 2351<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> 2352<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2353static member variable template instantiations. 2354 2355Given 2356 template<typename T> void A(T t) { } 2357 template<> void A(int N) { } 2358functionDecl(isExplicitTemplateSpecialization()) 2359 matches the specialization A<int>(). 2360 2361Usable 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>> 2362</pre></td></tr> 2363 2364 2365<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> 2366<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2367 2368Given: 2369 class A final {}; 2370 2371 struct B { 2372 virtual void f(); 2373 }; 2374 2375 struct C : B { 2376 void f() final; 2377 }; 2378matches A and C::f, but not B, C, or B::f 2379</pre></td></tr> 2380 2381 2382<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> 2383<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2384 2385Given: 2386 auto x = []{}; 2387 2388cxxRecordDecl(isLambda()) matches the implicit class declaration of 2389decltype(x) 2390</pre></td></tr> 2391 2392 2393<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> 2394<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for 2395isSameOrDerivedFrom(hasName(...)). 2396</pre></td></tr> 2397 2398 2399<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> 2400<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2401member variable template instantiations. 2402 2403Given 2404 template <typename T> class X {}; class A {}; X<A> x; 2405or 2406 template <typename T> class X {}; class A {}; template class X<A>; 2407or 2408 template <typename T> class X {}; class A {}; extern template class X<A>; 2409cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2410 matches the template instantiation of X<A>. 2411 2412But given 2413 template <typename T> class X {}; class A {}; 2414 template <> class X<A> {}; X<A> x; 2415cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2416 does not match, as X<A> is an explicit template specialization. 2417 2418Usable 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>> 2419</pre></td></tr> 2420 2421 2422<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> 2423<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2424a specific number of arguments (including absent default arguments). 2425 2426Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2427 void f(int x, int y); 2428 f(0, 0); 2429</pre></td></tr> 2430 2431 2432<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> 2433<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2434 2435Example: matches the implicit cast around 0 2436(matcher = castExpr(hasCastKind(CK_NullToPointer))) 2437 int *p = 0; 2438</pre></td></tr> 2439 2440 2441<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr> 2442<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 2443 2444 2445<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>const ValueT Value</td></tr> 2446<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 2447 2448Given 2449 f('false, 3.14, 42); 2450characterLiteral(equals(0)) 2451 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2452 match false 2453floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2454 match 3.14 2455integerLiteral(equals(42)) 2456 matches 42 2457 2458Note that you cannot directly match a negative numeric literal because the 2459minus sign is not part of the literal: It is a unary operator whose operand 2460is the positive numeric literal. Instead, you must use a unaryOperator() 2461matcher to match the minus sign: 2462 2463unaryOperator(hasOperatorName("-"), 2464 hasUnaryOperand(integerLiteral(equals(13)))) 2465 2466Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2467 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>> 2468</pre></td></tr> 2469 2470 2471<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr> 2472<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 2473 2474 2475<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr> 2476<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 2477 2478 2479<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> 2480<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2481 2482Given 2483 template<typename T> struct C {}; 2484 C<int> c; 2485classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2486 matches C<int>. 2487</pre></td></tr> 2488 2489 2490<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> 2491<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2492child statements. 2493 2494Example: Given 2495 { for (;;) {} } 2496compoundStmt(statementCountIs(0))) 2497 matches '{}' 2498 but does not match the outer compound statement. 2499</pre></td></tr> 2500 2501 2502<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> 2503<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2504 2505Given 2506 int a[42]; 2507 int b[2 * 21]; 2508 int c[41], d[43]; 2509 char *s = "abcd"; 2510 wchar_t *ws = L"abcd"; 2511 char *w = "a"; 2512constantArrayType(hasSize(42)) 2513 matches "int a[42]" and "int b[2 * 21]" 2514stringLiteral(hasSize(4)) 2515 matches "abcd", L"abcd" 2516</pre></td></tr> 2517 2518 2519<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> 2520<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2521declarations. 2522 2523Example: Given 2524 int a, b; 2525 int c; 2526 int d = 2, e; 2527declCountIs(2) 2528 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 2529</pre></td></tr> 2530 2531 2532<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> 2533<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 2534 2535Matches a node if it equals the node previously bound to ID. 2536 2537Given 2538 class X { int a; int b; }; 2539cxxRecordDecl( 2540 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2541 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2542 matches the class X, as a and b have the same type. 2543 2544Note that when multiple matches are involved via forEach* matchers, 2545equalsBoundNodes acts as a filter. 2546For example: 2547compoundStmt( 2548 forEachDescendant(varDecl().bind("d")), 2549 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2550will trigger a match for each combination of variable declaration 2551and reference to that variable declaration within a compound statement. 2552</pre></td></tr> 2553 2554 2555<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> 2556<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 2557 2558Decl has pointer identity in the AST. 2559</pre></td></tr> 2560 2561 2562<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> 2563<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 2564 2565Given 2566 __attribute__((device)) void f() { ... } 2567decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 2568f. If the matcher is use from clang-query, attr::Kind parameter should be 2569passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 2570</pre></td></tr> 2571 2572 2573<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> 2574<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 2575partially matching a given regex. 2576 2577Example matches Y but not X 2578 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2579 #include "ASTMatcher.h" 2580 class X {}; 2581ASTMatcher.h: 2582 class Y {}; 2583 2584Usable 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>> 2585</pre></td></tr> 2586 2587 2588<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> 2589<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 2590 2591Example matches X but not Y 2592 (matcher = cxxRecordDecl(isExpansionInMainFile()) 2593 #include <Y.h> 2594 class X {}; 2595Y.h: 2596 class Y {}; 2597 2598Usable 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>> 2599</pre></td></tr> 2600 2601 2602<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> 2603<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 2604 2605Example matches Y but not X 2606 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2607 #include <SystemHeader.h> 2608 class X {}; 2609SystemHeader.h: 2610 class Y {}; 2611 2612Usable 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>> 2613</pre></td></tr> 2614 2615 2616<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> 2617<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 2618by the compiler (eg. implicit defaultcopy constructors). 2619</pre></td></tr> 2620 2621 2622<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> 2623<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. 2624 2625Given 2626 class C { 2627 public: int a; 2628 protected: int b; 2629 private: int c; 2630 }; 2631fieldDecl(isPrivate()) 2632 matches 'int c;' 2633</pre></td></tr> 2634 2635 2636<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> 2637<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations. 2638 2639Given 2640 class C { 2641 public: int a; 2642 protected: int b; 2643 private: int c; 2644 }; 2645fieldDecl(isProtected()) 2646 matches 'int b;' 2647</pre></td></tr> 2648 2649 2650<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> 2651<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations. 2652 2653Given 2654 class C { 2655 public: int a; 2656 protected: int b; 2657 private: int c; 2658 }; 2659fieldDecl(isPublic()) 2660 matches 'int a;' 2661</pre></td></tr> 2662 2663 2664<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> 2665<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 2666a specific number of designators. 2667 2668Example: Given 2669 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 2670 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 2671designatorCountIs(2) 2672 matches '{ [2].y = 1.0, [0].x = 1.0 }', 2673 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 2674</pre></td></tr> 2675 2676 2677<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr> 2678<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 2679 2680Example matches Y (matcher = enumDecl(isScoped())) 2681enum X {}; 2682enum class Y {}; 2683</pre></td></tr> 2684 2685 2686<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 2687<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 2688bit width. 2689 2690Given 2691 class C { 2692 int a : 2; 2693 int b : 4; 2694 int c : 2; 2695 }; 2696fieldDecl(hasBitWidth(2)) 2697 matches 'int a;' and 'int c;' but not 'int b;'. 2698</pre></td></tr> 2699 2700 2701<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 2702<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 2703 2704Given 2705 class C { 2706 int a : 2; 2707 int b; 2708 }; 2709fieldDecl(isBitField()) 2710 matches 'int a;' but not 'int b;'. 2711</pre></td></tr> 2712 2713 2714<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>const ValueT Value</td></tr> 2715<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 2716 2717Given 2718 f('false, 3.14, 42); 2719characterLiteral(equals(0)) 2720 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2721 match false 2722floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2723 match 3.14 2724integerLiteral(equals(42)) 2725 matches 42 2726 2727Note that you cannot directly match a negative numeric literal because the 2728minus sign is not part of the literal: It is a unary operator whose operand 2729is the positive numeric literal. Instead, you must use a unaryOperator() 2730matcher to match the minus sign: 2731 2732unaryOperator(hasOperatorName("-"), 2733 hasUnaryOperand(integerLiteral(equals(13)))) 2734 2735Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2736 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>> 2737</pre></td></tr> 2738 2739 2740<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr> 2741<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 2742 2743 2744<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> 2745<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 2746 2747Given: 2748 void f(); 2749 void g() noexcept; 2750 void h() noexcept(true); 2751 void i() noexcept(false); 2752 void j() throw(); 2753 void k() throw(int); 2754 void l() throw(...); 2755functionDecl(hasDynamicExceptionSpec()) and 2756 functionProtoType(hasDynamicExceptionSpec()) 2757 match the declarations of j, k, and l, but not f, g, h, or i. 2758</pre></td></tr> 2759 2760 2761<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> 2762<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 2763 2764Matches overloaded operator names specified in strings without the 2765"operator" prefix: e.g. "<<". 2766 2767Given: 2768 class A { int operator*(); }; 2769 const A &operator<<(const A &a, const A &b); 2770 A a; 2771 a << a; <-- This matches 2772 2773cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2774specified line and 2775cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2776matches the declaration of A. 2777 2778Usable 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>> 2779</pre></td></tr> 2780 2781 2782<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr> 2783<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 2784 2785Example matches Y (matcher = functionDecl(hasTrailingReturn())) 2786int X() {} 2787auto Y() -> int {} 2788</pre></td></tr> 2789 2790 2791<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> 2792<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations. 2793 2794Given: 2795 constexpr int foo = 42; 2796 constexpr int bar(); 2797varDecl(isConstexpr()) 2798 matches the declaration of foo. 2799functionDecl(isConstexpr()) 2800 matches the declaration of bar. 2801</pre></td></tr> 2802 2803 2804<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> 2805<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 2806 2807Given: 2808 class A { ~A(); }; 2809 class B { ~B() = default; }; 2810functionDecl(isDefaulted()) 2811 matches the declaration of ~B, but not ~A. 2812</pre></td></tr> 2813 2814 2815<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr> 2816<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 2817 2818Example matches A, va, fa 2819 class A {}; 2820 class B; Doesn't match, as it has no body. 2821 int va; 2822 extern int vb; Doesn't match, as it doesn't define the variable. 2823 void fa() {} 2824 void fb(); Doesn't match, as it has no body. 2825 @interface X 2826 - (void)ma; Doesn't match, interface is declaration. 2827 @end 2828 @implementation X 2829 - (void)ma {} 2830 @end 2831 2832Usable 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>>, 2833 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 2834</pre></td></tr> 2835 2836 2837<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> 2838<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 2839 2840Given: 2841 void Func(); 2842 void DeletedFunc() = delete; 2843functionDecl(isDeleted()) 2844 matches the declaration of DeletedFunc, but not Func. 2845</pre></td></tr> 2846 2847 2848<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> 2849<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 2850static member variable template instantiations. 2851 2852Given 2853 template<typename T> void A(T t) { } 2854 template<> void A(int N) { } 2855functionDecl(isExplicitTemplateSpecialization()) 2856 matches the specialization A<int>(). 2857 2858Usable 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>> 2859</pre></td></tr> 2860 2861 2862<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> 2863<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 2864 2865Given: 2866 extern "C" void f() {} 2867 extern "C" { void g() {} } 2868 void h() {} 2869 extern "C" int x = 1; 2870 extern "C" int y = 2; 2871 int z = 3; 2872functionDecl(isExternC()) 2873 matches the declaration of f and g, but not the declaration of h. 2874varDecl(isExternC()) 2875 matches the declaration of x and y, but not the declaration of z. 2876</pre></td></tr> 2877 2878 2879<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> 2880<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 2881the inline keyword. 2882 2883Given 2884 inline void f(); 2885 void g(); 2886 namespace n { 2887 inline namespace m {} 2888 } 2889functionDecl(isInline()) will match ::f(). 2890namespaceDecl(isInline()) will match n::m. 2891</pre></td></tr> 2892 2893 2894<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> 2895<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 2896 2897Given 2898 void nope(); 2899 [[noreturn]] void a(); 2900 __attribute__((noreturn)) void b(); 2901 struct c { [[noreturn]] c(); }; 2902functionDecl(isNoReturn()) 2903 matches all of those except 2904 void nope(); 2905</pre></td></tr> 2906 2907 2908<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> 2909<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 2910 2911Given: 2912 void f(); 2913 void g() noexcept; 2914 void h() throw(); 2915 void i() throw(int); 2916 void j() noexcept(false); 2917functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2918 match the declarations of g, and h, but not f, i or j. 2919</pre></td></tr> 2920 2921 2922<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> 2923<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage 2924class specifier ("static" keyword) written in the source. 2925 2926Given: 2927 static void f() {} 2928 static int i = 0; 2929 extern int j; 2930 int k; 2931functionDecl(isStaticStorageClass()) 2932 matches the function declaration f. 2933varDecl(isStaticStorageClass()) 2934 matches the variable declaration i. 2935</pre></td></tr> 2936 2937 2938<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> 2939<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 2940member variable template instantiations. 2941 2942Given 2943 template <typename T> class X {}; class A {}; X<A> x; 2944or 2945 template <typename T> class X {}; class A {}; template class X<A>; 2946or 2947 template <typename T> class X {}; class A {}; extern template class X<A>; 2948cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2949 matches the template instantiation of X<A>. 2950 2951But given 2952 template <typename T> class X {}; class A {}; 2953 template <> class X<A> {}; X<A> x; 2954cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2955 does not match, as X<A> is an explicit template specialization. 2956 2957Usable 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>> 2958</pre></td></tr> 2959 2960 2961<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> 2962<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 2963 2964Example matches f, but not g or h. The function i will not match, even when 2965compiled in C mode. 2966 void f(...); 2967 void g(int); 2968 template <typename... Ts> void h(Ts...); 2969 void i(); 2970</pre></td></tr> 2971 2972 2973<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> 2974<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2975specific parameter count. 2976 2977Given 2978 void f(int i) {} 2979 void g(int i, int j) {} 2980 void h(int i, int j); 2981 void j(int i); 2982 void k(int x, int y, int z, ...); 2983functionDecl(parameterCountIs(2)) 2984 matches g and h 2985functionProtoType(parameterCountIs(2)) 2986 matches g and h 2987functionProtoType(parameterCountIs(3)) 2988 matches k 2989</pre></td></tr> 2990 2991 2992<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> 2993<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 2994 2995Given: 2996 void f(); 2997 void g() noexcept; 2998 void h() noexcept(true); 2999 void i() noexcept(false); 3000 void j() throw(); 3001 void k() throw(int); 3002 void l() throw(...); 3003functionDecl(hasDynamicExceptionSpec()) and 3004 functionProtoType(hasDynamicExceptionSpec()) 3005 match the declarations of j, k, and l, but not f, g, h, or i. 3006</pre></td></tr> 3007 3008 3009<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> 3010<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 3011 3012Given: 3013 void f(); 3014 void g() noexcept; 3015 void h() throw(); 3016 void i() throw(int); 3017 void j() noexcept(false); 3018functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3019 match the declarations of g, and h, but not f, i or j. 3020</pre></td></tr> 3021 3022 3023<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> 3024<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3025specific parameter count. 3026 3027Given 3028 void f(int i) {} 3029 void g(int i, int j) {} 3030 void h(int i, int j); 3031 void j(int i); 3032 void k(int x, int y, int z, ...); 3033functionDecl(parameterCountIs(2)) 3034 matches g and h 3035functionProtoType(parameterCountIs(2)) 3036 matches g and h 3037functionProtoType(parameterCountIs(3)) 3038 matches k 3039</pre></td></tr> 3040 3041 3042<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr> 3043<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 3044 3045 3046<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>const ValueT Value</td></tr> 3047<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 3048 3049Given 3050 f('false, 3.14, 42); 3051characterLiteral(equals(0)) 3052 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3053 match false 3054floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3055 match 3.14 3056integerLiteral(equals(42)) 3057 matches 42 3058 3059Note that you cannot directly match a negative numeric literal because the 3060minus sign is not part of the literal: It is a unary operator whose operand 3061is the positive numeric literal. Instead, you must use a unaryOperator() 3062matcher to match the minus sign: 3063 3064unaryOperator(hasOperatorName("-"), 3065 hasUnaryOperand(integerLiteral(equals(13)))) 3066 3067Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3068 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>> 3069</pre></td></tr> 3070 3071 3072<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr> 3073<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 3074 3075 3076<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr> 3077<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 3078 3079 3080<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> 3081<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 3082to '.'. 3083 3084Member calls on the implicit this pointer match as called with '->'. 3085 3086Given 3087 class Y { 3088 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3089 int a; 3090 static int b; 3091 }; 3092memberExpr(isArrow()) 3093 matches this->x, x, y.x, a, this->b 3094</pre></td></tr> 3095 3096 3097<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr> 3098<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 3099 3100Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 3101void f() { 3102 int x; 3103 static int y; 3104} 3105int z; 3106 3107Example matches f() because it has external formal linkage despite being 3108unique to the translation unit as though it has internal likage 3109(matcher = functionDecl(hasExternalFormalLinkage())) 3110 3111namespace { 3112void f() {} 3113} 3114</pre></td></tr> 3115 3116 3117<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>const std::string Name</td></tr> 3118<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 3119 3120Supports specifying enclosing namespaces or classes by prefixing the name 3121with '<enclosing>::'. 3122Does not match typedefs of an underlying type with the given name. 3123 3124Example matches X (Name == "X") 3125 class X; 3126 3127Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 3128 namespace a { namespace b { class X; } } 3129</pre></td></tr> 3130 3131 3132<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> 3133<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 3134a substring matched by the given RegExp. 3135 3136Supports specifying enclosing namespaces or classes by 3137prefixing the name with '<enclosing>::'. Does not match typedefs 3138of an underlying type with the given name. 3139 3140Example matches X (regexp == "::X") 3141 class X; 3142 3143Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3144 namespace foo { namespace bar { class X; } } 3145</pre></td></tr> 3146 3147 3148<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> 3149<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3150 3151Given 3152 namespace n { 3153 namespace {} #1 3154 } 3155namespaceDecl(isAnonymous()) will match #1 but not ::n. 3156</pre></td></tr> 3157 3158 3159<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> 3160<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3161the inline keyword. 3162 3163Given 3164 inline void f(); 3165 void g(); 3166 namespace n { 3167 inline namespace m {} 3168 } 3169functionDecl(isInline()) will match ::f(). 3170namespaceDecl(isInline()) will match n::m. 3171</pre></td></tr> 3172 3173 3174<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> 3175<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3176a specific number of arguments (including absent default arguments). 3177 3178Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3179 void f(int x, int y); 3180 f(0, 0); 3181</pre></td></tr> 3182 3183 3184<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> 3185<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3186 3187objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3188message expression in 3189 3190 UIWebView *webView = ...; 3191 CGRect bodyFrame = webView.frame; 3192 bodyFrame.size.height = self.bodyContentHeight; 3193 webView.frame = bodyFrame; 3194 ^---- matches here 3195</pre></td></tr> 3196 3197 3198<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> 3199<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3200 3201Matches only when the selector of the objCMessageExpr is NULL. This may 3202represent an error condition in the tree! 3203</pre></td></tr> 3204 3205 3206<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> 3207<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3208 3209 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3210 matches the outer message expr in the code below, but NOT the message 3211 invocation for self.bodyView. 3212 [self.bodyView loadHTMLString:html baseURL:NULL]; 3213</pre></td></tr> 3214 3215 3216<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> 3217<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3218 3219 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3220 matches self.bodyView in the code below, but NOT the outer message 3221 invocation of "loadHTMLString:baseURL:". 3222 [self.bodyView loadHTMLString:html baseURL:NULL]; 3223</pre></td></tr> 3224 3225 3226<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> 3227<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 3228a substring matched by the given RegExp. 3229 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 3230 invocation for self.bodyView. 3231 [self.bodyView loadHTMLString:html baseURL:NULL]; 3232</pre></td></tr> 3233 3234 3235<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> 3236<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 3237 3238 matcher = objCMessageExpr(numSelectorArgs(0)); 3239 matches self.bodyView in the code below 3240 3241 matcher = objCMessageExpr(numSelectorArgs(2)); 3242 matches the invocation of "loadHTMLString:baseURL:" but not that 3243 of self.bodyView 3244 [self.bodyView loadHTMLString:html baseURL:NULL]; 3245</pre></td></tr> 3246 3247 3248<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 3249<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 3250 3251Example matches A, va, fa 3252 class A {}; 3253 class B; Doesn't match, as it has no body. 3254 int va; 3255 extern int vb; Doesn't match, as it doesn't define the variable. 3256 void fa() {} 3257 void fb(); Doesn't match, as it has no body. 3258 @interface X 3259 - (void)ma; Doesn't match, interface is declaration. 3260 @end 3261 @implementation X 3262 - (void)ma {} 3263 @end 3264 3265Usable 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>>, 3266 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3267</pre></td></tr> 3268 3269 3270<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr> 3271<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 3272 3273Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 3274void x(int val) {} 3275void y(int val = 0) {} 3276</pre></td></tr> 3277 3278 3279<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> 3280<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 3281 3282Given 3283 class Y { public: void x(); }; 3284 void z() { Y* y; y->x(); } 3285cxxMemberCallExpr(on(hasType(asString("class Y *")))) 3286 matches y->x() 3287</pre></td></tr> 3288 3289 3290<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> 3291<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 3292 3293Matches a node if it equals the node previously bound to ID. 3294 3295Given 3296 class X { int a; int b; }; 3297cxxRecordDecl( 3298 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3299 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3300 matches the class X, as a and b have the same type. 3301 3302Note that when multiple matches are involved via forEach* matchers, 3303equalsBoundNodes acts as a filter. 3304For example: 3305compoundStmt( 3306 forEachDescendant(varDecl().bind("d")), 3307 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3308will trigger a match for each combination of variable declaration 3309and reference to that variable declaration within a compound statement. 3310</pre></td></tr> 3311 3312 3313<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> 3314<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 3315the node, not hidden within a typedef. 3316 3317Given 3318 typedef const int const_int; 3319 const_int i; 3320 int *const j; 3321 int *volatile k; 3322 int m; 3323varDecl(hasType(hasLocalQualifiers())) matches only j and k. 3324i is const-qualified but the qualifier is not local. 3325</pre></td></tr> 3326 3327 3328<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> 3329<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 3330 3331Given 3332 void a(char); 3333 void b(wchar_t); 3334 void c(double); 3335functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 3336matches "a(char)", "b(wchar_t)", but not "c(double)". 3337</pre></td></tr> 3338 3339 3340<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> 3341<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 3342the Objective-C object pointer type, which is different despite being 3343syntactically similar. 3344 3345Given 3346 int *i = nullptr; 3347 3348 @interface Foo 3349 @end 3350 Foo *f; 3351 3352 int j; 3353varDecl(hasType(isAnyPointer())) 3354 matches "int *i" and "Foo *f", but not "int j". 3355</pre></td></tr> 3356 3357 3358<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> 3359<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 3360include "top-level" const. 3361 3362Given 3363 void a(int); 3364 void b(int const); 3365 void c(const int); 3366 void d(const int*); 3367 void e(int const) {}; 3368functionDecl(hasAnyParameter(hasType(isConstQualified()))) 3369 matches "void b(int const)", "void c(const int)" and 3370 "void e(int const) {}". It does not match d as there 3371 is no top-level const on the parameter type "const int *". 3372</pre></td></tr> 3373 3374 3375<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> 3376<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 3377 3378Given 3379 void a(int); 3380 void b(long); 3381 void c(double); 3382functionDecl(hasAnyParameter(hasType(isInteger()))) 3383matches "a(int)", "b(long)", but not "c(double)". 3384</pre></td></tr> 3385 3386 3387<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 3388<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 3389 3390Given 3391 void a(int); 3392 void b(unsigned long); 3393 void c(double); 3394functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 3395matches "a(int)", but not "b(unsigned long)" and "c(double)". 3396</pre></td></tr> 3397 3398 3399<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 3400<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 3401 3402Given 3403 void a(int); 3404 void b(unsigned long); 3405 void c(double); 3406functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 3407matches "b(unsigned long)", but not "a(int)" and "c(double)". 3408</pre></td></tr> 3409 3410 3411<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> 3412<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 3413include "top-level" volatile. 3414 3415Given 3416 void a(int); 3417 void b(int volatile); 3418 void c(volatile int); 3419 void d(volatile int*); 3420 void e(int volatile) {}; 3421functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 3422 matches "void b(int volatile)", "void c(volatile int)" and 3423 "void e(int volatile) {}". It does not match d as there 3424 is no top-level volatile on the parameter type "volatile int *". 3425</pre></td></tr> 3426 3427 3428<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> 3429<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 3430 3431Example matches C, but not S or U. 3432 struct S {}; 3433 class C {}; 3434 union U {}; 3435</pre></td></tr> 3436 3437 3438<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> 3439<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 3440 3441Example matches S, but not C or U. 3442 struct S {}; 3443 class C {}; 3444 union U {}; 3445</pre></td></tr> 3446 3447 3448<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> 3449<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 3450 3451Example matches U, but not C or S. 3452 struct S {}; 3453 class C {}; 3454 union U {}; 3455</pre></td></tr> 3456 3457 3458<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> 3459<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 3460 3461Matches a node if it equals the node previously bound to ID. 3462 3463Given 3464 class X { int a; int b; }; 3465cxxRecordDecl( 3466 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3467 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3468 matches the class X, as a and b have the same type. 3469 3470Note that when multiple matches are involved via forEach* matchers, 3471equalsBoundNodes acts as a filter. 3472For example: 3473compoundStmt( 3474 forEachDescendant(varDecl().bind("d")), 3475 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3476will trigger a match for each combination of variable declaration 3477and reference to that variable declaration within a compound statement. 3478</pre></td></tr> 3479 3480 3481<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> 3482<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 3483 3484Stmt has pointer identity in the AST. 3485</pre></td></tr> 3486 3487 3488<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> 3489<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 3490partially matching a given regex. 3491 3492Example matches Y but not X 3493 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3494 #include "ASTMatcher.h" 3495 class X {}; 3496ASTMatcher.h: 3497 class Y {}; 3498 3499Usable 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>> 3500</pre></td></tr> 3501 3502 3503<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> 3504<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 3505 3506Example matches X but not Y 3507 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3508 #include <Y.h> 3509 class X {}; 3510Y.h: 3511 class Y {}; 3512 3513Usable 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>> 3514</pre></td></tr> 3515 3516 3517<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> 3518<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 3519 3520Example matches Y but not X 3521 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3522 #include <SystemHeader.h> 3523 class X {}; 3524SystemHeader.h: 3525 class Y {}; 3526 3527Usable 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>> 3528</pre></td></tr> 3529 3530 3531<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> 3532<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 3533 3534Given 3535 int a[42]; 3536 int b[2 * 21]; 3537 int c[41], d[43]; 3538 char *s = "abcd"; 3539 wchar_t *ws = L"abcd"; 3540 char *w = "a"; 3541constantArrayType(hasSize(42)) 3542 matches "int a[42]" and "int b[2 * 21]" 3543stringLiteral(hasSize(4)) 3544 matches "abcd", L"abcd" 3545</pre></td></tr> 3546 3547 3548<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> 3549<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 3550 3551Example matches A, va, fa 3552 class A {}; 3553 class B; Doesn't match, as it has no body. 3554 int va; 3555 extern int vb; Doesn't match, as it doesn't define the variable. 3556 void fa() {} 3557 void fb(); Doesn't match, as it has no body. 3558 @interface X 3559 - (void)ma; Doesn't match, interface is declaration. 3560 @end 3561 @implementation X 3562 - (void)ma {} 3563 @end 3564 3565Usable 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>>, 3566 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3567</pre></td></tr> 3568 3569 3570<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> 3571<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 3572 3573Note that 'Value' is a string as the template argument's value is 3574an arbitrary precision integer. 'Value' must be euqal to the canonical 3575representation of that integral value in base 10. 3576 3577Given 3578 template<int T> struct C {}; 3579 C<42> c; 3580classTemplateSpecializationDecl( 3581 hasAnyTemplateArgument(equalsIntegralValue("42"))) 3582 matches the implicit instantiation of C in C<42>. 3583</pre></td></tr> 3584 3585 3586<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> 3587<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 3588 3589Given 3590 template<int T> struct C {}; 3591 C<42> c; 3592classTemplateSpecializationDecl( 3593 hasAnyTemplateArgument(isIntegral())) 3594 matches the implicit instantiation of C in C<42> 3595 with isIntegral() matching 42. 3596</pre></td></tr> 3597 3598 3599<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> 3600<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 3601 3602Given 3603 template<typename T> struct C {}; 3604 C<int> c; 3605classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3606 matches C<int>. 3607</pre></td></tr> 3608 3609 3610<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> 3611<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 3612partially matching a given regex. 3613 3614Example matches Y but not X 3615 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3616 #include "ASTMatcher.h" 3617 class X {}; 3618ASTMatcher.h: 3619 class Y {}; 3620 3621Usable 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>> 3622</pre></td></tr> 3623 3624 3625<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> 3626<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 3627 3628Example matches X but not Y 3629 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3630 #include <Y.h> 3631 class X {}; 3632Y.h: 3633 class Y {}; 3634 3635Usable 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>> 3636</pre></td></tr> 3637 3638 3639<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> 3640<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 3641 3642Example matches Y but not X 3643 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3644 #include <SystemHeader.h> 3645 class X {}; 3646SystemHeader.h: 3647 class Y {}; 3648 3649Usable 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>> 3650</pre></td></tr> 3651 3652 3653<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> 3654<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 3655 3656Given 3657 struct S { bool func(); }; 3658functionDecl(returns(booleanType())) 3659 matches "bool func();" 3660</pre></td></tr> 3661 3662 3663<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> 3664<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 3665 3666Matches a node if it equals the node previously bound to ID. 3667 3668Given 3669 class X { int a; int b; }; 3670cxxRecordDecl( 3671 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3672 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3673 matches the class X, as a and b have the same type. 3674 3675Note that when multiple matches are involved via forEach* matchers, 3676equalsBoundNodes acts as a filter. 3677For example: 3678compoundStmt( 3679 forEachDescendant(varDecl().bind("d")), 3680 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3681will trigger a match for each combination of variable declaration 3682and reference to that variable declaration within a compound statement. 3683</pre></td></tr> 3684 3685 3686<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> 3687<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 3688 3689Type has pointer identity in the AST. 3690</pre></td></tr> 3691 3692 3693<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> 3694<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 3695 3696Given 3697 int i; 3698 float f; 3699realFloatingPointType() 3700 matches "float f" but not "int i" 3701</pre></td></tr> 3702 3703 3704<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> 3705<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 3706 3707Given 3708 struct S { void func(); }; 3709functionDecl(returns(voidType())) 3710 matches "void func();" 3711</pre></td></tr> 3712 3713 3714<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> 3715<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 3716 3717Given 3718 int x; 3719 int s = sizeof(x) + alignof(x) 3720unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 3721 matches sizeof(x) 3722</pre></td></tr> 3723 3724 3725<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> 3726<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3727unary). 3728 3729Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3730 !(a || b) 3731</pre></td></tr> 3732 3733 3734<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> 3735<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 3736 3737Example matches x, but not y, z, or a. 3738(matcher = varDecl(hasAutomaticStorageDuration()) 3739void f() { 3740 int x; 3741 static int y; 3742 thread_local int z; 3743} 3744int a; 3745</pre></td></tr> 3746 3747 3748<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> 3749<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 3750 3751Example matches y and z (matcher = varDecl(hasGlobalStorage()) 3752void f() { 3753 int x; 3754 static int y; 3755} 3756int z; 3757</pre></td></tr> 3758 3759 3760<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> 3761<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 3762non-static local variable. 3763 3764Example matches x (matcher = varDecl(hasLocalStorage()) 3765void f() { 3766 int x; 3767 static int y; 3768} 3769int z; 3770</pre></td></tr> 3771 3772 3773<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> 3774<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 3775It includes the variable declared at namespace scope and those declared 3776with "static" and "extern" storage class specifiers. 3777 3778void f() { 3779 int x; 3780 static int y; 3781 thread_local int z; 3782} 3783int a; 3784static int b; 3785extern int c; 3786varDecl(hasStaticStorageDuration()) 3787 matches the function declaration y, a, b and c. 3788</pre></td></tr> 3789 3790 3791<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> 3792<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 3793 3794Example matches z, but not x, z, or a. 3795(matcher = varDecl(hasThreadStorageDuration()) 3796void f() { 3797 int x; 3798 static int y; 3799 thread_local int z; 3800} 3801int a; 3802</pre></td></tr> 3803 3804 3805<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> 3806<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. 3807 3808Given: 3809 constexpr int foo = 42; 3810 constexpr int bar(); 3811varDecl(isConstexpr()) 3812 matches the declaration of foo. 3813functionDecl(isConstexpr()) 3814 matches the declaration of bar. 3815</pre></td></tr> 3816 3817 3818<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> 3819<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 3820 3821Example matches A, va, fa 3822 class A {}; 3823 class B; Doesn't match, as it has no body. 3824 int va; 3825 extern int vb; Doesn't match, as it doesn't define the variable. 3826 void fa() {} 3827 void fb(); Doesn't match, as it has no body. 3828 @interface X 3829 - (void)ma; Doesn't match, interface is declaration. 3830 @end 3831 @implementation X 3832 - (void)ma {} 3833 @end 3834 3835Usable 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>>, 3836 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3837</pre></td></tr> 3838 3839 3840<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> 3841<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 3842a C++ catch block, or an Objective-C statement. 3843 3844Example matches x (matcher = varDecl(isExceptionVariable()) 3845void f(int y) { 3846 try { 3847 } catch (int x) { 3848 } 3849} 3850</pre></td></tr> 3851 3852 3853<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> 3854<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 3855static member variable template instantiations. 3856 3857Given 3858 template<typename T> void A(T t) { } 3859 template<> void A(int N) { } 3860functionDecl(isExplicitTemplateSpecialization()) 3861 matches the specialization A<int>(). 3862 3863Usable 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>> 3864</pre></td></tr> 3865 3866 3867<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr> 3868<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 3869 3870Given: 3871 extern "C" void f() {} 3872 extern "C" { void g() {} } 3873 void h() {} 3874 extern "C" int x = 1; 3875 extern "C" int y = 2; 3876 int z = 3; 3877functionDecl(isExternC()) 3878 matches the declaration of f and g, but not the declaration of h. 3879varDecl(isExternC()) 3880 matches the declaration of x and y, but not the declaration of z. 3881</pre></td></tr> 3882 3883 3884<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr> 3885<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage 3886class specifier ("static" keyword) written in the source. 3887 3888Given: 3889 static void f() {} 3890 static int i = 0; 3891 extern int j; 3892 int k; 3893functionDecl(isStaticStorageClass()) 3894 matches the function declaration f. 3895varDecl(isStaticStorageClass()) 3896 matches the variable declaration i. 3897</pre></td></tr> 3898 3899 3900<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> 3901<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 3902member variable template instantiations. 3903 3904Given 3905 template <typename T> class X {}; class A {}; X<A> x; 3906or 3907 template <typename T> class X {}; class A {}; template class X<A>; 3908or 3909 template <typename T> class X {}; class A {}; extern template class X<A>; 3910cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3911 matches the template instantiation of X<A>. 3912 3913But given 3914 template <typename T> class X {}; class A {}; 3915 template <> class X<A> {}; X<A> x; 3916cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3917 does not match, as X<A> is an explicit template specialization. 3918 3919Usable 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>> 3920</pre></td></tr> 3921 3922 3923<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> 3924<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3925template instantiations. 3926 3927Given 3928 template<typename T> void A(T t) { T i; } 3929 A(0); 3930 A(0U); 3931functionDecl(isInstantiated()) 3932 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3933</pre></td></tr> 3934 3935 3936<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> 3937<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3938GNU's __null, C++11's nullptr, or C's NULL macro. 3939 3940Given: 3941 void *v1 = NULL; 3942 void *v2 = nullptr; 3943 void *v3 = __null; GNU extension 3944 char *cp = (char *)0; 3945 int *ip = 0; 3946 int i = 0; 3947expr(nullPointerConstant()) 3948 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3949 initializer for i. 3950</pre></td></tr> 3951 3952 3953<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> 3954<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3955 3956This matcher is only provided as a performance optimization of hasName. 3957 hasAnyName(a, b, c) 3958 is equivalent to, but faster than 3959 anyOf(hasName(a), hasName(b), hasName(c)) 3960</pre></td></tr> 3961 3962 3963<tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>></td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr> 3964<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 3965Selector.getAsString() 3966 3967 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 3968 matches both of the expressions below: 3969 [myObj methodA:argA]; 3970 [myObj methodB:argB]; 3971</pre></td></tr> 3972 3973 3974<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> 3975<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 3976 3977Given 3978 int j; 3979 template<typename T> void A(T t) { T i; j += 42;} 3980 A(0); 3981 A(0U); 3982declStmt(isInTemplateInstantiation()) 3983 matches 'int i;' and 'unsigned i'. 3984unless(stmt(isInTemplateInstantiation())) 3985 will NOT match j += 42; as it's shared between the template definition and 3986 instantiation. 3987</pre></td></tr> 3988 3989<!--END_NARROWING_MATCHERS --> 3990</table> 3991 3992<!-- ======================================================================= --> 3993<h2 id="traversal-matchers">AST Traversal Matchers</h2> 3994<!-- ======================================================================= --> 3995 3996<p>Traversal matchers specify the relationship to other nodes that are 3997reachable from the current node.</p> 3998 3999<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 4000forEachDescendant) which work on all nodes and allow users to write more generic 4001match expressions.</p> 4002 4003<table> 4004<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 4005<!-- START_TRAVERSAL_MATCHERS --> 4006 4007<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4008<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 4009 4010Unlike anyOf, eachOf will generate a match result for each 4011matching submatcher. 4012 4013For example, in: 4014 class A { int a; int b; }; 4015The matcher: 4016 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 4017 has(fieldDecl(hasName("b")).bind("v")))) 4018will generate two results binding "v", the first of which binds 4019the field declaration of a, the second the field declaration of 4020b. 4021 4022Usable as: Any Matcher 4023</pre></td></tr> 4024 4025 4026<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 4027<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4028provided matcher. 4029 4030Example matches X, A, A::X, B, B::C, B::C::X 4031 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 4032 class X {}; 4033 class A { class X {}; }; Matches A, because A::X is a class of name 4034 X inside A. 4035 class B { class C { class X {}; }; }; 4036 4037DescendantT must be an AST base type. 4038 4039As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 4040each result that matches instead of only on the first one. 4041 4042Note: Recursively combined ForEachDescendant can cause many matches: 4043 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 4044 forEachDescendant(cxxRecordDecl()) 4045 ))) 4046will match 10 times (plus injected class name matches) on: 4047 class A { class B { class C { class D { class E {}; }; }; }; }; 4048 4049Usable as: Any Matcher 4050</pre></td></tr> 4051 4052 4053<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 4054<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 4055provided matcher. 4056 4057Example matches X, Y, Y::X, Z::Y, Z::Y::X 4058 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 4059 class X {}; 4060 class Y { class X {}; }; Matches Y, because Y::X is a class of name X 4061 inside Y. 4062 class Z { class Y { class X {}; }; }; Does not match Z. 4063 4064ChildT must be an AST base type. 4065 4066As opposed to 'has', 'forEach' will cause a match for each result that 4067matches instead of only on the first one. 4068 4069Usable as: Any Matcher 4070</pre></td></tr> 4071 4072 4073<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 4074<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 4075matcher. 4076 4077Given 4078void f() { if (true) { int x = 42; } } 4079void g() { for (;;) { int x = 43; } } 4080expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 4081 4082Usable as: Any Matcher 4083</pre></td></tr> 4084 4085 4086<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 4087<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4088provided matcher. 4089 4090Example matches X, Y, Z 4091 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 4092 class X {}; Matches X, because X::X is a class of name X inside X. 4093 class Y { class X {}; }; 4094 class Z { class Y { class X {}; }; }; 4095 4096DescendantT must be an AST base type. 4097 4098Usable as: Any Matcher 4099</pre></td></tr> 4100 4101 4102<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 4103<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 4104provided matcher. 4105 4106Example matches X, Y 4107 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 4108 class X {}; Matches X, because X::X is a class of name X inside X. 4109 class Y { class X {}; }; 4110 class Z { class Y { class X {}; }; }; Does not match Z. 4111 4112ChildT must be an AST base type. 4113 4114Usable as: Any Matcher 4115Note that has is direct matcher, so it also matches things like implicit 4116casts and paren casts. If you are matching with expr then you should 4117probably consider using ignoringParenImpCasts like: 4118has(ignoringParenImpCasts(expr())). 4119</pre></td></tr> 4120 4121 4122<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 4123<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 4124matcher. 4125 4126Given 4127void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 4128compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 4129 4130Usable as: Any Matcher 4131</pre></td></tr> 4132 4133 4134<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> 4135<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 4136switch statement or conditional operator. 4137 4138Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4139 if (true) {} 4140</pre></td></tr> 4141 4142 4143<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> 4144<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 4145(binary or ternary). 4146 4147Example matches b 4148 condition ? a : b 4149 condition ?: b 4150</pre></td></tr> 4151 4152 4153<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> 4154<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 4155 4156Example 1 (conditional ternary operator): matches a 4157 condition ? a : b 4158 4159Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 4160 condition ?: b 4161</pre></td></tr> 4162 4163 4164<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4165<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 4166matches the given matcher. 4167 4168The associated declaration is: 4169- for type nodes, the declaration of the underlying type 4170- for CallExpr, the declaration of the callee 4171- for MemberExpr, the declaration of the referenced member 4172- for CXXConstructExpr, the declaration of the constructor 4173- for CXXNewExpr, the declaration of the operator new 4174 4175For type nodes, hasDeclaration will generally match the declaration of the 4176sugared type. Given 4177 class X {}; 4178 typedef X Y; 4179 Y y; 4180in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4181typedefDecl. A common use case is to match the underlying, desugared type. 4182This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4183 varDecl(hasType(hasUnqualifiedDesugaredType( 4184 recordType(hasDeclaration(decl()))))) 4185In this matcher, the decl will match the CXXRecordDecl of class X. 4186 4187Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 4188 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 4189 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 4190 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 4191 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 4192 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 4193 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4194</pre></td></tr> 4195 4196 4197<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> 4198<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 4199 4200Given 4201 int i[5]; 4202 void f() { i[1] = 42; } 4203arraySubscriptExpression(hasBase(implicitCastExpr( 4204 hasSourceExpression(declRefExpr())))) 4205 matches i[1] with the declRefExpr() matching i 4206</pre></td></tr> 4207 4208 4209<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> 4210<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 4211 4212Given 4213 int i[5]; 4214 void f() { i[1] = 42; } 4215arraySubscriptExpression(hasIndex(integerLiteral())) 4216 matches i[1] with the integerLiteral() matching 1 4217</pre></td></tr> 4218 4219 4220<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> 4221<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 4222 4223Example matches a (matcher = binaryOperator(hasLHS())) 4224 a || b 4225</pre></td></tr> 4226 4227 4228<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> 4229<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 4230 4231Example matches b (matcher = binaryOperator(hasRHS())) 4232 a || b 4233</pre></td></tr> 4234 4235 4236<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> 4237<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 4238type. 4239 4240Given 4241 struct A {}; 4242 A a[7]; 4243 int b[7]; 4244arrayType(hasElementType(builtinType())) 4245 matches "int b[7]" 4246 4247Usable 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>> 4248</pre></td></tr> 4249 4250 4251<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> 4252<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 4253type. 4254 4255Given 4256 struct A {}; 4257 A a[7]; 4258 int b[7]; 4259arrayType(hasElementType(builtinType())) 4260 matches "int b[7]" 4261 4262Usable 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>> 4263</pre></td></tr> 4264 4265 4266<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> 4267<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 4268 4269Given 4270 _Atomic(int) i; 4271 _Atomic(float) f; 4272atomicType(hasValueType(isInteger())) 4273 matches "_Atomic(int) i" 4274 4275Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4276</pre></td></tr> 4277 4278 4279<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> 4280<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 4281 4282Given 4283 _Atomic(int) i; 4284 _Atomic(float) f; 4285atomicType(hasValueType(isInteger())) 4286 matches "_Atomic(int) i" 4287 4288Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4289</pre></td></tr> 4290 4291 4292<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> 4293<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 4294 4295Note: There is no TypeLoc for the deduced type and thus no 4296getDeducedLoc() matcher. 4297 4298Given 4299 auto a = 1; 4300 auto b = 2.0; 4301autoType(hasDeducedType(isInteger())) 4302 matches "auto a" 4303 4304Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 4305</pre></td></tr> 4306 4307 4308<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4309<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 4310binary operator matches. 4311</pre></td></tr> 4312 4313 4314<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> 4315<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 4316 4317Example matches a (matcher = binaryOperator(hasLHS())) 4318 a || b 4319</pre></td></tr> 4320 4321 4322<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> 4323<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 4324 4325Example matches b (matcher = binaryOperator(hasRHS())) 4326 a || b 4327</pre></td></tr> 4328 4329 4330<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> 4331<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 4332pointee matches a given matcher. 4333 4334Given 4335 int *a; 4336 int const *b; 4337 float const *f; 4338pointerType(pointee(isConstQualified(), isInteger())) 4339 matches "int const *b" 4340 4341Usable 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>>, 4342 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>> 4343</pre></td></tr> 4344 4345 4346<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> 4347<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 4348pointee matches a given matcher. 4349 4350Given 4351 int *a; 4352 int const *b; 4353 float const *f; 4354pointerType(pointee(isConstQualified(), isInteger())) 4355 matches "int const *b" 4356 4357Usable 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>>, 4358 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>> 4359</pre></td></tr> 4360 4361 4362<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> 4363<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 4364 4365Given 4366 void f(int i); 4367 int y; 4368 f(y); 4369callExpr( 4370 forEachArgumentWithParam( 4371 declRefExpr(to(varDecl(hasName("y")))), 4372 parmVarDecl(hasType(isInteger())) 4373)) 4374 matches f(y); 4375with declRefExpr(...) 4376 matching int y 4377and parmVarDecl(...) 4378 matching int i 4379</pre></td></tr> 4380 4381 4382<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> 4383<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 4384expression, or an ObjC-message-send expression. 4385 4386Given 4387 void x(int, int, int) { int y; x(1, y, 42); } 4388callExpr(hasAnyArgument(declRefExpr())) 4389 matches x(1, y, 42) 4390with hasAnyArgument(...) 4391 matching y 4392 4393For ObjectiveC, given 4394 @interface I - (void) f:(int) y; @end 4395 void foo(I *i) { [i f:12]; } 4396objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 4397 matches [i f:12] 4398</pre></td></tr> 4399 4400 4401<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> 4402<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 4403call expression. 4404 4405Example matches y in x(y) 4406 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4407 void x(int) { int y; x(y); } 4408</pre></td></tr> 4409 4410 4411<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4412<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 4413matches the given matcher. 4414 4415The associated declaration is: 4416- for type nodes, the declaration of the underlying type 4417- for CallExpr, the declaration of the callee 4418- for MemberExpr, the declaration of the referenced member 4419- for CXXConstructExpr, the declaration of the constructor 4420- for CXXNewExpr, the declaration of the operator new 4421 4422For type nodes, hasDeclaration will generally match the declaration of the 4423sugared type. Given 4424 class X {}; 4425 typedef X Y; 4426 Y y; 4427in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4428typedefDecl. A common use case is to match the underlying, desugared type. 4429This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4430 varDecl(hasType(hasUnqualifiedDesugaredType( 4431 recordType(hasDeclaration(decl()))))) 4432In this matcher, the decl will match the CXXRecordDecl of class X. 4433 4434Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 4435 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 4436 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 4437 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 4438 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 4439 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 4440 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4441</pre></td></tr> 4442 4443 4444<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> 4445<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 4446 4447Given 4448 class A { A() : i(42), j(42) {} int i; int j; }; 4449cxxConstructorDecl(forEachConstructorInitializer( 4450 forField(decl().bind("x")) 4451)) 4452 will trigger two matches, binding for 'i' and 'j' respectively. 4453</pre></td></tr> 4454 4455 4456<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> 4457<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 4458 4459Given 4460 struct Foo { 4461 Foo() : foo_(1) { } 4462 int foo_; 4463 }; 4464cxxRecordDecl(has(cxxConstructorDecl( 4465 hasAnyConstructorInitializer(anything()) 4466))) 4467 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 4468</pre></td></tr> 4469 4470 4471<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> 4472<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 4473 4474Given 4475 struct Foo { 4476 Foo() : foo_(1) { } 4477 int foo_; 4478 }; 4479cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 4480 forField(hasName("foo_")))))) 4481 matches Foo 4482with forField matching foo_ 4483</pre></td></tr> 4484 4485 4486<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> 4487<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 4488 4489Given 4490 struct Foo { 4491 Foo() : foo_(1) { } 4492 int foo_; 4493 }; 4494cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 4495 withInitializer(integerLiteral(equals(1))))))) 4496 matches Foo 4497with withInitializer matching (1) 4498</pre></td></tr> 4499 4500 4501<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> 4502<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 4503definition that has a given body. 4504 4505Given 4506 for (;;) {} 4507hasBody(compoundStmt()) 4508 matches 'for (;;) {}' 4509with compoundStmt() 4510 matching '{}' 4511</pre></td></tr> 4512 4513 4514<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> 4515<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 4516 4517Example: 4518 forStmt(hasLoopVariable(anything())) 4519matches 'int x' in 4520 for (int x : a) { } 4521</pre></td></tr> 4522 4523 4524<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> 4525<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 4526 4527Example: 4528 forStmt(hasRangeInit(anything())) 4529matches 'a' in 4530 for (int x : a) { } 4531</pre></td></tr> 4532 4533 4534<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> 4535<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 4536 4537 4538<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> 4539<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 4540 4541Example matches y.x() 4542 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) 4543 class Y { public: void x(); }; 4544 void z() { Y y; y.x(); } 4545 4546FIXME: Overload to allow directly matching types? 4547</pre></td></tr> 4548 4549 4550<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> 4551<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 4552</pre></td></tr> 4553 4554 4555<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> 4556<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 4557matcher, or is a pointer to a type that matches the InnerMatcher. 4558</pre></td></tr> 4559 4560 4561<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> 4562<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 4563produce multiple matches. 4564 4565Given 4566 class A { virtual void f(); }; 4567 class B : public A { void f(); }; 4568 class C : public B { void f(); }; 4569cxxMethodDecl(ofClass(hasName("C")), 4570 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4571 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 4572 that B::f is not overridden by C::f). 4573 4574The check can produce multiple matches in case of multiple inheritance, e.g. 4575 class A1 { virtual void f(); }; 4576 class A2 { virtual void f(); }; 4577 class C : public A1, public A2 { void f(); }; 4578cxxMethodDecl(ofClass(hasName("C")), 4579 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4580 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 4581 once with "b" binding "A2::f" and "d" binding "C::f". 4582</pre></td></tr> 4583 4584 4585<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> 4586<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 4587belongs to. 4588 4589FIXME: Generalize this for other kinds of declarations. 4590FIXME: What other kind of declarations would we need to generalize 4591this to? 4592 4593Example matches A() in the last line 4594 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 4595 ofClass(hasName("A")))))) 4596 class A { 4597 public: 4598 A(); 4599 }; 4600 A a = A(); 4601</pre></td></tr> 4602 4603 4604<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4605<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 4606 4607Given: 4608 MyClass *p1 = new MyClass[10]; 4609cxxNewExpr(hasArraySize(intgerLiteral(equals(10)))) 4610 matches the expression 'new MyClass[10]'. 4611</pre></td></tr> 4612 4613 4614<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4615<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 4616matches the given matcher. 4617 4618The associated declaration is: 4619- for type nodes, the declaration of the underlying type 4620- for CallExpr, the declaration of the callee 4621- for MemberExpr, the declaration of the referenced member 4622- for CXXConstructExpr, the declaration of the constructor 4623- for CXXNewExpr, the declaration of the operator new 4624 4625For type nodes, hasDeclaration will generally match the declaration of the 4626sugared type. Given 4627 class X {}; 4628 typedef X Y; 4629 Y y; 4630in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4631typedefDecl. A common use case is to match the underlying, desugared type. 4632This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4633 varDecl(hasType(hasUnqualifiedDesugaredType( 4634 recordType(hasDeclaration(decl()))))) 4635In this matcher, the decl will match the CXXRecordDecl of class X. 4636 4637Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 4638 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 4639 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 4640 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 4641 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 4642 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 4643 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4644</pre></td></tr> 4645 4646 4647<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> 4648<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 4649 4650Given: 4651 class A { void func(); }; 4652 class B { void member(); }; 4653 4654cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 4655A but not B. 4656</pre></td></tr> 4657 4658 4659<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> 4660<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 4661a class matching Base. 4662 4663Note that a class is not considered to be derived from itself. 4664 4665Example matches Y, Z, C (Base == hasName("X")) 4666 class X; 4667 class Y : public X {}; directly derived 4668 class Z : public Y {}; indirectly derived 4669 typedef X A; 4670 typedef A B; 4671 class C : public B {}; derived from a typedef of X 4672 4673In the following example, Bar matches isDerivedFrom(hasName("X")): 4674 class Foo; 4675 typedef Foo X; 4676 class Bar : public Foo {}; derived from a type that X is a typedef of 4677</pre></td></tr> 4678 4679 4680<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> 4681<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 4682match Base. 4683</pre></td></tr> 4684 4685 4686<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> 4687<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 4688given matcher. 4689 4690Example matches y.x() (matcher = callExpr(callee( 4691 cxxMethodDecl(hasName("x"))))) 4692 class Y { public: void x(); }; 4693 void z() { Y y; y.x(); } 4694</pre></td></tr> 4695 4696 4697<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> 4698<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 4699 4700Given 4701 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 4702 void f() { f(); } 4703callExpr(callee(expr())) 4704 matches this->x(), x(), y.x(), f() 4705with callee(...) 4706 matching this->x, x, y.x, f respectively 4707 4708Note: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 4709because this introduces ambiguous overloads with calls to Callee taking a 4710internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 4711implemented in terms of implicit casts. 4712</pre></td></tr> 4713 4714 4715<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> 4716<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 4717 4718Given 4719 void f(int i); 4720 int y; 4721 f(y); 4722callExpr( 4723 forEachArgumentWithParam( 4724 declRefExpr(to(varDecl(hasName("y")))), 4725 parmVarDecl(hasType(isInteger())) 4726)) 4727 matches f(y); 4728with declRefExpr(...) 4729 matching int y 4730and parmVarDecl(...) 4731 matching int i 4732</pre></td></tr> 4733 4734 4735<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> 4736<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 4737expression, or an ObjC-message-send expression. 4738 4739Given 4740 void x(int, int, int) { int y; x(1, y, 42); } 4741callExpr(hasAnyArgument(declRefExpr())) 4742 matches x(1, y, 42) 4743with hasAnyArgument(...) 4744 matching y 4745 4746For ObjectiveC, given 4747 @interface I - (void) f:(int) y; @end 4748 void foo(I *i) { [i f:12]; } 4749objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 4750 matches [i f:12] 4751</pre></td></tr> 4752 4753 4754<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> 4755<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 4756call expression. 4757 4758Example matches y in x(y) 4759 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4760 void x(int) { int y; x(y); } 4761</pre></td></tr> 4762 4763 4764<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4765<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 4766matches the given matcher. 4767 4768The associated declaration is: 4769- for type nodes, the declaration of the underlying type 4770- for CallExpr, the declaration of the callee 4771- for MemberExpr, the declaration of the referenced member 4772- for CXXConstructExpr, the declaration of the constructor 4773- for CXXNewExpr, the declaration of the operator new 4774 4775For type nodes, hasDeclaration will generally match the declaration of the 4776sugared type. Given 4777 class X {}; 4778 typedef X Y; 4779 Y y; 4780in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4781typedefDecl. A common use case is to match the underlying, desugared type. 4782This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4783 varDecl(hasType(hasUnqualifiedDesugaredType( 4784 recordType(hasDeclaration(decl()))))) 4785In this matcher, the decl will match the CXXRecordDecl of class X. 4786 4787Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 4788 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 4789 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 4790 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 4791 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 4792 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 4793 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4794</pre></td></tr> 4795 4796 4797<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> 4798<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 4799extension, matches the constant given in the statement. 4800 4801Given 4802 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 4803caseStmt(hasCaseConstant(integerLiteral())) 4804 matches "case 1:" 4805</pre></td></tr> 4806 4807 4808<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> 4809<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 4810or opaque value's source expression matches the given matcher. 4811 4812Example 1: matches "a string" 4813(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 4814class URL { URL(string); }; 4815URL url = "a string"; 4816 4817Example 2: matches 'b' (matcher = 4818opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 4819int a = b ?: 1; 4820</pre></td></tr> 4821 4822 4823<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> 4824<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 4825functionDecl that have at least one TemplateArgument matching the given 4826InnerMatcher. 4827 4828Given 4829 template<typename T> class A {}; 4830 template<> class A<double> {}; 4831 A<int> a; 4832 4833 template<typename T> f() {}; 4834 void func() { f<int>(); }; 4835 4836classTemplateSpecializationDecl(hasAnyTemplateArgument( 4837 refersToType(asString("int")))) 4838 matches the specialization A<int> 4839 4840functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 4841 matches the specialization f<int> 4842</pre></td></tr> 4843 4844 4845<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>> InnerMatcher</td></tr> 4846<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 4847 4848Given 4849 tempalate<typename T> class A {}; 4850 typedef A<int> B; 4851classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 4852 matches 'B' with classTemplateDecl() matching the class template 4853 declaration of 'A'. 4854</pre></td></tr> 4855 4856 4857<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> 4858<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 4859functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 4860 4861Given 4862 template<typename T, typename U> class A {}; 4863 A<bool, int> b; 4864 A<int, bool> c; 4865 4866 template<typename T> void f() {} 4867 void func() { f<int>(); }; 4868classTemplateSpecializationDecl(hasTemplateArgument( 4869 1, refersToType(asString("int")))) 4870 matches the specialization A<bool, int> 4871 4872functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 4873 matches the specialization f<int> 4874</pre></td></tr> 4875 4876 4877<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> 4878<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 4879type. 4880 4881Given 4882 struct A {}; 4883 A a[7]; 4884 int b[7]; 4885arrayType(hasElementType(builtinType())) 4886 matches "int b[7]" 4887 4888Usable 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>> 4889</pre></td></tr> 4890 4891 4892<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> 4893<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 4894type. 4895 4896Given 4897 struct A {}; 4898 A a[7]; 4899 int b[7]; 4900arrayType(hasElementType(builtinType())) 4901 matches "int b[7]" 4902 4903Usable 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>> 4904</pre></td></tr> 4905 4906 4907<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> 4908<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 4909a given matcher. Also matches StmtExprs that have CompoundStmt as children. 4910 4911Given 4912 { {}; 1+2; } 4913hasAnySubstatement(compoundStmt()) 4914 matches '{ {}; 1+2; }' 4915with compoundStmt() 4916 matching '{}' 4917</pre></td></tr> 4918 4919 4920<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> 4921<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 4922</pre></td></tr> 4923 4924 4925<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4926<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 4927matches the given matcher. 4928 4929The associated declaration is: 4930- for type nodes, the declaration of the underlying type 4931- for CallExpr, the declaration of the callee 4932- for MemberExpr, the declaration of the referenced member 4933- for CXXConstructExpr, the declaration of the constructor 4934- for CXXNewExpr, the declaration of the operator new 4935 4936For type nodes, hasDeclaration will generally match the declaration of the 4937sugared type. Given 4938 class X {}; 4939 typedef X Y; 4940 Y y; 4941in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4942typedefDecl. A common use case is to match the underlying, desugared type. 4943This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4944 varDecl(hasType(hasUnqualifiedDesugaredType( 4945 recordType(hasDeclaration(decl()))))) 4946In this matcher, the decl will match the CXXRecordDecl of class X. 4947 4948Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 4949 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 4950 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 4951 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 4952 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 4953 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 4954 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4955</pre></td></tr> 4956 4957 4958<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> 4959<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 4960specific using shadow declaration. 4961 4962Given 4963 namespace a { void f() {} } 4964 using a::f; 4965 void g() { 4966 f(); Matches this .. 4967 a::f(); .. but not this. 4968 } 4969declRefExpr(throughUsingDecl(anything())) 4970 matches f() 4971</pre></td></tr> 4972 4973 4974<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> 4975<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 4976specified matcher. 4977 4978Example matches x in if(x) 4979 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 4980 bool x; 4981 if (x) {} 4982</pre></td></tr> 4983 4984 4985<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> 4986<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 4987 4988Note that this does not work for global declarations because the AST 4989breaks up multiple-declaration DeclStmt's into multiple single-declaration 4990DeclStmt's. 4991Example: Given non-global declarations 4992 int a, b = 0; 4993 int c; 4994 int d = 2, e; 4995declStmt(containsDeclaration( 4996 0, varDecl(hasInitializer(anything())))) 4997 matches only 'int d = 2, e;', and 4998declStmt(containsDeclaration(1, varDecl())) 4999 matches 'int a, b = 0' as well as 'int d = 2, e;' 5000 but 'int c;' is not matched. 5001</pre></td></tr> 5002 5003 5004<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> 5005<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 5006 5007Given 5008 int a, b; 5009 int c; 5010declStmt(hasSingleDecl(anything())) 5011 matches 'int c;' but not 'int a, b;'. 5012</pre></td></tr> 5013 5014 5015<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> 5016<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 5017the inner matcher. 5018 5019Given 5020 int x; 5021declaratorDecl(hasTypeLoc(loc(asString("int")))) 5022 matches int x 5023</pre></td></tr> 5024 5025 5026<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> 5027<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 5028Decl, matches InnerMatcher. 5029 5030Given 5031 namespace N { 5032 namespace M { 5033 class D {}; 5034 } 5035 } 5036 5037cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 5038declaration of class D. 5039</pre></td></tr> 5040 5041 5042<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> 5043<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 5044definition that has a given body. 5045 5046Given 5047 for (;;) {} 5048hasBody(compoundStmt()) 5049 matches 'for (;;) {}' 5050with compoundStmt() 5051 matching '{}' 5052</pre></td></tr> 5053 5054 5055<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> 5056<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 5057switch statement or conditional operator. 5058 5059Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5060 if (true) {} 5061</pre></td></tr> 5062 5063 5064<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> 5065<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 5066matches InnerMatcher if the qualifier exists. 5067 5068Given 5069 namespace N { 5070 namespace M { 5071 class D {}; 5072 } 5073 } 5074 N::M::D d; 5075 5076elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 5077matches the type of the variable declaration of d. 5078</pre></td></tr> 5079 5080 5081<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> 5082<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 5083 5084Given 5085 namespace N { 5086 namespace M { 5087 class D {}; 5088 } 5089 } 5090 N::M::D d; 5091 5092elaboratedType(namesType(recordType( 5093hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 5094declaration of d. 5095</pre></td></tr> 5096 5097 5098<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5099<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 5100matches the given matcher. 5101 5102The associated declaration is: 5103- for type nodes, the declaration of the underlying type 5104- for CallExpr, the declaration of the callee 5105- for MemberExpr, the declaration of the referenced member 5106- for CXXConstructExpr, the declaration of the constructor 5107- for CXXNewExpr, the declaration of the operator new 5108 5109For type nodes, hasDeclaration will generally match the declaration of the 5110sugared type. Given 5111 class X {}; 5112 typedef X Y; 5113 Y y; 5114in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5115typedefDecl. A common use case is to match the underlying, desugared type. 5116This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5117 varDecl(hasType(hasUnqualifiedDesugaredType( 5118 recordType(hasDeclaration(decl()))))) 5119In this matcher, the decl will match the CXXRecordDecl of class X. 5120 5121Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5122 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5123 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5124 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 5125 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5126 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5127 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5128</pre></td></tr> 5129 5130 5131<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> 5132<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 5133 5134(Note: Clang's AST refers to other conversions as "casts" too, and calls 5135actual casts "explicit" casts.) 5136</pre></td></tr> 5137 5138 5139<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> 5140<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 5141declaration's type. 5142 5143In case of a value declaration (for example a variable declaration), 5144this resolves one layer of indirection. For example, in the value 5145declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5146X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5147declaration of x. 5148 5149Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5150 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5151 class X {}; 5152 void y(X &x) { x; X z; } 5153 5154Usable 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>> 5155</pre></td></tr> 5156 5157 5158<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> 5159<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 5160matcher. 5161 5162Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5163 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5164 and U (matcher = typedefDecl(hasType(asString("int"))) 5165 class X {}; 5166 void y(X &x) { x; X z; } 5167 typedef int U; 5168</pre></td></tr> 5169 5170 5171<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> 5172<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 5173are stripped off. 5174 5175Parentheses and explicit casts are not discarded. 5176Given 5177 int arr[5]; 5178 int a = 0; 5179 char b = 0; 5180 const int c = a; 5181 int *d = arr; 5182 long e = (long) 0l; 5183The matchers 5184 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 5185 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 5186would match the declarations for a, b, c, and d, but not e. 5187While 5188 varDecl(hasInitializer(integerLiteral())) 5189 varDecl(hasInitializer(declRefExpr())) 5190only match the declarations for b, c, and d. 5191</pre></td></tr> 5192 5193 5194<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>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5195<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 5196nodes are stripped off. 5197 5198Parentheses and explicit casts are not discarded. 5199Given 5200 class C {}; 5201 C a = C(); 5202 C b; 5203 C c = b; 5204The matchers 5205 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 5206would match the declarations for a, b, and c. 5207While 5208 varDecl(hasInitializer(cxxConstructExpr())) 5209only match the declarations for b and c. 5210</pre></td></tr> 5211 5212 5213<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> 5214<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 5215casts are stripped off. 5216 5217Implicit and non-C Style casts are also discarded. 5218Given 5219 int a = 0; 5220 char b = (0); 5221 void* c = reinterpret_cast<char*>(0); 5222 char d = char(0); 5223The matcher 5224 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 5225would match the declarations for a, b, c, and d. 5226while 5227 varDecl(hasInitializer(integerLiteral())) 5228only match the declaration for a. 5229</pre></td></tr> 5230 5231 5232<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> 5233<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 5234parentheses are stripped off. 5235 5236Explicit casts are not discarded. 5237Given 5238 int arr[5]; 5239 int a = 0; 5240 char b = (0); 5241 const int c = a; 5242 int *d = (arr); 5243 long e = ((long) 0l); 5244The matchers 5245 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 5246 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 5247would match the declarations for a, b, c, and d, but not e. 5248while 5249 varDecl(hasInitializer(integerLiteral())) 5250 varDecl(hasInitializer(declRefExpr())) 5251would only match the declaration for a. 5252</pre></td></tr> 5253 5254 5255<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5256<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 5257 5258Given 5259 class C { 5260 int a = 2; 5261 int b = 3; 5262 int c; 5263 }; 5264fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 5265 matches 'int a;' but not 'int b;'. 5266fieldDecl(hasInClassInitializer(anything())) 5267 matches 'int a;' and 'int b;' but not 'int c;'. 5268</pre></td></tr> 5269 5270 5271<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> 5272<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 5273definition that has a given body. 5274 5275Given 5276 for (;;) {} 5277hasBody(compoundStmt()) 5278 matches 'for (;;) {}' 5279with compoundStmt() 5280 matching '{}' 5281</pre></td></tr> 5282 5283 5284<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> 5285<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 5286switch statement or conditional operator. 5287 5288Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5289 if (true) {} 5290</pre></td></tr> 5291 5292 5293<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> 5294<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 5295 5296Example: 5297 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 5298matches '++x' in 5299 for (x; x < N; ++x) { } 5300</pre></td></tr> 5301 5302 5303<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> 5304<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 5305 5306Example: 5307 forStmt(hasLoopInit(declStmt())) 5308matches 'int x = 0' in 5309 for (int x = 0; x < N; ++x) { } 5310</pre></td></tr> 5311 5312 5313<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> 5314<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or ObjC method declaration. 5315 5316Does not match the 'this' parameter of a method. 5317 5318Given 5319 class X { void f(int x, int y, int z) {} }; 5320cxxMethodDecl(hasAnyParameter(hasName("y"))) 5321 matches f(int x, int y, int z) {} 5322with hasAnyParameter(...) 5323 matching int y 5324 5325For ObjectiveC, given 5326 @interface I - (void) f:(int) y; @end 5327 5328the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5329matches the declaration of method f with hasParameter 5330matching y. 5331</pre></td></tr> 5332 5333 5334<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5335<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5336functionDecl that have at least one TemplateArgument matching the given 5337InnerMatcher. 5338 5339Given 5340 template<typename T> class A {}; 5341 template<> class A<double> {}; 5342 A<int> a; 5343 5344 template<typename T> f() {}; 5345 void func() { f<int>(); }; 5346 5347classTemplateSpecializationDecl(hasAnyTemplateArgument( 5348 refersToType(asString("int")))) 5349 matches the specialization A<int> 5350 5351functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5352 matches the specialization f<int> 5353</pre></td></tr> 5354 5355 5356<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> 5357<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 5358definition that has a given body. 5359 5360Given 5361 for (;;) {} 5362hasBody(compoundStmt()) 5363 matches 'for (;;) {}' 5364with compoundStmt() 5365 matching '{}' 5366</pre></td></tr> 5367 5368 5369<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> 5370<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 5371declaration. 5372 5373Given 5374 class X { void f(int x) {} }; 5375cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5376 matches f(int x) {} 5377with hasParameter(...) 5378 matching int x 5379 5380For ObjectiveC, given 5381 @interface I - (void) f:(int) y; @end 5382 5383the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5384matches the declaration of method f with hasParameter 5385matching y. 5386</pre></td></tr> 5387 5388 5389<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5390<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5391functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5392 5393Given 5394 template<typename T, typename U> class A {}; 5395 A<bool, int> b; 5396 A<int, bool> c; 5397 5398 template<typename T> void f() {} 5399 void func() { f<int>(); }; 5400classTemplateSpecializationDecl(hasTemplateArgument( 5401 1, refersToType(asString("int")))) 5402 matches the specialization A<bool, int> 5403 5404functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5405 matches the specialization f<int> 5406</pre></td></tr> 5407 5408 5409<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> 5410<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 5411 5412Given: 5413 class X { int f() { return 1; } }; 5414cxxMethodDecl(returns(asString("int"))) 5415 matches int f() { return 1; } 5416</pre></td></tr> 5417 5418 5419<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> 5420<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 5421switch statement or conditional operator. 5422 5423Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5424 if (true) {} 5425</pre></td></tr> 5426 5427 5428<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> 5429<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 5430 5431Given 5432 if (A* a = GetAPointer()) {} 5433hasConditionVariableStatement(...) 5434 matches 'A* a = GetAPointer()'. 5435</pre></td></tr> 5436 5437 5438<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> 5439<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 5440 5441Examples matches the if statement 5442 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 5443 if (false) false; else true; 5444</pre></td></tr> 5445 5446 5447<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> 5448<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 5449 5450Examples matches the if statement 5451 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 5452 if (false) true; else false; 5453</pre></td></tr> 5454 5455 5456<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> 5457<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 5458matcher. 5459 5460FIXME: Unit test this matcher 5461</pre></td></tr> 5462 5463 5464<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> 5465<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 5466(if expression have it). 5467</pre></td></tr> 5468 5469 5470<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5471<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 5472matches the given matcher. 5473 5474The associated declaration is: 5475- for type nodes, the declaration of the underlying type 5476- for CallExpr, the declaration of the callee 5477- for MemberExpr, the declaration of the referenced member 5478- for CXXConstructExpr, the declaration of the constructor 5479- for CXXNewExpr, the declaration of the operator new 5480 5481For type nodes, hasDeclaration will generally match the declaration of the 5482sugared type. Given 5483 class X {}; 5484 typedef X Y; 5485 Y y; 5486in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5487typedefDecl. A common use case is to match the underlying, desugared type. 5488This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5489 varDecl(hasType(hasUnqualifiedDesugaredType( 5490 recordType(hasDeclaration(decl()))))) 5491In this matcher, the decl will match the CXXRecordDecl of class X. 5492 5493Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5494 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5495 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5496 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 5497 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5498 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5499 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5500</pre></td></tr> 5501 5502 5503<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5504<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 5505matches the given matcher. 5506 5507The associated declaration is: 5508- for type nodes, the declaration of the underlying type 5509- for CallExpr, the declaration of the callee 5510- for MemberExpr, the declaration of the referenced member 5511- for CXXConstructExpr, the declaration of the constructor 5512- for CXXNewExpr, the declaration of the operator new 5513 5514For type nodes, hasDeclaration will generally match the declaration of the 5515sugared type. Given 5516 class X {}; 5517 typedef X Y; 5518 Y y; 5519in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5520typedefDecl. A common use case is to match the underlying, desugared type. 5521This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5522 varDecl(hasType(hasUnqualifiedDesugaredType( 5523 recordType(hasDeclaration(decl()))))) 5524In this matcher, the decl will match the CXXRecordDecl of class X. 5525 5526Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5527 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5528 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5529 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 5530 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5531 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5532 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5533</pre></td></tr> 5534 5535 5536<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5537<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 5538matches the given matcher. 5539 5540The associated declaration is: 5541- for type nodes, the declaration of the underlying type 5542- for CallExpr, the declaration of the callee 5543- for MemberExpr, the declaration of the referenced member 5544- for CXXConstructExpr, the declaration of the constructor 5545- for CXXNewExpr, the declaration of the operator new 5546 5547For type nodes, hasDeclaration will generally match the declaration of the 5548sugared type. Given 5549 class X {}; 5550 typedef X Y; 5551 Y y; 5552in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5553typedefDecl. A common use case is to match the underlying, desugared type. 5554This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5555 varDecl(hasType(hasUnqualifiedDesugaredType( 5556 recordType(hasDeclaration(decl()))))) 5557In this matcher, the decl will match the CXXRecordDecl of class X. 5558 5559Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5560 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5561 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5562 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 5563 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5564 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5565 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5566</pre></td></tr> 5567 5568 5569<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> 5570<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 5571matched by a given matcher. 5572 5573Given 5574 struct X { int m; }; 5575 void f(X x) { x.m; m; } 5576memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) 5577 matches "x.m" and "m" 5578with hasObjectExpression(...) 5579 matching "x" and the implicit object expression of "m" which has type X*. 5580</pre></td></tr> 5581 5582 5583<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> 5584<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 5585given matcher. 5586 5587Given 5588 struct { int first, second; } first, second; 5589 int i(second.first); 5590 int j(first.second); 5591memberExpr(member(hasName("first"))) 5592 matches second.first 5593 but not first.second (because the member name there is "second"). 5594</pre></td></tr> 5595 5596 5597<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> 5598<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 5599pointee matches a given matcher. 5600 5601Given 5602 int *a; 5603 int const *b; 5604 float const *f; 5605pointerType(pointee(isConstQualified(), isInteger())) 5606 matches "int const *b" 5607 5608Usable 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>>, 5609 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>> 5610</pre></td></tr> 5611 5612 5613<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> 5614<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 5615pointee matches a given matcher. 5616 5617Given 5618 int *a; 5619 int const *b; 5620 float const *f; 5621pointerType(pointee(isConstQualified(), isInteger())) 5622 matches "int const *b" 5623 5624Usable 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>>, 5625 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>> 5626</pre></td></tr> 5627 5628 5629<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 5630<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 5631matcher. 5632 5633Given 5634 namespace N { template<class T> void f(T t); } 5635 template <class T> void g() { using N::f; f(T()); } 5636unresolvedLookupExpr(hasAnyDeclaration( 5637 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 5638 matches the use of f in g() . 5639</pre></td></tr> 5640 5641 5642<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> 5643<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 5644 5645Given 5646 struct A { struct B { struct C {}; }; }; 5647 A::B::C c; 5648nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 5649 matches "A::" 5650</pre></td></tr> 5651 5652 5653<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> 5654<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 5655given TypeLoc. 5656 5657Given 5658 struct A { struct B { struct C {}; }; }; 5659 A::B::C c; 5660nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 5661 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 5662 matches "A::" 5663</pre></td></tr> 5664 5665 5666<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> 5667<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 5668 5669Given 5670 struct A { struct B { struct C {}; }; }; 5671 A::B::C c; 5672nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 5673 matches "A::" 5674</pre></td></tr> 5675 5676 5677<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> 5678<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 5679given namespace matcher. 5680 5681Given 5682 namespace ns { struct A {}; } 5683 ns::A a; 5684nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 5685 matches "ns::" 5686</pre></td></tr> 5687 5688 5689<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> 5690<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 5691given QualType matcher without qualifiers. 5692 5693Given 5694 struct A { struct B { struct C {}; }; }; 5695 A::B::C c; 5696nestedNameSpecifier(specifiesType( 5697 hasDeclaration(cxxRecordDecl(hasName("A"))) 5698)) 5699 matches "A::" 5700</pre></td></tr> 5701 5702 5703<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5704<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5705expression, or an ObjC-message-send expression. 5706 5707Given 5708 void x(int, int, int) { int y; x(1, y, 42); } 5709callExpr(hasAnyArgument(declRefExpr())) 5710 matches x(1, y, 42) 5711with hasAnyArgument(...) 5712 matching y 5713 5714For ObjectiveC, given 5715 @interface I - (void) f:(int) y; @end 5716 void foo(I *i) { [i f:12]; } 5717objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5718 matches [i f:12] 5719</pre></td></tr> 5720 5721 5722<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> 5723<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 5724call expression. 5725 5726Example matches y in x(y) 5727 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5728 void x(int) { int y; x(y); } 5729</pre></td></tr> 5730 5731 5732<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> 5733<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 5734 5735Example 5736matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 5737matches the [webView ...] message invocation. 5738 NSString *webViewJavaScript = ... 5739 UIWebView *webView = ... 5740 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 5741</pre></td></tr> 5742 5743 5744<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 5745<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or ObjC method declaration. 5746 5747Does not match the 'this' parameter of a method. 5748 5749Given 5750 class X { void f(int x, int y, int z) {} }; 5751cxxMethodDecl(hasAnyParameter(hasName("y"))) 5752 matches f(int x, int y, int z) {} 5753with hasAnyParameter(...) 5754 matching int y 5755 5756For ObjectiveC, given 5757 @interface I - (void) f:(int) y; @end 5758 5759the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5760matches the declaration of method f with hasParameter 5761matching y. 5762</pre></td></tr> 5763 5764 5765<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 5766<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 5767declaration. 5768 5769Given 5770 class X { void f(int x) {} }; 5771cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5772 matches f(int x) {} 5773with hasParameter(...) 5774 matching int x 5775 5776For ObjectiveC, given 5777 @interface I - (void) f:(int) y; @end 5778 5779the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5780matches the declaration of method f with hasParameter 5781matching y. 5782</pre></td></tr> 5783 5784 5785<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> 5786<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 5787or opaque value's source expression matches the given matcher. 5788 5789Example 1: matches "a string" 5790(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 5791class URL { URL(string); }; 5792URL url = "a string"; 5793 5794Example 2: matches 'b' (matcher = 5795opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 5796int a = b ?: 1; 5797</pre></td></tr> 5798 5799 5800<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>></td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5801<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 5802overloads matches the given matcher. 5803 5804Given 5805 template <typename T> void foo(T); 5806 template <typename T> void bar(T); 5807 template <typename T> void baz(T t) { 5808 foo(t); 5809 bar(t); 5810 } 5811unresolvedLookupExpr(hasAnyDeclaration( 5812 functionTemplateDecl(hasName("foo")))) 5813 matches foo in foo(t); but not bar in bar(t); 5814</pre></td></tr> 5815 5816 5817<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> 5818<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 5819 5820Given 5821 int (*ptr_to_array)[4]; 5822 int (*ptr_to_func)(int); 5823 5824varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 5825ptr_to_func but not ptr_to_array. 5826 5827Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 5828</pre></td></tr> 5829 5830 5831<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> 5832<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 5833pointee matches a given matcher. 5834 5835Given 5836 int *a; 5837 int const *b; 5838 float const *f; 5839pointerType(pointee(isConstQualified(), isInteger())) 5840 matches "int const *b" 5841 5842Usable 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>>, 5843 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>> 5844</pre></td></tr> 5845 5846 5847<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> 5848<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 5849pointee matches a given matcher. 5850 5851Given 5852 int *a; 5853 int const *b; 5854 float const *f; 5855pointerType(pointee(isConstQualified(), isInteger())) 5856 matches "int const *b" 5857 5858Usable 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>>, 5859 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>> 5860</pre></td></tr> 5861 5862 5863<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> 5864<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 5865 5866Given: 5867 typedef int &int_ref; 5868 int a; 5869 int_ref b = a; 5870 5871varDecl(hasType(qualType(referenceType()))))) will not match the 5872declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 5873</pre></td></tr> 5874 5875 5876<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5877<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 5878matches the given matcher. 5879 5880The associated declaration is: 5881- for type nodes, the declaration of the underlying type 5882- for CallExpr, the declaration of the callee 5883- for MemberExpr, the declaration of the referenced member 5884- for CXXConstructExpr, the declaration of the constructor 5885- for CXXNewExpr, the declaration of the operator new 5886 5887For type nodes, hasDeclaration will generally match the declaration of the 5888sugared type. Given 5889 class X {}; 5890 typedef X Y; 5891 Y y; 5892in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5893typedefDecl. A common use case is to match the underlying, desugared type. 5894This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5895 varDecl(hasType(hasUnqualifiedDesugaredType( 5896 recordType(hasDeclaration(decl()))))) 5897In this matcher, the decl will match the CXXRecordDecl of class X. 5898 5899Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5900 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5901 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5902 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 5903 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5904 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5905 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5906</pre></td></tr> 5907 5908 5909<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> 5910<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 5911 5912Given 5913 void (*fp)(void); 5914The matcher 5915 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 5916would match the declaration for fp. 5917</pre></td></tr> 5918 5919 5920<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> 5921<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 5922</pre></td></tr> 5923 5924 5925<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> 5926<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 5927matches the specified matcher. 5928 5929Example matches y->x() 5930 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 5931 cxxRecordDecl(hasName("Y"))))))) 5932 class Y { public: void x(); }; 5933 void z() { Y *y; y->x(); } 5934</pre></td></tr> 5935 5936 5937<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> 5938<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 5939</pre></td></tr> 5940 5941 5942<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> 5943<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 5944type matches the specified matcher. 5945 5946Example matches X &x and const X &y 5947 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 5948 class X { 5949 void a(X b) { 5950 X &x = b; 5951 const X &y = b; 5952 } 5953 }; 5954</pre></td></tr> 5955 5956 5957<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5958<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 5959matches the given matcher. 5960 5961The associated declaration is: 5962- for type nodes, the declaration of the underlying type 5963- for CallExpr, the declaration of the callee 5964- for MemberExpr, the declaration of the referenced member 5965- for CXXConstructExpr, the declaration of the constructor 5966- for CXXNewExpr, the declaration of the operator new 5967 5968For type nodes, hasDeclaration will generally match the declaration of the 5969sugared type. Given 5970 class X {}; 5971 typedef X Y; 5972 Y y; 5973in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5974typedefDecl. A common use case is to match the underlying, desugared type. 5975This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5976 varDecl(hasType(hasUnqualifiedDesugaredType( 5977 recordType(hasDeclaration(decl()))))) 5978In this matcher, the decl will match the CXXRecordDecl of class X. 5979 5980Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5981 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5982 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5983 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 5984 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5985 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5986 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5987</pre></td></tr> 5988 5989 5990<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> 5991<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 5992pointee matches a given matcher. 5993 5994Given 5995 int *a; 5996 int const *b; 5997 float const *f; 5998pointerType(pointee(isConstQualified(), isInteger())) 5999 matches "int const *b" 6000 6001Usable 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>>, 6002 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>> 6003</pre></td></tr> 6004 6005 6006<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> 6007<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 6008pointee matches a given matcher. 6009 6010Given 6011 int *a; 6012 int const *b; 6013 float const *f; 6014pointerType(pointee(isConstQualified(), isInteger())) 6015 matches "int const *b" 6016 6017Usable 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>>, 6018 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>> 6019</pre></td></tr> 6020 6021 6022<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> 6023<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 6024 6025Given 6026 return a + b; 6027hasReturnValue(binaryOperator()) 6028 matches 'return a + b' 6029with binaryOperator() 6030 matching 'a + b' 6031</pre></td></tr> 6032 6033 6034<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> 6035<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 6036a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6037 6038Given 6039 { {}; 1+2; } 6040hasAnySubstatement(compoundStmt()) 6041 matches '{ {}; 1+2; }' 6042with compoundStmt() 6043 matching '{}' 6044</pre></td></tr> 6045 6046 6047<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 6048<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 6049alignof. 6050</pre></td></tr> 6051 6052 6053<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> 6054<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 6055 6056Given: 6057F& operator=(const F& o) { 6058 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 6059 return *this; 6060} 6061returnStmt(forFunction(hasName("operator="))) 6062 matches 'return *this' 6063 but does match 'return > 0' 6064</pre></td></tr> 6065 6066 6067<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 6068<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 6069sizeof. 6070</pre></td></tr> 6071 6072 6073<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6074<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 6075type that matches the provided matcher. 6076 6077Given 6078 template <typename T> 6079 double F(T t); 6080 int i; 6081 double j = F(i); 6082 6083substTemplateTypeParmType(hasReplacementType(type())) matches int 6084</pre></td></tr> 6085 6086 6087<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> 6088<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 6089statement. This matcher may produce multiple matches. 6090 6091Given 6092 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 6093switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 6094 matches four times, with "c" binding each of "case 1:", "case 2:", 6095"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 6096"switch (1)", "switch (2)" and "switch (2)". 6097</pre></td></tr> 6098 6099 6100<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> 6101<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 6102switch statement or conditional operator. 6103 6104Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6105 if (true) {} 6106</pre></td></tr> 6107 6108 6109<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6110<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 6111matches the given matcher. 6112 6113The associated declaration is: 6114- for type nodes, the declaration of the underlying type 6115- for CallExpr, the declaration of the callee 6116- for MemberExpr, the declaration of the referenced member 6117- for CXXConstructExpr, the declaration of the constructor 6118- for CXXNewExpr, the declaration of the operator new 6119 6120For type nodes, hasDeclaration will generally match the declaration of the 6121sugared type. Given 6122 class X {}; 6123 typedef X Y; 6124 Y y; 6125in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6126typedefDecl. A common use case is to match the underlying, desugared type. 6127This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6128 varDecl(hasType(hasUnqualifiedDesugaredType( 6129 recordType(hasDeclaration(decl()))))) 6130In this matcher, the decl will match the CXXRecordDecl of class X. 6131 6132Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6133 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6134 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6135 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 6136 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6137 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6138 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6139</pre></td></tr> 6140 6141 6142<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> 6143<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 6144 6145Given 6146 struct B { int next; }; 6147 template<int(B::*next_ptr)> struct A {}; 6148 A<&B::next> a; 6149templateSpecializationType(hasAnyTemplateArgument( 6150 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 6151 matches the specialization A<&B::next> with fieldDecl(...) matching 6152 B::next 6153</pre></td></tr> 6154 6155 6156<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> 6157<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 6158declaration. 6159 6160Given 6161 struct B { int next; }; 6162 template<int(B::*next_ptr)> struct A {}; 6163 A<&B::next> a; 6164classTemplateSpecializationDecl(hasAnyTemplateArgument( 6165 refersToDeclaration(fieldDecl(hasName("next"))))) 6166 matches the specialization A<&B::next> with fieldDecl(...) matching 6167 B::next 6168</pre></td></tr> 6169 6170 6171<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> 6172<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 6173 6174Given 6175 template<int T> struct C {}; 6176 C<42> c; 6177classTemplateSpecializationDecl( 6178 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 6179 matches the implicit instantiation of C in C<42>. 6180</pre></td></tr> 6181 6182 6183<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>> InnerMatcher</td></tr> 6184<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 6185 6186Given 6187 template<template <typename> class S> class X {}; 6188 template<typename T> class Y {};" 6189 X<Y> xi; 6190classTemplateSpecializationDecl(hasAnyTemplateArgument( 6191 refersToTemplate(templateName()))) 6192 matches the specialization X<Y> 6193</pre></td></tr> 6194 6195 6196<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> 6197<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 6198 6199Given 6200 struct X {}; 6201 template<typename T> struct A {}; 6202 A<X> a; 6203classTemplateSpecializationDecl(hasAnyTemplateArgument( 6204 refersToType(class(hasName("X"))))) 6205 matches the specialization A<X> 6206</pre></td></tr> 6207 6208 6209<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> 6210<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6211functionDecl that have at least one TemplateArgument matching the given 6212InnerMatcher. 6213 6214Given 6215 template<typename T> class A {}; 6216 template<> class A<double> {}; 6217 A<int> a; 6218 6219 template<typename T> f() {}; 6220 void func() { f<int>(); }; 6221 6222classTemplateSpecializationDecl(hasAnyTemplateArgument( 6223 refersToType(asString("int")))) 6224 matches the specialization A<int> 6225 6226functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6227 matches the specialization f<int> 6228</pre></td></tr> 6229 6230 6231<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6232<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 6233matches the given matcher. 6234 6235The associated declaration is: 6236- for type nodes, the declaration of the underlying type 6237- for CallExpr, the declaration of the callee 6238- for MemberExpr, the declaration of the referenced member 6239- for CXXConstructExpr, the declaration of the constructor 6240- for CXXNewExpr, the declaration of the operator new 6241 6242For type nodes, hasDeclaration will generally match the declaration of the 6243sugared type. Given 6244 class X {}; 6245 typedef X Y; 6246 Y y; 6247in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6248typedefDecl. A common use case is to match the underlying, desugared type. 6249This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6250 varDecl(hasType(hasUnqualifiedDesugaredType( 6251 recordType(hasDeclaration(decl()))))) 6252In this matcher, the decl will match the CXXRecordDecl of class X. 6253 6254Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6255 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6256 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6257 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 6258 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6259 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6260 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6261</pre></td></tr> 6262 6263 6264<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> 6265<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6266functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6267 6268Given 6269 template<typename T, typename U> class A {}; 6270 A<bool, int> b; 6271 A<int, bool> c; 6272 6273 template<typename T> void f() {} 6274 void func() { f<int>(); }; 6275classTemplateSpecializationDecl(hasTemplateArgument( 6276 1, refersToType(asString("int")))) 6277 matches the specialization A<bool, int> 6278 6279functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6280 matches the specialization f<int> 6281</pre></td></tr> 6282 6283 6284<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6285<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 6286matches the given matcher. 6287 6288The associated declaration is: 6289- for type nodes, the declaration of the underlying type 6290- for CallExpr, the declaration of the callee 6291- for MemberExpr, the declaration of the referenced member 6292- for CXXConstructExpr, the declaration of the constructor 6293- for CXXNewExpr, the declaration of the operator new 6294 6295For type nodes, hasDeclaration will generally match the declaration of the 6296sugared type. Given 6297 class X {}; 6298 typedef X Y; 6299 Y y; 6300in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6301typedefDecl. A common use case is to match the underlying, desugared type. 6302This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6303 varDecl(hasType(hasUnqualifiedDesugaredType( 6304 recordType(hasDeclaration(decl()))))) 6305In this matcher, the decl will match the CXXRecordDecl of class X. 6306 6307Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6308 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6309 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6310 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 6311 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6312 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6313 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6314</pre></td></tr> 6315 6316 6317<tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher<T> Matcher</td></tr> 6318<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 6319 6320Generates results for each match. 6321 6322For example, in: 6323 class A { class B {}; class C {}; }; 6324The matcher: 6325 cxxRecordDecl(hasName("::A"), 6326 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 6327will generate results for A, B and C. 6328 6329Usable as: Any Matcher 6330</pre></td></tr> 6331 6332 6333<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> 6334<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6335matcher. 6336 6337Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6338 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6339 and U (matcher = typedefDecl(hasType(asString("int"))) 6340 class X {}; 6341 void y(X &x) { x; X z; } 6342 typedef int U; 6343</pre></td></tr> 6344 6345 6346<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6347<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 6348matches the given matcher. 6349 6350The associated declaration is: 6351- for type nodes, the declaration of the underlying type 6352- for CallExpr, the declaration of the callee 6353- for MemberExpr, the declaration of the referenced member 6354- for CXXConstructExpr, the declaration of the constructor 6355- for CXXNewExpr, the declaration of the operator new 6356 6357For type nodes, hasDeclaration will generally match the declaration of the 6358sugared type. Given 6359 class X {}; 6360 typedef X Y; 6361 Y y; 6362in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6363typedefDecl. A common use case is to match the underlying, desugared type. 6364This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6365 varDecl(hasType(hasUnqualifiedDesugaredType( 6366 recordType(hasDeclaration(decl()))))) 6367In this matcher, the decl will match the CXXRecordDecl of class X. 6368 6369Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6370 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6371 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6372 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 6373 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6374 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6375 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6376</pre></td></tr> 6377 6378 6379<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>> InnerMatcher</td></tr> 6380<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 6381type of the matched node. 6382 6383For example, in: 6384 class A {}; 6385 using B = A; 6386The matcher type(hasUnqualifeidDesugaredType(recordType())) matches 6387both B and A. 6388</pre></td></tr> 6389 6390 6391<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> 6392<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 6393 6394Given 6395 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 6396unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 6397 matches sizeof(a) and alignof(c) 6398</pre></td></tr> 6399 6400 6401<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> 6402<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 6403 6404Example matches true (matcher = hasUnaryOperand( 6405 cxxBoolLiteral(equals(true)))) 6406 !true 6407</pre></td></tr> 6408 6409 6410<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>const Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6411<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 6412matches the given matcher. 6413 6414The associated declaration is: 6415- for type nodes, the declaration of the underlying type 6416- for CallExpr, the declaration of the callee 6417- for MemberExpr, the declaration of the referenced member 6418- for CXXConstructExpr, the declaration of the constructor 6419- for CXXNewExpr, the declaration of the operator new 6420 6421For type nodes, hasDeclaration will generally match the declaration of the 6422sugared type. Given 6423 class X {}; 6424 typedef X Y; 6425 Y y; 6426in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6427typedefDecl. A common use case is to match the underlying, desugared type. 6428This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6429 varDecl(hasType(hasUnqualifiedDesugaredType( 6430 recordType(hasDeclaration(decl()))))) 6431In this matcher, the decl will match the CXXRecordDecl of class X. 6432 6433Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6434 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6435 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>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6436 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 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>>, 6437 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6438 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6439 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6440</pre></td></tr> 6441 6442 6443<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> 6444<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 6445 6446Given 6447 namespace X { void b(); } 6448 using X::b; 6449usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 6450 matches using X::b </pre></td></tr> 6451 6452 6453<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> 6454<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 6455matched by the given matcher. 6456 6457Given 6458 namespace X { int a; void b(); } 6459 using X::a; 6460 using X::b; 6461usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 6462 matches using X::b but not using X::a </pre></td></tr> 6463 6464 6465<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> 6466<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6467declaration's type. 6468 6469In case of a value declaration (for example a variable declaration), 6470this resolves one layer of indirection. For example, in the value 6471declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6472X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6473declaration of x. 6474 6475Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6476 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6477 class X {}; 6478 void y(X &x) { x; X z; } 6479 6480Usable 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>> 6481</pre></td></tr> 6482 6483 6484<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> 6485<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 6486matcher. 6487 6488Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6489 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6490 and U (matcher = typedefDecl(hasType(asString("int"))) 6491 class X {}; 6492 void y(X &x) { x; X z; } 6493 typedef int U; 6494</pre></td></tr> 6495 6496 6497<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> 6498<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 6499that matches the given matcher. 6500 6501Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 6502 bool y() { return true; } 6503 bool x = y(); 6504</pre></td></tr> 6505 6506 6507<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> 6508<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 6509expression. 6510 6511Given 6512 void f(int b) { 6513 int a[b]; 6514 } 6515variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 6516 varDecl(hasName("b"))))))) 6517 matches "int a[b]" 6518</pre></td></tr> 6519 6520 6521<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> 6522<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 6523definition that has a given body. 6524 6525Given 6526 for (;;) {} 6527hasBody(compoundStmt()) 6528 matches 'for (;;) {}' 6529with compoundStmt() 6530 matching '{}' 6531</pre></td></tr> 6532 6533 6534<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> 6535<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 6536switch statement or conditional operator. 6537 6538Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6539 if (true) {} 6540</pre></td></tr> 6541 6542 6543<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> 6544<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 6545NestedNameSpecifier-matcher matches. 6546</pre></td></tr> 6547 6548 6549<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> 6550<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 6551QualType-matcher matches. 6552</pre></td></tr> 6553 6554<!--END_TRAVERSAL_MATCHERS --> 6555</table> 6556 6557</div> 6558</body> 6559</html> 6560 6561 6562