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></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 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 1937 struct S { S& operator=(const S&); }; 1938 void x() { S s1, s2; s1 = s2; }) 1939</pre></td></tr> 1940 1941 1942<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> 1943<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 1944 1945 1946<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> 1947<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 1948 1949Given 1950 f('false, 3.14, 42); 1951characterLiteral(equals(0)) 1952 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 1953 match false 1954floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 1955 match 3.14 1956integerLiteral(equals(42)) 1957 matches 42 1958 1959Note that you cannot directly match a negative numeric literal because the 1960minus sign is not part of the literal: It is a unary operator whose operand 1961is the positive numeric literal. Instead, you must use a unaryOperator() 1962matcher to match the minus sign: 1963 1964unaryOperator(hasOperatorName("-"), 1965 hasUnaryOperand(integerLiteral(equals(13)))) 1966 1967Usable 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>>, 1968 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>> 1969</pre></td></tr> 1970 1971 1972<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> 1973<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 1974 1975 1976<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> 1977<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 1978 1979 1980<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> 1981<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 1982 1983Given 1984 try { 1985 ... 1986 } catch (int) { 1987 ... 1988 } catch (...) { 1989 ... 1990 } 1991endcode 1992cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 1993</pre></td></tr> 1994 1995 1996<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> 1997<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 1998a specific number of arguments (including absent default arguments). 1999 2000Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2001 void f(int x, int y); 2002 f(0, 0); 2003</pre></td></tr> 2004 2005 2006<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> 2007<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2008</pre></td></tr> 2009 2010 2011<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> 2012<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2013zero initialization. 2014 2015Given 2016void foo() { 2017 struct point { double x; double y; }; 2018 point pt[2] = { { 1.0, 2.0 } }; 2019} 2020initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2021will match the implicit array filler for pt[1]. 2022</pre></td></tr> 2023 2024 2025<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> 2026<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2027 2028Given 2029 struct S { 2030 S(); #1 2031 S(const S &); #2 2032 S(S &&); #3 2033 }; 2034cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2035</pre></td></tr> 2036 2037 2038<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> 2039<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2040 2041Given 2042 struct S { 2043 S(); #1 2044 S(const S &); #2 2045 S(S &&); #3 2046 }; 2047cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2048</pre></td></tr> 2049 2050 2051<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> 2052<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2053 2054Given 2055 struct S { 2056 S(); #1 2057 S(int) {} #2 2058 S(S &&) : S() {} #3 2059 }; 2060 S::S() : S(0) {} #4 2061cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2062#1 or #2. 2063</pre></td></tr> 2064 2065 2066<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> 2067<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with 2068the explicit keyword. 2069 2070Given 2071 struct S { 2072 S(int); #1 2073 explicit S(double); #2 2074 operator int(); #3 2075 explicit operator bool(); #4 2076 }; 2077cxxConstructorDecl(isExplicit()) will match #2, but not #1. 2078cxxConversionDecl(isExplicit()) will match #4, but not #3. 2079</pre></td></tr> 2080 2081 2082<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> 2083<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2084 2085Given 2086 struct S { 2087 S(); #1 2088 S(const S &); #2 2089 S(S &&); #3 2090 }; 2091cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2092</pre></td></tr> 2093 2094 2095<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> 2096<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with 2097the explicit keyword. 2098 2099Given 2100 struct S { 2101 S(int); #1 2102 explicit S(double); #2 2103 operator int(); #3 2104 explicit operator bool(); #4 2105 }; 2106cxxConstructorDecl(isExplicit()) will match #2, but not #1. 2107cxxConversionDecl(isExplicit()) will match #4, but not #3. 2108</pre></td></tr> 2109 2110 2111<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> 2112<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2113opposed to a member. 2114 2115Given 2116 struct B {}; 2117 struct D : B { 2118 int I; 2119 D(int i) : I(i) {} 2120 }; 2121 struct E : B { 2122 E() : B() {} 2123 }; 2124cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 2125 will match E(), but not match D(int). 2126</pre></td></tr> 2127 2128 2129<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> 2130<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 2131opposed to a base. 2132 2133Given 2134 struct B {}; 2135 struct D : B { 2136 int I; 2137 D(int i) : I(i) {} 2138 }; 2139 struct E : B { 2140 E() : B() {} 2141 }; 2142cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 2143 will match D(int), but not match E(). 2144</pre></td></tr> 2145 2146 2147<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> 2148<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 2149code (as opposed to implicitly added by the compiler). 2150 2151Given 2152 struct Foo { 2153 Foo() { } 2154 Foo(int) : foo_("A") { } 2155 string foo_; 2156 }; 2157cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 2158 will match Foo(int), but not Foo() 2159</pre></td></tr> 2160 2161 2162<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> 2163<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 2164 2165Given 2166struct A { 2167 void foo() const; 2168 void bar(); 2169}; 2170 2171cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 2172</pre></td></tr> 2173 2174 2175<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> 2176<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 2177operator. 2178 2179Given 2180struct A { 2181 A &operator=(const A &); 2182 A &operator=(A &&); 2183}; 2184 2185cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 2186the second one. 2187</pre></td></tr> 2188 2189 2190<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> 2191<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 2192 2193Given: 2194 class A final {}; 2195 2196 struct B { 2197 virtual void f(); 2198 }; 2199 2200 struct C : B { 2201 void f() final; 2202 }; 2203matches A and C::f, but not B, C, or B::f 2204</pre></td></tr> 2205 2206 2207<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> 2208<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2209operator. 2210 2211Given 2212struct A { 2213 A &operator=(const A &); 2214 A &operator=(A &&); 2215}; 2216 2217cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2218the first one. 2219</pre></td></tr> 2220 2221 2222<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> 2223<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2224 2225Given 2226 class A { 2227 public: 2228 virtual void x(); 2229 }; 2230 class B : public A { 2231 public: 2232 virtual void x(); 2233 }; 2234 matches B::x 2235</pre></td></tr> 2236 2237 2238<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> 2239<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2240 2241Given 2242 class A { 2243 public: 2244 virtual void x() = 0; 2245 }; 2246 matches A::x 2247</pre></td></tr> 2248 2249 2250<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> 2251<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2252 2253Given 2254 struct S { 2255 S(); #1 2256 S(const S &) = default; #2 2257 S(S &&) = delete; #3 2258 }; 2259cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2260</pre></td></tr> 2261 2262 2263<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> 2264<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual. 2265 2266Given 2267 class A { 2268 public: 2269 virtual void x(); 2270 }; 2271 matches A::x 2272</pre></td></tr> 2273 2274 2275<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> 2276<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2277 2278Given 2279 class A { 2280 public: 2281 virtual void x(); 2282 }; 2283 class B : public A { 2284 public: 2285 void x(); 2286 }; 2287 matches A::x but not B::x 2288</pre></td></tr> 2289 2290 2291<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> 2292<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 2293 2294Given: 2295 MyClass *p1 = new MyClass[10]; 2296cxxNewExpr(isArray()) 2297 matches the expression 'new MyClass[10]'. 2298</pre></td></tr> 2299 2300 2301<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> 2302<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2303 2304Matches overloaded operator names specified in strings without the 2305"operator" prefix: e.g. "<<". 2306 2307Given: 2308 class A { int operator*(); }; 2309 const A &operator<<(const A &a, const A &b); 2310 A a; 2311 a << a; <-- This matches 2312 2313cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2314specified line and 2315cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2316matches the declaration of A. 2317 2318Usable 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>> 2319</pre></td></tr> 2320 2321 2322<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></tr> 2323<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 2324 2325Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2326 if (a == b) 2327 a += b; 2328 2329Example 2: matches s1 = s2 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2330 struct S { S& operator=(const S&); }; 2331 void x() { S s1, s2; s1 = s2; }) 2332</pre></td></tr> 2333 2334 2335<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> 2336<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 2337 2338Example matches x (matcher = cxxRecordDecl(hasDefinition())) 2339class x {}; 2340class y; 2341</pre></td></tr> 2342 2343 2344<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> 2345<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2346</pre></td></tr> 2347 2348 2349<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> 2350<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2351static member variable template instantiations. 2352 2353Given 2354 template<typename T> void A(T t) { } 2355 template<> void A(int N) { } 2356functionDecl(isExplicitTemplateSpecialization()) 2357 matches the specialization A<int>(). 2358 2359Usable 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>> 2360</pre></td></tr> 2361 2362 2363<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> 2364<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2365 2366Given: 2367 class A final {}; 2368 2369 struct B { 2370 virtual void f(); 2371 }; 2372 2373 struct C : B { 2374 void f() final; 2375 }; 2376matches A and C::f, but not B, C, or B::f 2377</pre></td></tr> 2378 2379 2380<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> 2381<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2382 2383Given: 2384 auto x = []{}; 2385 2386cxxRecordDecl(isLambda()) matches the implicit class declaration of 2387decltype(x) 2388</pre></td></tr> 2389 2390 2391<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> 2392<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for 2393isSameOrDerivedFrom(hasName(...)). 2394</pre></td></tr> 2395 2396 2397<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> 2398<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2399member variable template instantiations. 2400 2401Given 2402 template <typename T> class X {}; class A {}; X<A> x; 2403or 2404 template <typename T> class X {}; class A {}; template class X<A>; 2405or 2406 template <typename T> class X {}; class A {}; extern template class X<A>; 2407cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2408 matches the template instantiation of X<A>. 2409 2410But given 2411 template <typename T> class X {}; class A {}; 2412 template <> class X<A> {}; X<A> x; 2413cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2414 does not match, as X<A> is an explicit template specialization. 2415 2416Usable 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>> 2417</pre></td></tr> 2418 2419 2420<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> 2421<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2422a specific number of arguments (including absent default arguments). 2423 2424Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2425 void f(int x, int y); 2426 f(0, 0); 2427</pre></td></tr> 2428 2429 2430<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> 2431<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2432 2433Example: matches the implicit cast around 0 2434(matcher = castExpr(hasCastKind(CK_NullToPointer))) 2435 int *p = 0; 2436</pre></td></tr> 2437 2438 2439<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> 2440<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 2441 2442 2443<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> 2444<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 2445 2446Given 2447 f('false, 3.14, 42); 2448characterLiteral(equals(0)) 2449 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2450 match false 2451floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2452 match 3.14 2453integerLiteral(equals(42)) 2454 matches 42 2455 2456Note that you cannot directly match a negative numeric literal because the 2457minus sign is not part of the literal: It is a unary operator whose operand 2458is the positive numeric literal. Instead, you must use a unaryOperator() 2459matcher to match the minus sign: 2460 2461unaryOperator(hasOperatorName("-"), 2462 hasUnaryOperand(integerLiteral(equals(13)))) 2463 2464Usable 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>>, 2465 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>> 2466</pre></td></tr> 2467 2468 2469<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> 2470<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 2471 2472 2473<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> 2474<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 2475 2476 2477<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> 2478<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2479 2480Given 2481 template<typename T> struct C {}; 2482 C<int> c; 2483classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2484 matches C<int>. 2485</pre></td></tr> 2486 2487 2488<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> 2489<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2490child statements. 2491 2492Example: Given 2493 { for (;;) {} } 2494compoundStmt(statementCountIs(0))) 2495 matches '{}' 2496 but does not match the outer compound statement. 2497</pre></td></tr> 2498 2499 2500<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> 2501<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2502 2503Given 2504 int a[42]; 2505 int b[2 * 21]; 2506 int c[41], d[43]; 2507 char *s = "abcd"; 2508 wchar_t *ws = L"abcd"; 2509 char *w = "a"; 2510constantArrayType(hasSize(42)) 2511 matches "int a[42]" and "int b[2 * 21]" 2512stringLiteral(hasSize(4)) 2513 matches "abcd", L"abcd" 2514</pre></td></tr> 2515 2516 2517<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> 2518<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2519declarations. 2520 2521Example: Given 2522 int a, b; 2523 int c; 2524 int d = 2, e; 2525declCountIs(2) 2526 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 2527</pre></td></tr> 2528 2529 2530<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> 2531<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 2532 2533Matches a node if it equals the node previously bound to ID. 2534 2535Given 2536 class X { int a; int b; }; 2537cxxRecordDecl( 2538 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2539 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2540 matches the class X, as a and b have the same type. 2541 2542Note that when multiple matches are involved via forEach* matchers, 2543equalsBoundNodes acts as a filter. 2544For example: 2545compoundStmt( 2546 forEachDescendant(varDecl().bind("d")), 2547 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2548will trigger a match for each combination of variable declaration 2549and reference to that variable declaration within a compound statement. 2550</pre></td></tr> 2551 2552 2553<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> 2554<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 2555 2556Decl has pointer identity in the AST. 2557</pre></td></tr> 2558 2559 2560<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> 2561<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 2562 2563Given 2564 __attribute__((device)) void f() { ... } 2565decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 2566f. If the matcher is use from clang-query, attr::Kind parameter should be 2567passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 2568</pre></td></tr> 2569 2570 2571<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> 2572<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 2573partially matching a given regex. 2574 2575Example matches Y but not X 2576 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2577 #include "ASTMatcher.h" 2578 class X {}; 2579ASTMatcher.h: 2580 class Y {}; 2581 2582Usable 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>> 2583</pre></td></tr> 2584 2585 2586<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> 2587<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 2588 2589Example matches X but not Y 2590 (matcher = cxxRecordDecl(isExpansionInMainFile()) 2591 #include <Y.h> 2592 class X {}; 2593Y.h: 2594 class Y {}; 2595 2596Usable 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>> 2597</pre></td></tr> 2598 2599 2600<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> 2601<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 2602 2603Example matches Y but not X 2604 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2605 #include <SystemHeader.h> 2606 class X {}; 2607SystemHeader.h: 2608 class Y {}; 2609 2610Usable 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>> 2611</pre></td></tr> 2612 2613 2614<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> 2615<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 2616by the compiler (eg. implicit defaultcopy constructors). 2617</pre></td></tr> 2618 2619 2620<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> 2621<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. 2622 2623Given 2624 class C { 2625 public: int a; 2626 protected: int b; 2627 private: int c; 2628 }; 2629fieldDecl(isPrivate()) 2630 matches 'int c;' 2631</pre></td></tr> 2632 2633 2634<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> 2635<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations. 2636 2637Given 2638 class C { 2639 public: int a; 2640 protected: int b; 2641 private: int c; 2642 }; 2643fieldDecl(isProtected()) 2644 matches 'int b;' 2645</pre></td></tr> 2646 2647 2648<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> 2649<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations. 2650 2651Given 2652 class C { 2653 public: int a; 2654 protected: int b; 2655 private: int c; 2656 }; 2657fieldDecl(isPublic()) 2658 matches 'int a;' 2659</pre></td></tr> 2660 2661 2662<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> 2663<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 2664a specific number of designators. 2665 2666Example: Given 2667 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 2668 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 2669designatorCountIs(2) 2670 matches '{ [2].y = 1.0, [0].x = 1.0 }', 2671 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 2672</pre></td></tr> 2673 2674 2675<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> 2676<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 2677 2678Example matches Y (matcher = enumDecl(isScoped())) 2679enum X {}; 2680enum class Y {}; 2681</pre></td></tr> 2682 2683 2684<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> 2685<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 2686bit width. 2687 2688Given 2689 class C { 2690 int a : 2; 2691 int b : 4; 2692 int c : 2; 2693 }; 2694fieldDecl(hasBitWidth(2)) 2695 matches 'int a;' and 'int c;' but not 'int b;'. 2696</pre></td></tr> 2697 2698 2699<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> 2700<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 2701 2702Given 2703 class C { 2704 int a : 2; 2705 int b; 2706 }; 2707fieldDecl(isBitField()) 2708 matches 'int a;' but not 'int b;'. 2709</pre></td></tr> 2710 2711 2712<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> 2713<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 2714 2715Given 2716 f('false, 3.14, 42); 2717characterLiteral(equals(0)) 2718 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2719 match false 2720floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2721 match 3.14 2722integerLiteral(equals(42)) 2723 matches 42 2724 2725Note that you cannot directly match a negative numeric literal because the 2726minus sign is not part of the literal: It is a unary operator whose operand 2727is the positive numeric literal. Instead, you must use a unaryOperator() 2728matcher to match the minus sign: 2729 2730unaryOperator(hasOperatorName("-"), 2731 hasUnaryOperand(integerLiteral(equals(13)))) 2732 2733Usable 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>>, 2734 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>> 2735</pre></td></tr> 2736 2737 2738<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> 2739<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 2740 2741 2742<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> 2743<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 2744 2745Given: 2746 void f(); 2747 void g() noexcept; 2748 void h() noexcept(true); 2749 void i() noexcept(false); 2750 void j() throw(); 2751 void k() throw(int); 2752 void l() throw(...); 2753functionDecl(hasDynamicExceptionSpec()) and 2754 functionProtoType(hasDynamicExceptionSpec()) 2755 match the declarations of j, k, and l, but not f, g, h, or i. 2756</pre></td></tr> 2757 2758 2759<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> 2760<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 2761 2762Matches overloaded operator names specified in strings without the 2763"operator" prefix: e.g. "<<". 2764 2765Given: 2766 class A { int operator*(); }; 2767 const A &operator<<(const A &a, const A &b); 2768 A a; 2769 a << a; <-- This matches 2770 2771cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2772specified line and 2773cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2774matches the declaration of A. 2775 2776Usable 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>> 2777</pre></td></tr> 2778 2779 2780<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> 2781<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 2782 2783Example matches Y (matcher = functionDecl(hasTrailingReturn())) 2784int X() {} 2785auto Y() -> int {} 2786</pre></td></tr> 2787 2788 2789<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> 2790<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations. 2791 2792Given: 2793 constexpr int foo = 42; 2794 constexpr int bar(); 2795varDecl(isConstexpr()) 2796 matches the declaration of foo. 2797functionDecl(isConstexpr()) 2798 matches the declaration of bar. 2799</pre></td></tr> 2800 2801 2802<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> 2803<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 2804 2805Given: 2806 class A { ~A(); }; 2807 class B { ~B() = default; }; 2808functionDecl(isDefaulted()) 2809 matches the declaration of ~B, but not ~A. 2810</pre></td></tr> 2811 2812 2813<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> 2814<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 2815 2816Example matches A, va, fa 2817 class A {}; 2818 class B; Doesn't match, as it has no body. 2819 int va; 2820 extern int vb; Doesn't match, as it doesn't define the variable. 2821 void fa() {} 2822 void fb(); Doesn't match, as it has no body. 2823 @interface X 2824 - (void)ma; Doesn't match, interface is declaration. 2825 @end 2826 @implementation X 2827 - (void)ma {} 2828 @end 2829 2830Usable 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>>, 2831 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 2832</pre></td></tr> 2833 2834 2835<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> 2836<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 2837 2838Given: 2839 void Func(); 2840 void DeletedFunc() = delete; 2841functionDecl(isDeleted()) 2842 matches the declaration of DeletedFunc, but not Func. 2843</pre></td></tr> 2844 2845 2846<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> 2847<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 2848static member variable template instantiations. 2849 2850Given 2851 template<typename T> void A(T t) { } 2852 template<> void A(int N) { } 2853functionDecl(isExplicitTemplateSpecialization()) 2854 matches the specialization A<int>(). 2855 2856Usable 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>> 2857</pre></td></tr> 2858 2859 2860<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> 2861<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 2862 2863Given: 2864 extern "C" void f() {} 2865 extern "C" { void g() {} } 2866 void h() {} 2867 extern "C" int x = 1; 2868 extern "C" int y = 2; 2869 int z = 3; 2870functionDecl(isExternC()) 2871 matches the declaration of f and g, but not the declaration of h. 2872varDecl(isExternC()) 2873 matches the declaration of x and y, but not the declaration of z. 2874</pre></td></tr> 2875 2876 2877<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> 2878<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 2879the inline keyword. 2880 2881Given 2882 inline void f(); 2883 void g(); 2884 namespace n { 2885 inline namespace m {} 2886 } 2887functionDecl(isInline()) will match ::f(). 2888namespaceDecl(isInline()) will match n::m. 2889</pre></td></tr> 2890 2891 2892<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> 2893<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 2894 2895Given 2896 void nope(); 2897 [[noreturn]] void a(); 2898 __attribute__((noreturn)) void b(); 2899 struct c { [[noreturn]] c(); }; 2900functionDecl(isNoReturn()) 2901 matches all of those except 2902 void nope(); 2903</pre></td></tr> 2904 2905 2906<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> 2907<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 2908 2909Given: 2910 void f(); 2911 void g() noexcept; 2912 void h() throw(); 2913 void i() throw(int); 2914 void j() noexcept(false); 2915functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2916 match the declarations of g, and h, but not f, i or j. 2917</pre></td></tr> 2918 2919 2920<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> 2921<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage 2922class specifier ("static" keyword) written in the source. 2923 2924Given: 2925 static void f() {} 2926 static int i = 0; 2927 extern int j; 2928 int k; 2929functionDecl(isStaticStorageClass()) 2930 matches the function declaration f. 2931varDecl(isStaticStorageClass()) 2932 matches the variable declaration i. 2933</pre></td></tr> 2934 2935 2936<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> 2937<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 2938member variable template instantiations. 2939 2940Given 2941 template <typename T> class X {}; class A {}; X<A> x; 2942or 2943 template <typename T> class X {}; class A {}; template class X<A>; 2944or 2945 template <typename T> class X {}; class A {}; extern template class X<A>; 2946cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2947 matches the template instantiation of X<A>. 2948 2949But given 2950 template <typename T> class X {}; class A {}; 2951 template <> class X<A> {}; X<A> x; 2952cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2953 does not match, as X<A> is an explicit template specialization. 2954 2955Usable 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>> 2956</pre></td></tr> 2957 2958 2959<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> 2960<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 2961 2962Example matches f, but not g or h. The function i will not match, even when 2963compiled in C mode. 2964 void f(...); 2965 void g(int); 2966 template <typename... Ts> void h(Ts...); 2967 void i(); 2968</pre></td></tr> 2969 2970 2971<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> 2972<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2973specific parameter count. 2974 2975Given 2976 void f(int i) {} 2977 void g(int i, int j) {} 2978 void h(int i, int j); 2979 void j(int i); 2980 void k(int x, int y, int z, ...); 2981functionDecl(parameterCountIs(2)) 2982 matches g and h 2983functionProtoType(parameterCountIs(2)) 2984 matches g and h 2985functionProtoType(parameterCountIs(3)) 2986 matches k 2987</pre></td></tr> 2988 2989 2990<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> 2991<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 2992 2993Given: 2994 void f(); 2995 void g() noexcept; 2996 void h() noexcept(true); 2997 void i() noexcept(false); 2998 void j() throw(); 2999 void k() throw(int); 3000 void l() throw(...); 3001functionDecl(hasDynamicExceptionSpec()) and 3002 functionProtoType(hasDynamicExceptionSpec()) 3003 match the declarations of j, k, and l, but not f, g, h, or i. 3004</pre></td></tr> 3005 3006 3007<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> 3008<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 3009 3010Given: 3011 void f(); 3012 void g() noexcept; 3013 void h() throw(); 3014 void i() throw(int); 3015 void j() noexcept(false); 3016functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3017 match the declarations of g, and h, but not f, i or j. 3018</pre></td></tr> 3019 3020 3021<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> 3022<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3023specific parameter count. 3024 3025Given 3026 void f(int i) {} 3027 void g(int i, int j) {} 3028 void h(int i, int j); 3029 void j(int i); 3030 void k(int x, int y, int z, ...); 3031functionDecl(parameterCountIs(2)) 3032 matches g and h 3033functionProtoType(parameterCountIs(2)) 3034 matches g and h 3035functionProtoType(parameterCountIs(3)) 3036 matches k 3037</pre></td></tr> 3038 3039 3040<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> 3041<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 3042 3043 3044<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> 3045<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 3046 3047Given 3048 f('false, 3.14, 42); 3049characterLiteral(equals(0)) 3050 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3051 match false 3052floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3053 match 3.14 3054integerLiteral(equals(42)) 3055 matches 42 3056 3057Note that you cannot directly match a negative numeric literal because the 3058minus sign is not part of the literal: It is a unary operator whose operand 3059is the positive numeric literal. Instead, you must use a unaryOperator() 3060matcher to match the minus sign: 3061 3062unaryOperator(hasOperatorName("-"), 3063 hasUnaryOperand(integerLiteral(equals(13)))) 3064 3065Usable 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>>, 3066 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>> 3067</pre></td></tr> 3068 3069 3070<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> 3071<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 3072 3073 3074<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> 3075<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 3076 3077 3078<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> 3079<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 3080to '.'. 3081 3082Member calls on the implicit this pointer match as called with '->'. 3083 3084Given 3085 class Y { 3086 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3087 int a; 3088 static int b; 3089 }; 3090memberExpr(isArrow()) 3091 matches this->x, x, y.x, a, this->b 3092</pre></td></tr> 3093 3094 3095<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> 3096<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 3097 3098Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 3099void f() { 3100 int x; 3101 static int y; 3102} 3103int z; 3104 3105Example matches f() because it has external formal linkage despite being 3106unique to the translation unit as though it has internal likage 3107(matcher = functionDecl(hasExternalFormalLinkage())) 3108 3109namespace { 3110void f() {} 3111} 3112</pre></td></tr> 3113 3114 3115<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> 3116<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 3117 3118Supports specifying enclosing namespaces or classes by prefixing the name 3119with '<enclosing>::'. 3120Does not match typedefs of an underlying type with the given name. 3121 3122Example matches X (Name == "X") 3123 class X; 3124 3125Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 3126 namespace a { namespace b { class X; } } 3127</pre></td></tr> 3128 3129 3130<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> 3131<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 3132a substring matched by the given RegExp. 3133 3134Supports specifying enclosing namespaces or classes by 3135prefixing the name with '<enclosing>::'. Does not match typedefs 3136of an underlying type with the given name. 3137 3138Example matches X (regexp == "::X") 3139 class X; 3140 3141Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3142 namespace foo { namespace bar { class X; } } 3143</pre></td></tr> 3144 3145 3146<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> 3147<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3148 3149Given 3150 namespace n { 3151 namespace {} #1 3152 } 3153namespaceDecl(isAnonymous()) will match #1 but not ::n. 3154</pre></td></tr> 3155 3156 3157<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> 3158<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3159the inline keyword. 3160 3161Given 3162 inline void f(); 3163 void g(); 3164 namespace n { 3165 inline namespace m {} 3166 } 3167functionDecl(isInline()) will match ::f(). 3168namespaceDecl(isInline()) will match n::m. 3169</pre></td></tr> 3170 3171 3172<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> 3173<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3174a specific number of arguments (including absent default arguments). 3175 3176Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3177 void f(int x, int y); 3178 f(0, 0); 3179</pre></td></tr> 3180 3181 3182<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> 3183<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3184 3185objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3186message expression in 3187 3188 UIWebView *webView = ...; 3189 CGRect bodyFrame = webView.frame; 3190 bodyFrame.size.height = self.bodyContentHeight; 3191 webView.frame = bodyFrame; 3192 ^---- matches here 3193</pre></td></tr> 3194 3195 3196<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> 3197<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3198 3199Matches only when the selector of the objCMessageExpr is NULL. This may 3200represent an error condition in the tree! 3201</pre></td></tr> 3202 3203 3204<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> 3205<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3206 3207 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3208 matches the outer message expr in the code below, but NOT the message 3209 invocation for self.bodyView. 3210 [self.bodyView loadHTMLString:html baseURL:NULL]; 3211</pre></td></tr> 3212 3213 3214<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> 3215<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3216 3217 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3218 matches self.bodyView in the code below, but NOT the outer message 3219 invocation of "loadHTMLString:baseURL:". 3220 [self.bodyView loadHTMLString:html baseURL:NULL]; 3221</pre></td></tr> 3222 3223 3224<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> 3225<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 3226a substring matched by the given RegExp. 3227 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 3228 invocation for self.bodyView. 3229 [self.bodyView loadHTMLString:html baseURL:NULL]; 3230</pre></td></tr> 3231 3232 3233<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> 3234<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 3235 3236 matcher = objCMessageExpr(numSelectorArgs(0)); 3237 matches self.bodyView in the code below 3238 3239 matcher = objCMessageExpr(numSelectorArgs(2)); 3240 matches the invocation of "loadHTMLString:baseURL:" but not that 3241 of self.bodyView 3242 [self.bodyView loadHTMLString:html baseURL:NULL]; 3243</pre></td></tr> 3244 3245 3246<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> 3247<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 3248 3249Example matches A, va, fa 3250 class A {}; 3251 class B; Doesn't match, as it has no body. 3252 int va; 3253 extern int vb; Doesn't match, as it doesn't define the variable. 3254 void fa() {} 3255 void fb(); Doesn't match, as it has no body. 3256 @interface X 3257 - (void)ma; Doesn't match, interface is declaration. 3258 @end 3259 @implementation X 3260 - (void)ma {} 3261 @end 3262 3263Usable 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>>, 3264 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3265</pre></td></tr> 3266 3267 3268<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> 3269<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 3270 3271Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 3272void x(int val) {} 3273void y(int val = 0) {} 3274</pre></td></tr> 3275 3276 3277<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> 3278<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 3279 3280Given 3281 class Y { public: void x(); }; 3282 void z() { Y* y; y->x(); } 3283cxxMemberCallExpr(on(hasType(asString("class Y *")))) 3284 matches y->x() 3285</pre></td></tr> 3286 3287 3288<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> 3289<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 3290 3291Matches a node if it equals the node previously bound to ID. 3292 3293Given 3294 class X { int a; int b; }; 3295cxxRecordDecl( 3296 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3297 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3298 matches the class X, as a and b have the same type. 3299 3300Note that when multiple matches are involved via forEach* matchers, 3301equalsBoundNodes acts as a filter. 3302For example: 3303compoundStmt( 3304 forEachDescendant(varDecl().bind("d")), 3305 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3306will trigger a match for each combination of variable declaration 3307and reference to that variable declaration within a compound statement. 3308</pre></td></tr> 3309 3310 3311<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> 3312<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 3313the node, not hidden within a typedef. 3314 3315Given 3316 typedef const int const_int; 3317 const_int i; 3318 int *const j; 3319 int *volatile k; 3320 int m; 3321varDecl(hasType(hasLocalQualifiers())) matches only j and k. 3322i is const-qualified but the qualifier is not local. 3323</pre></td></tr> 3324 3325 3326<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> 3327<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 3328 3329Given 3330 void a(char); 3331 void b(wchar_t); 3332 void c(double); 3333functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 3334matches "a(char)", "b(wchar_t)", but not "c(double)". 3335</pre></td></tr> 3336 3337 3338<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> 3339<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 3340the Objective-C object pointer type, which is different despite being 3341syntactically similar. 3342 3343Given 3344 int *i = nullptr; 3345 3346 @interface Foo 3347 @end 3348 Foo *f; 3349 3350 int j; 3351varDecl(hasType(isAnyPointer())) 3352 matches "int *i" and "Foo *f", but not "int j". 3353</pre></td></tr> 3354 3355 3356<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> 3357<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 3358include "top-level" const. 3359 3360Given 3361 void a(int); 3362 void b(int const); 3363 void c(const int); 3364 void d(const int*); 3365 void e(int const) {}; 3366functionDecl(hasAnyParameter(hasType(isConstQualified()))) 3367 matches "void b(int const)", "void c(const int)" and 3368 "void e(int const) {}". It does not match d as there 3369 is no top-level const on the parameter type "const int *". 3370</pre></td></tr> 3371 3372 3373<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> 3374<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 3375 3376Given 3377 void a(int); 3378 void b(long); 3379 void c(double); 3380functionDecl(hasAnyParameter(hasType(isInteger()))) 3381matches "a(int)", "b(long)", but not "c(double)". 3382</pre></td></tr> 3383 3384 3385<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> 3386<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 3387 3388Given 3389 void a(int); 3390 void b(unsigned long); 3391 void c(double); 3392functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 3393matches "a(int)", but not "b(unsigned long)" and "c(double)". 3394</pre></td></tr> 3395 3396 3397<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> 3398<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 3399 3400Given 3401 void a(int); 3402 void b(unsigned long); 3403 void c(double); 3404functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 3405matches "b(unsigned long)", but not "a(int)" and "c(double)". 3406</pre></td></tr> 3407 3408 3409<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> 3410<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 3411include "top-level" volatile. 3412 3413Given 3414 void a(int); 3415 void b(int volatile); 3416 void c(volatile int); 3417 void d(volatile int*); 3418 void e(int volatile) {}; 3419functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 3420 matches "void b(int volatile)", "void c(volatile int)" and 3421 "void e(int volatile) {}". It does not match d as there 3422 is no top-level volatile on the parameter type "volatile int *". 3423</pre></td></tr> 3424 3425 3426<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> 3427<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 3428 3429Example matches C, but not S or U. 3430 struct S {}; 3431 class C {}; 3432 union U {}; 3433</pre></td></tr> 3434 3435 3436<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> 3437<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 3438 3439Example matches S, but not C or U. 3440 struct S {}; 3441 class C {}; 3442 union U {}; 3443</pre></td></tr> 3444 3445 3446<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> 3447<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 3448 3449Example matches U, but not C or S. 3450 struct S {}; 3451 class C {}; 3452 union U {}; 3453</pre></td></tr> 3454 3455 3456<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> 3457<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 3458 3459Matches a node if it equals the node previously bound to ID. 3460 3461Given 3462 class X { int a; int b; }; 3463cxxRecordDecl( 3464 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3465 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3466 matches the class X, as a and b have the same type. 3467 3468Note that when multiple matches are involved via forEach* matchers, 3469equalsBoundNodes acts as a filter. 3470For example: 3471compoundStmt( 3472 forEachDescendant(varDecl().bind("d")), 3473 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3474will trigger a match for each combination of variable declaration 3475and reference to that variable declaration within a compound statement. 3476</pre></td></tr> 3477 3478 3479<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> 3480<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 3481 3482Stmt has pointer identity in the AST. 3483</pre></td></tr> 3484 3485 3486<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> 3487<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 3488partially matching a given regex. 3489 3490Example matches Y but not X 3491 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3492 #include "ASTMatcher.h" 3493 class X {}; 3494ASTMatcher.h: 3495 class Y {}; 3496 3497Usable 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>> 3498</pre></td></tr> 3499 3500 3501<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> 3502<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 3503 3504Example matches X but not Y 3505 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3506 #include <Y.h> 3507 class X {}; 3508Y.h: 3509 class Y {}; 3510 3511Usable 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>> 3512</pre></td></tr> 3513 3514 3515<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> 3516<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 3517 3518Example matches Y but not X 3519 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3520 #include <SystemHeader.h> 3521 class X {}; 3522SystemHeader.h: 3523 class Y {}; 3524 3525Usable 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>> 3526</pre></td></tr> 3527 3528 3529<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> 3530<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 3531 3532Given 3533 int a[42]; 3534 int b[2 * 21]; 3535 int c[41], d[43]; 3536 char *s = "abcd"; 3537 wchar_t *ws = L"abcd"; 3538 char *w = "a"; 3539constantArrayType(hasSize(42)) 3540 matches "int a[42]" and "int b[2 * 21]" 3541stringLiteral(hasSize(4)) 3542 matches "abcd", L"abcd" 3543</pre></td></tr> 3544 3545 3546<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> 3547<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 3548 3549Example matches A, va, fa 3550 class A {}; 3551 class B; Doesn't match, as it has no body. 3552 int va; 3553 extern int vb; Doesn't match, as it doesn't define the variable. 3554 void fa() {} 3555 void fb(); Doesn't match, as it has no body. 3556 @interface X 3557 - (void)ma; Doesn't match, interface is declaration. 3558 @end 3559 @implementation X 3560 - (void)ma {} 3561 @end 3562 3563Usable 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>>, 3564 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3565</pre></td></tr> 3566 3567 3568<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> 3569<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 3570 3571Note that 'Value' is a string as the template argument's value is 3572an arbitrary precision integer. 'Value' must be euqal to the canonical 3573representation of that integral value in base 10. 3574 3575Given 3576 template<int T> struct C {}; 3577 C<42> c; 3578classTemplateSpecializationDecl( 3579 hasAnyTemplateArgument(equalsIntegralValue("42"))) 3580 matches the implicit instantiation of C in C<42>. 3581</pre></td></tr> 3582 3583 3584<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> 3585<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 3586 3587Given 3588 template<int T> struct C {}; 3589 C<42> c; 3590classTemplateSpecializationDecl( 3591 hasAnyTemplateArgument(isIntegral())) 3592 matches the implicit instantiation of C in C<42> 3593 with isIntegral() matching 42. 3594</pre></td></tr> 3595 3596 3597<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> 3598<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 3599 3600Given 3601 template<typename T> struct C {}; 3602 C<int> c; 3603classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3604 matches C<int>. 3605</pre></td></tr> 3606 3607 3608<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> 3609<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 3610partially matching a given regex. 3611 3612Example matches Y but not X 3613 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3614 #include "ASTMatcher.h" 3615 class X {}; 3616ASTMatcher.h: 3617 class Y {}; 3618 3619Usable 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>> 3620</pre></td></tr> 3621 3622 3623<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> 3624<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 3625 3626Example matches X but not Y 3627 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3628 #include <Y.h> 3629 class X {}; 3630Y.h: 3631 class Y {}; 3632 3633Usable 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>> 3634</pre></td></tr> 3635 3636 3637<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> 3638<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 3639 3640Example matches Y but not X 3641 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3642 #include <SystemHeader.h> 3643 class X {}; 3644SystemHeader.h: 3645 class Y {}; 3646 3647Usable 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>> 3648</pre></td></tr> 3649 3650 3651<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> 3652<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 3653 3654Given 3655 struct S { bool func(); }; 3656functionDecl(returns(booleanType())) 3657 matches "bool func();" 3658</pre></td></tr> 3659 3660 3661<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> 3662<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 3663 3664Matches a node if it equals the node previously bound to ID. 3665 3666Given 3667 class X { int a; int b; }; 3668cxxRecordDecl( 3669 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3670 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3671 matches the class X, as a and b have the same type. 3672 3673Note that when multiple matches are involved via forEach* matchers, 3674equalsBoundNodes acts as a filter. 3675For example: 3676compoundStmt( 3677 forEachDescendant(varDecl().bind("d")), 3678 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3679will trigger a match for each combination of variable declaration 3680and reference to that variable declaration within a compound statement. 3681</pre></td></tr> 3682 3683 3684<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> 3685<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 3686 3687Type has pointer identity in the AST. 3688</pre></td></tr> 3689 3690 3691<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> 3692<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 3693 3694Given 3695 int i; 3696 float f; 3697realFloatingPointType() 3698 matches "float f" but not "int i" 3699</pre></td></tr> 3700 3701 3702<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> 3703<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 3704 3705Given 3706 struct S { void func(); }; 3707functionDecl(returns(voidType())) 3708 matches "void func();" 3709</pre></td></tr> 3710 3711 3712<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> 3713<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 3714 3715Given 3716 int x; 3717 int s = sizeof(x) + alignof(x) 3718unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 3719 matches sizeof(x) 3720</pre></td></tr> 3721 3722 3723<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> 3724<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3725unary). 3726 3727Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3728 !(a || b) 3729</pre></td></tr> 3730 3731 3732<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> 3733<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 3734 3735Example matches x, but not y, z, or a. 3736(matcher = varDecl(hasAutomaticStorageDuration()) 3737void f() { 3738 int x; 3739 static int y; 3740 thread_local int z; 3741} 3742int a; 3743</pre></td></tr> 3744 3745 3746<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> 3747<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 3748 3749Example matches y and z (matcher = varDecl(hasGlobalStorage()) 3750void f() { 3751 int x; 3752 static int y; 3753} 3754int z; 3755</pre></td></tr> 3756 3757 3758<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> 3759<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 3760non-static local variable. 3761 3762Example matches x (matcher = varDecl(hasLocalStorage()) 3763void f() { 3764 int x; 3765 static int y; 3766} 3767int z; 3768</pre></td></tr> 3769 3770 3771<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> 3772<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 3773It includes the variable declared at namespace scope and those declared 3774with "static" and "extern" storage class specifiers. 3775 3776void f() { 3777 int x; 3778 static int y; 3779 thread_local int z; 3780} 3781int a; 3782static int b; 3783extern int c; 3784varDecl(hasStaticStorageDuration()) 3785 matches the function declaration y, a, b and c. 3786</pre></td></tr> 3787 3788 3789<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> 3790<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 3791 3792Example matches z, but not x, z, or a. 3793(matcher = varDecl(hasThreadStorageDuration()) 3794void f() { 3795 int x; 3796 static int y; 3797 thread_local int z; 3798} 3799int a; 3800</pre></td></tr> 3801 3802 3803<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> 3804<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. 3805 3806Given: 3807 constexpr int foo = 42; 3808 constexpr int bar(); 3809varDecl(isConstexpr()) 3810 matches the declaration of foo. 3811functionDecl(isConstexpr()) 3812 matches the declaration of bar. 3813</pre></td></tr> 3814 3815 3816<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> 3817<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 3818 3819Example matches A, va, fa 3820 class A {}; 3821 class B; Doesn't match, as it has no body. 3822 int va; 3823 extern int vb; Doesn't match, as it doesn't define the variable. 3824 void fa() {} 3825 void fb(); Doesn't match, as it has no body. 3826 @interface X 3827 - (void)ma; Doesn't match, interface is declaration. 3828 @end 3829 @implementation X 3830 - (void)ma {} 3831 @end 3832 3833Usable 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>>, 3834 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3835</pre></td></tr> 3836 3837 3838<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> 3839<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 3840a C++ catch block, or an Objective-C statement. 3841 3842Example matches x (matcher = varDecl(isExceptionVariable()) 3843void f(int y) { 3844 try { 3845 } catch (int x) { 3846 } 3847} 3848</pre></td></tr> 3849 3850 3851<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> 3852<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 3853static member variable template instantiations. 3854 3855Given 3856 template<typename T> void A(T t) { } 3857 template<> void A(int N) { } 3858functionDecl(isExplicitTemplateSpecialization()) 3859 matches the specialization A<int>(). 3860 3861Usable 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>> 3862</pre></td></tr> 3863 3864 3865<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> 3866<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 3867 3868Given: 3869 extern "C" void f() {} 3870 extern "C" { void g() {} } 3871 void h() {} 3872 extern "C" int x = 1; 3873 extern "C" int y = 2; 3874 int z = 3; 3875functionDecl(isExternC()) 3876 matches the declaration of f and g, but not the declaration of h. 3877varDecl(isExternC()) 3878 matches the declaration of x and y, but not the declaration of z. 3879</pre></td></tr> 3880 3881 3882<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> 3883<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage 3884class specifier ("static" keyword) written in the source. 3885 3886Given: 3887 static void f() {} 3888 static int i = 0; 3889 extern int j; 3890 int k; 3891functionDecl(isStaticStorageClass()) 3892 matches the function declaration f. 3893varDecl(isStaticStorageClass()) 3894 matches the variable declaration i. 3895</pre></td></tr> 3896 3897 3898<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> 3899<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 3900member variable template instantiations. 3901 3902Given 3903 template <typename T> class X {}; class A {}; X<A> x; 3904or 3905 template <typename T> class X {}; class A {}; template class X<A>; 3906or 3907 template <typename T> class X {}; class A {}; extern template class X<A>; 3908cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3909 matches the template instantiation of X<A>. 3910 3911But given 3912 template <typename T> class X {}; class A {}; 3913 template <> class X<A> {}; X<A> x; 3914cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3915 does not match, as X<A> is an explicit template specialization. 3916 3917Usable 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>> 3918</pre></td></tr> 3919 3920 3921<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> 3922<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3923template instantiations. 3924 3925Given 3926 template<typename T> void A(T t) { T i; } 3927 A(0); 3928 A(0U); 3929functionDecl(isInstantiated()) 3930 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3931</pre></td></tr> 3932 3933 3934<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> 3935<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3936GNU's __null, C++11's nullptr, or C's NULL macro. 3937 3938Given: 3939 void *v1 = NULL; 3940 void *v2 = nullptr; 3941 void *v3 = __null; GNU extension 3942 char *cp = (char *)0; 3943 int *ip = 0; 3944 int i = 0; 3945expr(nullPointerConstant()) 3946 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3947 initializer for i. 3948</pre></td></tr> 3949 3950 3951<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> 3952<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3953 3954This matcher is only provided as a performance optimization of hasName. 3955 hasAnyName(a, b, c) 3956 is equivalent to, but faster than 3957 anyOf(hasName(a), hasName(b), hasName(c)) 3958</pre></td></tr> 3959 3960 3961<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> 3962<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 3963Selector.getAsString() 3964 3965 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 3966 matches both of the expressions below: 3967 [myObj methodA:argA]; 3968 [myObj methodB:argB]; 3969</pre></td></tr> 3970 3971 3972<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> 3973<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 3974 3975Given 3976 int j; 3977 template<typename T> void A(T t) { T i; j += 42;} 3978 A(0); 3979 A(0U); 3980declStmt(isInTemplateInstantiation()) 3981 matches 'int i;' and 'unsigned i'. 3982unless(stmt(isInTemplateInstantiation())) 3983 will NOT match j += 42; as it's shared between the template definition and 3984 instantiation. 3985</pre></td></tr> 3986 3987<!--END_NARROWING_MATCHERS --> 3988</table> 3989 3990<!-- ======================================================================= --> 3991<h2 id="traversal-matchers">AST Traversal Matchers</h2> 3992<!-- ======================================================================= --> 3993 3994<p>Traversal matchers specify the relationship to other nodes that are 3995reachable from the current node.</p> 3996 3997<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 3998forEachDescendant) which work on all nodes and allow users to write more generic 3999match expressions.</p> 4000 4001<table> 4002<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 4003<!-- START_TRAVERSAL_MATCHERS --> 4004 4005<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4006<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 4007 4008Unlike anyOf, eachOf will generate a match result for each 4009matching submatcher. 4010 4011For example, in: 4012 class A { int a; int b; }; 4013The matcher: 4014 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 4015 has(fieldDecl(hasName("b")).bind("v")))) 4016will generate two results binding "v", the first of which binds 4017the field declaration of a, the second the field declaration of 4018b. 4019 4020Usable as: Any Matcher 4021</pre></td></tr> 4022 4023 4024<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 4025<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4026provided matcher. 4027 4028Example matches X, A, A::X, B, B::C, B::C::X 4029 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 4030 class X {}; 4031 class A { class X {}; }; Matches A, because A::X is a class of name 4032 X inside A. 4033 class B { class C { class X {}; }; }; 4034 4035DescendantT must be an AST base type. 4036 4037As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 4038each result that matches instead of only on the first one. 4039 4040Note: Recursively combined ForEachDescendant can cause many matches: 4041 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 4042 forEachDescendant(cxxRecordDecl()) 4043 ))) 4044will match 10 times (plus injected class name matches) on: 4045 class A { class B { class C { class D { class E {}; }; }; }; }; 4046 4047Usable as: Any Matcher 4048</pre></td></tr> 4049 4050 4051<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 4052<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 4053provided matcher. 4054 4055Example matches X, Y, Y::X, Z::Y, Z::Y::X 4056 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 4057 class X {}; 4058 class Y { class X {}; }; Matches Y, because Y::X is a class of name X 4059 inside Y. 4060 class Z { class Y { class X {}; }; }; Does not match Z. 4061 4062ChildT must be an AST base type. 4063 4064As opposed to 'has', 'forEach' will cause a match for each result that 4065matches instead of only on the first one. 4066 4067Usable as: Any Matcher 4068</pre></td></tr> 4069 4070 4071<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 4072<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 4073matcher. 4074 4075Given 4076void f() { if (true) { int x = 42; } } 4077void g() { for (;;) { int x = 43; } } 4078expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 4079 4080Usable as: Any Matcher 4081</pre></td></tr> 4082 4083 4084<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 4085<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4086provided matcher. 4087 4088Example matches X, Y, Z 4089 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 4090 class X {}; Matches X, because X::X is a class of name X inside X. 4091 class Y { class X {}; }; 4092 class Z { class Y { class X {}; }; }; 4093 4094DescendantT must be an AST base type. 4095 4096Usable as: Any Matcher 4097</pre></td></tr> 4098 4099 4100<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 4101<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 4102provided matcher. 4103 4104Example matches X, Y 4105 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 4106 class X {}; Matches X, because X::X is a class of name X inside X. 4107 class Y { class X {}; }; 4108 class Z { class Y { class X {}; }; }; Does not match Z. 4109 4110ChildT must be an AST base type. 4111 4112Usable as: Any Matcher 4113Note that has is direct matcher, so it also matches things like implicit 4114casts and paren casts. If you are matching with expr then you should 4115probably consider using ignoringParenImpCasts like: 4116has(ignoringParenImpCasts(expr())). 4117</pre></td></tr> 4118 4119 4120<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 4121<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 4122matcher. 4123 4124Given 4125void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 4126compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 4127 4128Usable as: Any Matcher 4129</pre></td></tr> 4130 4131 4132<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> 4133<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 4134switch statement or conditional operator. 4135 4136Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4137 if (true) {} 4138</pre></td></tr> 4139 4140 4141<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> 4142<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 4143(binary or ternary). 4144 4145Example matches b 4146 condition ? a : b 4147 condition ?: b 4148</pre></td></tr> 4149 4150 4151<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> 4152<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 4153 4154Example 1 (conditional ternary operator): matches a 4155 condition ? a : b 4156 4157Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 4158 condition ?: b 4159</pre></td></tr> 4160 4161 4162<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> 4163<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 4164matches the given matcher. 4165 4166The associated declaration is: 4167- for type nodes, the declaration of the underlying type 4168- for CallExpr, the declaration of the callee 4169- for MemberExpr, the declaration of the referenced member 4170- for CXXConstructExpr, the declaration of the constructor 4171- for CXXNewExpr, the declaration of the operator new 4172 4173For type nodes, hasDeclaration will generally match the declaration of the 4174sugared type. Given 4175 class X {}; 4176 typedef X Y; 4177 Y y; 4178in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4179typedefDecl. A common use case is to match the underlying, desugared type. 4180This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4181 varDecl(hasType(hasUnqualifiedDesugaredType( 4182 recordType(hasDeclaration(decl()))))) 4183In this matcher, the decl will match the CXXRecordDecl of class X. 4184 4185Usable 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>>, 4186 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>>, 4187 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>>, 4188 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>>, 4189 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>>, 4190 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>>, 4191 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4192</pre></td></tr> 4193 4194 4195<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> 4196<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 4197 4198Given 4199 int i[5]; 4200 void f() { i[1] = 42; } 4201arraySubscriptExpression(hasBase(implicitCastExpr( 4202 hasSourceExpression(declRefExpr())))) 4203 matches i[1] with the declRefExpr() matching i 4204</pre></td></tr> 4205 4206 4207<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> 4208<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 4209 4210Given 4211 int i[5]; 4212 void f() { i[1] = 42; } 4213arraySubscriptExpression(hasIndex(integerLiteral())) 4214 matches i[1] with the integerLiteral() matching 1 4215</pre></td></tr> 4216 4217 4218<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> 4219<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 4220 4221Example matches a (matcher = binaryOperator(hasLHS())) 4222 a || b 4223</pre></td></tr> 4224 4225 4226<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> 4227<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 4228 4229Example matches b (matcher = binaryOperator(hasRHS())) 4230 a || b 4231</pre></td></tr> 4232 4233 4234<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> 4235<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 4236type. 4237 4238Given 4239 struct A {}; 4240 A a[7]; 4241 int b[7]; 4242arrayType(hasElementType(builtinType())) 4243 matches "int b[7]" 4244 4245Usable 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>> 4246</pre></td></tr> 4247 4248 4249<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> 4250<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 4251type. 4252 4253Given 4254 struct A {}; 4255 A a[7]; 4256 int b[7]; 4257arrayType(hasElementType(builtinType())) 4258 matches "int b[7]" 4259 4260Usable 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>> 4261</pre></td></tr> 4262 4263 4264<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> 4265<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 4266 4267Given 4268 _Atomic(int) i; 4269 _Atomic(float) f; 4270atomicType(hasValueType(isInteger())) 4271 matches "_Atomic(int) i" 4272 4273Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4274</pre></td></tr> 4275 4276 4277<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> 4278<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 4279 4280Given 4281 _Atomic(int) i; 4282 _Atomic(float) f; 4283atomicType(hasValueType(isInteger())) 4284 matches "_Atomic(int) i" 4285 4286Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4287</pre></td></tr> 4288 4289 4290<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> 4291<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 4292 4293Note: There is no TypeLoc for the deduced type and thus no 4294getDeducedLoc() matcher. 4295 4296Given 4297 auto a = 1; 4298 auto b = 2.0; 4299autoType(hasDeducedType(isInteger())) 4300 matches "auto a" 4301 4302Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 4303</pre></td></tr> 4304 4305 4306<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> 4307<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 4308binary operator matches. 4309</pre></td></tr> 4310 4311 4312<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> 4313<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 4314 4315Example matches a (matcher = binaryOperator(hasLHS())) 4316 a || b 4317</pre></td></tr> 4318 4319 4320<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> 4321<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 4322 4323Example matches b (matcher = binaryOperator(hasRHS())) 4324 a || b 4325</pre></td></tr> 4326 4327 4328<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> 4329<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 4330pointee matches a given matcher. 4331 4332Given 4333 int *a; 4334 int const *b; 4335 float const *f; 4336pointerType(pointee(isConstQualified(), isInteger())) 4337 matches "int const *b" 4338 4339Usable 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>>, 4340 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>> 4341</pre></td></tr> 4342 4343 4344<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> 4345<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 4346pointee matches a given matcher. 4347 4348Given 4349 int *a; 4350 int const *b; 4351 float const *f; 4352pointerType(pointee(isConstQualified(), isInteger())) 4353 matches "int const *b" 4354 4355Usable 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>>, 4356 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>> 4357</pre></td></tr> 4358 4359 4360<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> 4361<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 4362 4363Given 4364 void f(int i); 4365 int y; 4366 f(y); 4367callExpr( 4368 forEachArgumentWithParam( 4369 declRefExpr(to(varDecl(hasName("y")))), 4370 parmVarDecl(hasType(isInteger())) 4371)) 4372 matches f(y); 4373with declRefExpr(...) 4374 matching int y 4375and parmVarDecl(...) 4376 matching int i 4377</pre></td></tr> 4378 4379 4380<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> 4381<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 4382expression, or an ObjC-message-send expression. 4383 4384Given 4385 void x(int, int, int) { int y; x(1, y, 42); } 4386callExpr(hasAnyArgument(declRefExpr())) 4387 matches x(1, y, 42) 4388with hasAnyArgument(...) 4389 matching y 4390 4391For ObjectiveC, given 4392 @interface I - (void) f:(int) y; @end 4393 void foo(I *i) { [i f:12]; } 4394objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 4395 matches [i f:12] 4396</pre></td></tr> 4397 4398 4399<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> 4400<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 4401call expression. 4402 4403Example matches y in x(y) 4404 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4405 void x(int) { int y; x(y); } 4406</pre></td></tr> 4407 4408 4409<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> 4410<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 4411matches the given matcher. 4412 4413The associated declaration is: 4414- for type nodes, the declaration of the underlying type 4415- for CallExpr, the declaration of the callee 4416- for MemberExpr, the declaration of the referenced member 4417- for CXXConstructExpr, the declaration of the constructor 4418- for CXXNewExpr, the declaration of the operator new 4419 4420For type nodes, hasDeclaration will generally match the declaration of the 4421sugared type. Given 4422 class X {}; 4423 typedef X Y; 4424 Y y; 4425in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4426typedefDecl. A common use case is to match the underlying, desugared type. 4427This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4428 varDecl(hasType(hasUnqualifiedDesugaredType( 4429 recordType(hasDeclaration(decl()))))) 4430In this matcher, the decl will match the CXXRecordDecl of class X. 4431 4432Usable 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>>, 4433 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>>, 4434 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>>, 4435 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>>, 4436 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>>, 4437 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>>, 4438 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4439</pre></td></tr> 4440 4441 4442<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> 4443<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 4444 4445Given 4446 class A { A() : i(42), j(42) {} int i; int j; }; 4447cxxConstructorDecl(forEachConstructorInitializer( 4448 forField(decl().bind("x")) 4449)) 4450 will trigger two matches, binding for 'i' and 'j' respectively. 4451</pre></td></tr> 4452 4453 4454<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> 4455<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 4456 4457Given 4458 struct Foo { 4459 Foo() : foo_(1) { } 4460 int foo_; 4461 }; 4462cxxRecordDecl(has(cxxConstructorDecl( 4463 hasAnyConstructorInitializer(anything()) 4464))) 4465 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 4466</pre></td></tr> 4467 4468 4469<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> 4470<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 4471 4472Given 4473 struct Foo { 4474 Foo() : foo_(1) { } 4475 int foo_; 4476 }; 4477cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 4478 forField(hasName("foo_")))))) 4479 matches Foo 4480with forField matching foo_ 4481</pre></td></tr> 4482 4483 4484<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> 4485<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 4486 4487Given 4488 struct Foo { 4489 Foo() : foo_(1) { } 4490 int foo_; 4491 }; 4492cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 4493 withInitializer(integerLiteral(equals(1))))))) 4494 matches Foo 4495with withInitializer matching (1) 4496</pre></td></tr> 4497 4498 4499<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> 4500<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 4501definition that has a given body. 4502 4503Given 4504 for (;;) {} 4505hasBody(compoundStmt()) 4506 matches 'for (;;) {}' 4507with compoundStmt() 4508 matching '{}' 4509</pre></td></tr> 4510 4511 4512<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> 4513<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 4514 4515Example: 4516 forStmt(hasLoopVariable(anything())) 4517matches 'int x' in 4518 for (int x : a) { } 4519</pre></td></tr> 4520 4521 4522<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> 4523<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 4524 4525Example: 4526 forStmt(hasRangeInit(anything())) 4527matches 'a' in 4528 for (int x : a) { } 4529</pre></td></tr> 4530 4531 4532<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> 4533<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 4534 4535 4536<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> 4537<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 4538 4539Example matches y.x() 4540 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) 4541 class Y { public: void x(); }; 4542 void z() { Y y; y.x(); } 4543 4544FIXME: Overload to allow directly matching types? 4545</pre></td></tr> 4546 4547 4548<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> 4549<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 4550</pre></td></tr> 4551 4552 4553<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> 4554<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 4555matcher, or is a pointer to a type that matches the InnerMatcher. 4556</pre></td></tr> 4557 4558 4559<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> 4560<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may 4561produce multiple matches. 4562 4563Given 4564 class A { virtual void f(); }; 4565 class B : public A { void f(); }; 4566 class C : public B { void f(); }; 4567cxxMethodDecl(ofClass(hasName("C")), 4568 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4569 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 4570 that B::f is not overridden by C::f). 4571 4572The check can produce multiple matches in case of multiple inheritance, e.g. 4573 class A1 { virtual void f(); }; 4574 class A2 { virtual void f(); }; 4575 class C : public A1, public A2 { void f(); }; 4576cxxMethodDecl(ofClass(hasName("C")), 4577 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4578 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 4579 once with "b" binding "A2::f" and "d" binding "C::f". 4580</pre></td></tr> 4581 4582 4583<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> 4584<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 4585belongs to. 4586 4587FIXME: Generalize this for other kinds of declarations. 4588FIXME: What other kind of declarations would we need to generalize 4589this to? 4590 4591Example matches A() in the last line 4592 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 4593 ofClass(hasName("A")))))) 4594 class A { 4595 public: 4596 A(); 4597 }; 4598 A a = A(); 4599</pre></td></tr> 4600 4601 4602<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> 4603<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 4604 4605Given: 4606 MyClass *p1 = new MyClass[10]; 4607cxxNewExpr(hasArraySize(intgerLiteral(equals(10)))) 4608 matches the expression 'new MyClass[10]'. 4609</pre></td></tr> 4610 4611 4612<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> 4613<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 4614matches the given matcher. 4615 4616The associated declaration is: 4617- for type nodes, the declaration of the underlying type 4618- for CallExpr, the declaration of the callee 4619- for MemberExpr, the declaration of the referenced member 4620- for CXXConstructExpr, the declaration of the constructor 4621- for CXXNewExpr, the declaration of the operator new 4622 4623For type nodes, hasDeclaration will generally match the declaration of the 4624sugared type. Given 4625 class X {}; 4626 typedef X Y; 4627 Y y; 4628in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4629typedefDecl. A common use case is to match the underlying, desugared type. 4630This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4631 varDecl(hasType(hasUnqualifiedDesugaredType( 4632 recordType(hasDeclaration(decl()))))) 4633In this matcher, the decl will match the CXXRecordDecl of class X. 4634 4635Usable 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>>, 4636 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>>, 4637 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>>, 4638 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>>, 4639 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>>, 4640 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>>, 4641 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4642</pre></td></tr> 4643 4644 4645<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> 4646<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 4647 4648Given: 4649 class A { void func(); }; 4650 class B { void member(); }; 4651 4652cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 4653A but not B. 4654</pre></td></tr> 4655 4656 4657<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> 4658<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 4659a class matching Base. 4660 4661Note that a class is not considered to be derived from itself. 4662 4663Example matches Y, Z, C (Base == hasName("X")) 4664 class X; 4665 class Y : public X {}; directly derived 4666 class Z : public Y {}; indirectly derived 4667 typedef X A; 4668 typedef A B; 4669 class C : public B {}; derived from a typedef of X 4670 4671In the following example, Bar matches isDerivedFrom(hasName("X")): 4672 class Foo; 4673 typedef Foo X; 4674 class Bar : public Foo {}; derived from a type that X is a typedef of 4675</pre></td></tr> 4676 4677 4678<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> 4679<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 4680match Base. 4681</pre></td></tr> 4682 4683 4684<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> 4685<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 4686given matcher. 4687 4688Example matches y.x() (matcher = callExpr(callee( 4689 cxxMethodDecl(hasName("x"))))) 4690 class Y { public: void x(); }; 4691 void z() { Y y; y.x(); } 4692</pre></td></tr> 4693 4694 4695<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> 4696<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 4697 4698Given 4699 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 4700 void f() { f(); } 4701callExpr(callee(expr())) 4702 matches this->x(), x(), y.x(), f() 4703with callee(...) 4704 matching this->x, x, y.x, f respectively 4705 4706Note: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 4707because this introduces ambiguous overloads with calls to Callee taking a 4708internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 4709implemented in terms of implicit casts. 4710</pre></td></tr> 4711 4712 4713<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> 4714<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 4715 4716Given 4717 void f(int i); 4718 int y; 4719 f(y); 4720callExpr( 4721 forEachArgumentWithParam( 4722 declRefExpr(to(varDecl(hasName("y")))), 4723 parmVarDecl(hasType(isInteger())) 4724)) 4725 matches f(y); 4726with declRefExpr(...) 4727 matching int y 4728and parmVarDecl(...) 4729 matching int i 4730</pre></td></tr> 4731 4732 4733<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> 4734<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 4735expression, or an ObjC-message-send expression. 4736 4737Given 4738 void x(int, int, int) { int y; x(1, y, 42); } 4739callExpr(hasAnyArgument(declRefExpr())) 4740 matches x(1, y, 42) 4741with hasAnyArgument(...) 4742 matching y 4743 4744For ObjectiveC, given 4745 @interface I - (void) f:(int) y; @end 4746 void foo(I *i) { [i f:12]; } 4747objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 4748 matches [i f:12] 4749</pre></td></tr> 4750 4751 4752<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> 4753<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 4754call expression. 4755 4756Example matches y in x(y) 4757 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4758 void x(int) { int y; x(y); } 4759</pre></td></tr> 4760 4761 4762<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> 4763<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 4764matches the given matcher. 4765 4766The associated declaration is: 4767- for type nodes, the declaration of the underlying type 4768- for CallExpr, the declaration of the callee 4769- for MemberExpr, the declaration of the referenced member 4770- for CXXConstructExpr, the declaration of the constructor 4771- for CXXNewExpr, the declaration of the operator new 4772 4773For type nodes, hasDeclaration will generally match the declaration of the 4774sugared type. Given 4775 class X {}; 4776 typedef X Y; 4777 Y y; 4778in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4779typedefDecl. A common use case is to match the underlying, desugared type. 4780This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4781 varDecl(hasType(hasUnqualifiedDesugaredType( 4782 recordType(hasDeclaration(decl()))))) 4783In this matcher, the decl will match the CXXRecordDecl of class X. 4784 4785Usable 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>>, 4786 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>>, 4787 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>>, 4788 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>>, 4789 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>>, 4790 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>>, 4791 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4792</pre></td></tr> 4793 4794 4795<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> 4796<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 4797extension, matches the constant given in the statement. 4798 4799Given 4800 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 4801caseStmt(hasCaseConstant(integerLiteral())) 4802 matches "case 1:" 4803</pre></td></tr> 4804 4805 4806<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> 4807<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 4808or opaque value's source expression matches the given matcher. 4809 4810Example 1: matches "a string" 4811(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 4812class URL { URL(string); }; 4813URL url = "a string"; 4814 4815Example 2: matches 'b' (matcher = 4816opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 4817int a = b ?: 1; 4818</pre></td></tr> 4819 4820 4821<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> 4822<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 4823functionDecl that have at least one TemplateArgument matching the given 4824InnerMatcher. 4825 4826Given 4827 template<typename T> class A {}; 4828 template<> class A<double> {}; 4829 A<int> a; 4830 4831 template<typename T> f() {}; 4832 void func() { f<int>(); }; 4833 4834classTemplateSpecializationDecl(hasAnyTemplateArgument( 4835 refersToType(asString("int")))) 4836 matches the specialization A<int> 4837 4838functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 4839 matches the specialization f<int> 4840</pre></td></tr> 4841 4842 4843<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> 4844<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 4845 4846Given 4847 tempalate<typename T> class A {}; 4848 typedef A<int> B; 4849classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 4850 matches 'B' with classTemplateDecl() matching the class template 4851 declaration of 'A'. 4852</pre></td></tr> 4853 4854 4855<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> 4856<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 4857functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 4858 4859Given 4860 template<typename T, typename U> class A {}; 4861 A<bool, int> b; 4862 A<int, bool> c; 4863 4864 template<typename T> void f() {} 4865 void func() { f<int>(); }; 4866classTemplateSpecializationDecl(hasTemplateArgument( 4867 1, refersToType(asString("int")))) 4868 matches the specialization A<bool, int> 4869 4870functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 4871 matches the specialization f<int> 4872</pre></td></tr> 4873 4874 4875<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> 4876<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 4877type. 4878 4879Given 4880 struct A {}; 4881 A a[7]; 4882 int b[7]; 4883arrayType(hasElementType(builtinType())) 4884 matches "int b[7]" 4885 4886Usable 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>> 4887</pre></td></tr> 4888 4889 4890<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> 4891<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 4892type. 4893 4894Given 4895 struct A {}; 4896 A a[7]; 4897 int b[7]; 4898arrayType(hasElementType(builtinType())) 4899 matches "int b[7]" 4900 4901Usable 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>> 4902</pre></td></tr> 4903 4904 4905<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> 4906<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 4907a given matcher. Also matches StmtExprs that have CompoundStmt as children. 4908 4909Given 4910 { {}; 1+2; } 4911hasAnySubstatement(compoundStmt()) 4912 matches '{ {}; 1+2; }' 4913with compoundStmt() 4914 matching '{}' 4915</pre></td></tr> 4916 4917 4918<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> 4919<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 4920</pre></td></tr> 4921 4922 4923<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> 4924<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 4925matches the given matcher. 4926 4927The associated declaration is: 4928- for type nodes, the declaration of the underlying type 4929- for CallExpr, the declaration of the callee 4930- for MemberExpr, the declaration of the referenced member 4931- for CXXConstructExpr, the declaration of the constructor 4932- for CXXNewExpr, the declaration of the operator new 4933 4934For type nodes, hasDeclaration will generally match the declaration of the 4935sugared type. Given 4936 class X {}; 4937 typedef X Y; 4938 Y y; 4939in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4940typedefDecl. A common use case is to match the underlying, desugared type. 4941This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4942 varDecl(hasType(hasUnqualifiedDesugaredType( 4943 recordType(hasDeclaration(decl()))))) 4944In this matcher, the decl will match the CXXRecordDecl of class X. 4945 4946Usable 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>>, 4947 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>>, 4948 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>>, 4949 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>>, 4950 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>>, 4951 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>>, 4952 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4953</pre></td></tr> 4954 4955 4956<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> 4957<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 4958specific using shadow declaration. 4959 4960Given 4961 namespace a { void f() {} } 4962 using a::f; 4963 void g() { 4964 f(); Matches this .. 4965 a::f(); .. but not this. 4966 } 4967declRefExpr(throughUsingDecl(anything())) 4968 matches f() 4969</pre></td></tr> 4970 4971 4972<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> 4973<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 4974specified matcher. 4975 4976Example matches x in if(x) 4977 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 4978 bool x; 4979 if (x) {} 4980</pre></td></tr> 4981 4982 4983<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> 4984<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 4985 4986Note that this does not work for global declarations because the AST 4987breaks up multiple-declaration DeclStmt's into multiple single-declaration 4988DeclStmt's. 4989Example: Given non-global declarations 4990 int a, b = 0; 4991 int c; 4992 int d = 2, e; 4993declStmt(containsDeclaration( 4994 0, varDecl(hasInitializer(anything())))) 4995 matches only 'int d = 2, e;', and 4996declStmt(containsDeclaration(1, varDecl())) 4997 matches 'int a, b = 0' as well as 'int d = 2, e;' 4998 but 'int c;' is not matched. 4999</pre></td></tr> 5000 5001 5002<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> 5003<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 5004 5005Given 5006 int a, b; 5007 int c; 5008declStmt(hasSingleDecl(anything())) 5009 matches 'int c;' but not 'int a, b;'. 5010</pre></td></tr> 5011 5012 5013<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> 5014<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 5015the inner matcher. 5016 5017Given 5018 int x; 5019declaratorDecl(hasTypeLoc(loc(asString("int")))) 5020 matches int x 5021</pre></td></tr> 5022 5023 5024<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> 5025<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 5026Decl, matches InnerMatcher. 5027 5028Given 5029 namespace N { 5030 namespace M { 5031 class D {}; 5032 } 5033 } 5034 5035cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 5036declaration of class D. 5037</pre></td></tr> 5038 5039 5040<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> 5041<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 5042definition that has a given body. 5043 5044Given 5045 for (;;) {} 5046hasBody(compoundStmt()) 5047 matches 'for (;;) {}' 5048with compoundStmt() 5049 matching '{}' 5050</pre></td></tr> 5051 5052 5053<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> 5054<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 5055switch statement or conditional operator. 5056 5057Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5058 if (true) {} 5059</pre></td></tr> 5060 5061 5062<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> 5063<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 5064matches InnerMatcher if the qualifier exists. 5065 5066Given 5067 namespace N { 5068 namespace M { 5069 class D {}; 5070 } 5071 } 5072 N::M::D d; 5073 5074elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 5075matches the type of the variable declaration of d. 5076</pre></td></tr> 5077 5078 5079<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> 5080<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 5081 5082Given 5083 namespace N { 5084 namespace M { 5085 class D {}; 5086 } 5087 } 5088 N::M::D d; 5089 5090elaboratedType(namesType(recordType( 5091hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 5092declaration of d. 5093</pre></td></tr> 5094 5095 5096<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> 5097<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 5098matches the given matcher. 5099 5100The associated declaration is: 5101- for type nodes, the declaration of the underlying type 5102- for CallExpr, the declaration of the callee 5103- for MemberExpr, the declaration of the referenced member 5104- for CXXConstructExpr, the declaration of the constructor 5105- for CXXNewExpr, the declaration of the operator new 5106 5107For type nodes, hasDeclaration will generally match the declaration of the 5108sugared type. Given 5109 class X {}; 5110 typedef X Y; 5111 Y y; 5112in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5113typedefDecl. A common use case is to match the underlying, desugared type. 5114This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5115 varDecl(hasType(hasUnqualifiedDesugaredType( 5116 recordType(hasDeclaration(decl()))))) 5117In this matcher, the decl will match the CXXRecordDecl of class X. 5118 5119Usable 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>>, 5120 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>>, 5121 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>>, 5122 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>>, 5123 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>>, 5124 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>>, 5125 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5126</pre></td></tr> 5127 5128 5129<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> 5130<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 5131 5132(Note: Clang's AST refers to other conversions as "casts" too, and calls 5133actual casts "explicit" casts.) 5134</pre></td></tr> 5135 5136 5137<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> 5138<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 5139declaration's type. 5140 5141In case of a value declaration (for example a variable declaration), 5142this resolves one layer of indirection. For example, in the value 5143declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5144X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5145declaration of x. 5146 5147Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5148 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5149 class X {}; 5150 void y(X &x) { x; X z; } 5151 5152Usable 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>> 5153</pre></td></tr> 5154 5155 5156<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> 5157<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 5158matcher. 5159 5160Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5161 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5162 and U (matcher = typedefDecl(hasType(asString("int"))) 5163 class X {}; 5164 void y(X &x) { x; X z; } 5165 typedef int U; 5166</pre></td></tr> 5167 5168 5169<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> 5170<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 5171are stripped off. 5172 5173Parentheses and explicit casts are not discarded. 5174Given 5175 int arr[5]; 5176 int a = 0; 5177 char b = 0; 5178 const int c = a; 5179 int *d = arr; 5180 long e = (long) 0l; 5181The matchers 5182 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 5183 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 5184would match the declarations for a, b, c, and d, but not e. 5185While 5186 varDecl(hasInitializer(integerLiteral())) 5187 varDecl(hasInitializer(declRefExpr())) 5188only match the declarations for b, c, and d. 5189</pre></td></tr> 5190 5191 5192<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> 5193<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 5194nodes are stripped off. 5195 5196Parentheses and explicit casts are not discarded. 5197Given 5198 class C {}; 5199 C a = C(); 5200 C b; 5201 C c = b; 5202The matchers 5203 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 5204would match the declarations for a, b, and c. 5205While 5206 varDecl(hasInitializer(cxxConstructExpr())) 5207only match the declarations for b and c. 5208</pre></td></tr> 5209 5210 5211<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> 5212<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 5213casts are stripped off. 5214 5215Implicit and non-C Style casts are also discarded. 5216Given 5217 int a = 0; 5218 char b = (0); 5219 void* c = reinterpret_cast<char*>(0); 5220 char d = char(0); 5221The matcher 5222 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 5223would match the declarations for a, b, c, and d. 5224while 5225 varDecl(hasInitializer(integerLiteral())) 5226only match the declaration for a. 5227</pre></td></tr> 5228 5229 5230<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> 5231<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 5232parentheses are stripped off. 5233 5234Explicit casts are not discarded. 5235Given 5236 int arr[5]; 5237 int a = 0; 5238 char b = (0); 5239 const int c = a; 5240 int *d = (arr); 5241 long e = ((long) 0l); 5242The matchers 5243 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 5244 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 5245would match the declarations for a, b, c, and d, but not e. 5246while 5247 varDecl(hasInitializer(integerLiteral())) 5248 varDecl(hasInitializer(declRefExpr())) 5249would only match the declaration for a. 5250</pre></td></tr> 5251 5252 5253<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> 5254<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 5255 5256Given 5257 class C { 5258 int a = 2; 5259 int b = 3; 5260 int c; 5261 }; 5262fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 5263 matches 'int a;' but not 'int b;'. 5264fieldDecl(hasInClassInitializer(anything())) 5265 matches 'int a;' and 'int b;' but not 'int c;'. 5266</pre></td></tr> 5267 5268 5269<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> 5270<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 5271definition that has a given body. 5272 5273Given 5274 for (;;) {} 5275hasBody(compoundStmt()) 5276 matches 'for (;;) {}' 5277with compoundStmt() 5278 matching '{}' 5279</pre></td></tr> 5280 5281 5282<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> 5283<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 5284switch statement or conditional operator. 5285 5286Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5287 if (true) {} 5288</pre></td></tr> 5289 5290 5291<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> 5292<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 5293 5294Example: 5295 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 5296matches '++x' in 5297 for (x; x < N; ++x) { } 5298</pre></td></tr> 5299 5300 5301<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> 5302<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 5303 5304Example: 5305 forStmt(hasLoopInit(declStmt())) 5306matches 'int x = 0' in 5307 for (int x = 0; x < N; ++x) { } 5308</pre></td></tr> 5309 5310 5311<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> 5312<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or ObjC method declaration. 5313 5314Does not match the 'this' parameter of a method. 5315 5316Given 5317 class X { void f(int x, int y, int z) {} }; 5318cxxMethodDecl(hasAnyParameter(hasName("y"))) 5319 matches f(int x, int y, int z) {} 5320with hasAnyParameter(...) 5321 matching int y 5322 5323For ObjectiveC, given 5324 @interface I - (void) f:(int) y; @end 5325 5326the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5327matches the declaration of method f with hasParameter 5328matching y. 5329</pre></td></tr> 5330 5331 5332<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> 5333<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5334functionDecl that have at least one TemplateArgument matching the given 5335InnerMatcher. 5336 5337Given 5338 template<typename T> class A {}; 5339 template<> class A<double> {}; 5340 A<int> a; 5341 5342 template<typename T> f() {}; 5343 void func() { f<int>(); }; 5344 5345classTemplateSpecializationDecl(hasAnyTemplateArgument( 5346 refersToType(asString("int")))) 5347 matches the specialization A<int> 5348 5349functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5350 matches the specialization f<int> 5351</pre></td></tr> 5352 5353 5354<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> 5355<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 5356definition that has a given body. 5357 5358Given 5359 for (;;) {} 5360hasBody(compoundStmt()) 5361 matches 'for (;;) {}' 5362with compoundStmt() 5363 matching '{}' 5364</pre></td></tr> 5365 5366 5367<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> 5368<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 5369declaration. 5370 5371Given 5372 class X { void f(int x) {} }; 5373cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5374 matches f(int x) {} 5375with hasParameter(...) 5376 matching int x 5377 5378For ObjectiveC, given 5379 @interface I - (void) f:(int) y; @end 5380 5381the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5382matches the declaration of method f with hasParameter 5383matching y. 5384</pre></td></tr> 5385 5386 5387<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> 5388<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5389functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5390 5391Given 5392 template<typename T, typename U> class A {}; 5393 A<bool, int> b; 5394 A<int, bool> c; 5395 5396 template<typename T> void f() {} 5397 void func() { f<int>(); }; 5398classTemplateSpecializationDecl(hasTemplateArgument( 5399 1, refersToType(asString("int")))) 5400 matches the specialization A<bool, int> 5401 5402functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5403 matches the specialization f<int> 5404</pre></td></tr> 5405 5406 5407<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> 5408<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 5409 5410Given: 5411 class X { int f() { return 1; } }; 5412cxxMethodDecl(returns(asString("int"))) 5413 matches int f() { return 1; } 5414</pre></td></tr> 5415 5416 5417<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> 5418<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 5419switch statement or conditional operator. 5420 5421Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5422 if (true) {} 5423</pre></td></tr> 5424 5425 5426<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> 5427<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 5428 5429Given 5430 if (A* a = GetAPointer()) {} 5431hasConditionVariableStatement(...) 5432 matches 'A* a = GetAPointer()'. 5433</pre></td></tr> 5434 5435 5436<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> 5437<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 5438 5439Examples matches the if statement 5440 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 5441 if (false) false; else true; 5442</pre></td></tr> 5443 5444 5445<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> 5446<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 5447 5448Examples matches the if statement 5449 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 5450 if (false) true; else false; 5451</pre></td></tr> 5452 5453 5454<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> 5455<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 5456matcher. 5457 5458FIXME: Unit test this matcher 5459</pre></td></tr> 5460 5461 5462<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> 5463<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 5464(if expression have it). 5465</pre></td></tr> 5466 5467 5468<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> 5469<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 5470matches the given matcher. 5471 5472The associated declaration is: 5473- for type nodes, the declaration of the underlying type 5474- for CallExpr, the declaration of the callee 5475- for MemberExpr, the declaration of the referenced member 5476- for CXXConstructExpr, the declaration of the constructor 5477- for CXXNewExpr, the declaration of the operator new 5478 5479For type nodes, hasDeclaration will generally match the declaration of the 5480sugared type. Given 5481 class X {}; 5482 typedef X Y; 5483 Y y; 5484in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5485typedefDecl. A common use case is to match the underlying, desugared type. 5486This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5487 varDecl(hasType(hasUnqualifiedDesugaredType( 5488 recordType(hasDeclaration(decl()))))) 5489In this matcher, the decl will match the CXXRecordDecl of class X. 5490 5491Usable 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>>, 5492 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>>, 5493 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>>, 5494 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>>, 5495 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>>, 5496 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>>, 5497 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5498</pre></td></tr> 5499 5500 5501<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> 5502<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 5503matches the given matcher. 5504 5505The associated declaration is: 5506- for type nodes, the declaration of the underlying type 5507- for CallExpr, the declaration of the callee 5508- for MemberExpr, the declaration of the referenced member 5509- for CXXConstructExpr, the declaration of the constructor 5510- for CXXNewExpr, the declaration of the operator new 5511 5512For type nodes, hasDeclaration will generally match the declaration of the 5513sugared type. Given 5514 class X {}; 5515 typedef X Y; 5516 Y y; 5517in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5518typedefDecl. A common use case is to match the underlying, desugared type. 5519This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5520 varDecl(hasType(hasUnqualifiedDesugaredType( 5521 recordType(hasDeclaration(decl()))))) 5522In this matcher, the decl will match the CXXRecordDecl of class X. 5523 5524Usable 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>>, 5525 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>>, 5526 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>>, 5527 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>>, 5528 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>>, 5529 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>>, 5530 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5531</pre></td></tr> 5532 5533 5534<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> 5535<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 5536matches the given matcher. 5537 5538The associated declaration is: 5539- for type nodes, the declaration of the underlying type 5540- for CallExpr, the declaration of the callee 5541- for MemberExpr, the declaration of the referenced member 5542- for CXXConstructExpr, the declaration of the constructor 5543- for CXXNewExpr, the declaration of the operator new 5544 5545For type nodes, hasDeclaration will generally match the declaration of the 5546sugared type. Given 5547 class X {}; 5548 typedef X Y; 5549 Y y; 5550in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5551typedefDecl. A common use case is to match the underlying, desugared type. 5552This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5553 varDecl(hasType(hasUnqualifiedDesugaredType( 5554 recordType(hasDeclaration(decl()))))) 5555In this matcher, the decl will match the CXXRecordDecl of class X. 5556 5557Usable 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>>, 5558 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>>, 5559 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>>, 5560 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>>, 5561 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>>, 5562 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>>, 5563 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5564</pre></td></tr> 5565 5566 5567<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> 5568<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 5569matched by a given matcher. 5570 5571Given 5572 struct X { int m; }; 5573 void f(X x) { x.m; m; } 5574memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) 5575 matches "x.m" and "m" 5576with hasObjectExpression(...) 5577 matching "x" and the implicit object expression of "m" which has type X*. 5578</pre></td></tr> 5579 5580 5581<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> 5582<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 5583given matcher. 5584 5585Given 5586 struct { int first, second; } first, second; 5587 int i(second.first); 5588 int j(first.second); 5589memberExpr(member(hasName("first"))) 5590 matches second.first 5591 but not first.second (because the member name there is "second"). 5592</pre></td></tr> 5593 5594 5595<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> 5596<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 5597pointee matches a given matcher. 5598 5599Given 5600 int *a; 5601 int const *b; 5602 float const *f; 5603pointerType(pointee(isConstQualified(), isInteger())) 5604 matches "int const *b" 5605 5606Usable 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>>, 5607 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>> 5608</pre></td></tr> 5609 5610 5611<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> 5612<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 5613pointee matches a given matcher. 5614 5615Given 5616 int *a; 5617 int const *b; 5618 float const *f; 5619pointerType(pointee(isConstQualified(), isInteger())) 5620 matches "int const *b" 5621 5622Usable 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>>, 5623 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>> 5624</pre></td></tr> 5625 5626 5627<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> 5628<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 5629matcher. 5630 5631Given 5632 namespace N { template<class T> void f(T t); } 5633 template <class T> void g() { using N::f; f(T()); } 5634unresolvedLookupExpr(hasAnyDeclaration( 5635 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 5636 matches the use of f in g() . 5637</pre></td></tr> 5638 5639 5640<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> 5641<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 5642 5643Given 5644 struct A { struct B { struct C {}; }; }; 5645 A::B::C c; 5646nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 5647 matches "A::" 5648</pre></td></tr> 5649 5650 5651<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> 5652<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 5653given TypeLoc. 5654 5655Given 5656 struct A { struct B { struct C {}; }; }; 5657 A::B::C c; 5658nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 5659 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 5660 matches "A::" 5661</pre></td></tr> 5662 5663 5664<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> 5665<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 5666 5667Given 5668 struct A { struct B { struct C {}; }; }; 5669 A::B::C c; 5670nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 5671 matches "A::" 5672</pre></td></tr> 5673 5674 5675<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> 5676<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 5677given namespace matcher. 5678 5679Given 5680 namespace ns { struct A {}; } 5681 ns::A a; 5682nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 5683 matches "ns::" 5684</pre></td></tr> 5685 5686 5687<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> 5688<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 5689given QualType matcher without qualifiers. 5690 5691Given 5692 struct A { struct B { struct C {}; }; }; 5693 A::B::C c; 5694nestedNameSpecifier(specifiesType( 5695 hasDeclaration(cxxRecordDecl(hasName("A"))) 5696)) 5697 matches "A::" 5698</pre></td></tr> 5699 5700 5701<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> 5702<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5703expression, or an ObjC-message-send expression. 5704 5705Given 5706 void x(int, int, int) { int y; x(1, y, 42); } 5707callExpr(hasAnyArgument(declRefExpr())) 5708 matches x(1, y, 42) 5709with hasAnyArgument(...) 5710 matching y 5711 5712For ObjectiveC, given 5713 @interface I - (void) f:(int) y; @end 5714 void foo(I *i) { [i f:12]; } 5715objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5716 matches [i f:12] 5717</pre></td></tr> 5718 5719 5720<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> 5721<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 5722call expression. 5723 5724Example matches y in x(y) 5725 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5726 void x(int) { int y; x(y); } 5727</pre></td></tr> 5728 5729 5730<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> 5731<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 5732 5733Example 5734matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 5735matches the [webView ...] message invocation. 5736 NSString *webViewJavaScript = ... 5737 UIWebView *webView = ... 5738 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 5739</pre></td></tr> 5740 5741 5742<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> 5743<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or ObjC method declaration. 5744 5745Does not match the 'this' parameter of a method. 5746 5747Given 5748 class X { void f(int x, int y, int z) {} }; 5749cxxMethodDecl(hasAnyParameter(hasName("y"))) 5750 matches f(int x, int y, int z) {} 5751with hasAnyParameter(...) 5752 matching int y 5753 5754For ObjectiveC, given 5755 @interface I - (void) f:(int) y; @end 5756 5757the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5758matches the declaration of method f with hasParameter 5759matching y. 5760</pre></td></tr> 5761 5762 5763<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> 5764<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 5765declaration. 5766 5767Given 5768 class X { void f(int x) {} }; 5769cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5770 matches f(int x) {} 5771with hasParameter(...) 5772 matching int x 5773 5774For ObjectiveC, given 5775 @interface I - (void) f:(int) y; @end 5776 5777the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5778matches the declaration of method f with hasParameter 5779matching y. 5780</pre></td></tr> 5781 5782 5783<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> 5784<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 5785or opaque value's source expression matches the given matcher. 5786 5787Example 1: matches "a string" 5788(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 5789class URL { URL(string); }; 5790URL url = "a string"; 5791 5792Example 2: matches 'b' (matcher = 5793opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 5794int a = b ?: 1; 5795</pre></td></tr> 5796 5797 5798<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> 5799<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 5800overloads matches the given matcher. 5801 5802Given 5803 template <typename T> void foo(T); 5804 template <typename T> void bar(T); 5805 template <typename T> void baz(T t) { 5806 foo(t); 5807 bar(t); 5808 } 5809unresolvedLookupExpr(hasAnyDeclaration( 5810 functionTemplateDecl(hasName("foo")))) 5811 matches foo in foo(t); but not bar in bar(t); 5812</pre></td></tr> 5813 5814 5815<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> 5816<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 5817 5818Given 5819 int (*ptr_to_array)[4]; 5820 int (*ptr_to_func)(int); 5821 5822varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 5823ptr_to_func but not ptr_to_array. 5824 5825Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 5826</pre></td></tr> 5827 5828 5829<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> 5830<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 5831pointee matches a given matcher. 5832 5833Given 5834 int *a; 5835 int const *b; 5836 float const *f; 5837pointerType(pointee(isConstQualified(), isInteger())) 5838 matches "int const *b" 5839 5840Usable 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>>, 5841 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>> 5842</pre></td></tr> 5843 5844 5845<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> 5846<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 5847pointee matches a given matcher. 5848 5849Given 5850 int *a; 5851 int const *b; 5852 float const *f; 5853pointerType(pointee(isConstQualified(), isInteger())) 5854 matches "int const *b" 5855 5856Usable 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>>, 5857 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>> 5858</pre></td></tr> 5859 5860 5861<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> 5862<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 5863 5864Given: 5865 typedef int &int_ref; 5866 int a; 5867 int_ref b = a; 5868 5869varDecl(hasType(qualType(referenceType()))))) will not match the 5870declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 5871</pre></td></tr> 5872 5873 5874<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> 5875<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 5876matches the given matcher. 5877 5878The associated declaration is: 5879- for type nodes, the declaration of the underlying type 5880- for CallExpr, the declaration of the callee 5881- for MemberExpr, the declaration of the referenced member 5882- for CXXConstructExpr, the declaration of the constructor 5883- for CXXNewExpr, the declaration of the operator new 5884 5885For type nodes, hasDeclaration will generally match the declaration of the 5886sugared type. Given 5887 class X {}; 5888 typedef X Y; 5889 Y y; 5890in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5891typedefDecl. A common use case is to match the underlying, desugared type. 5892This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5893 varDecl(hasType(hasUnqualifiedDesugaredType( 5894 recordType(hasDeclaration(decl()))))) 5895In this matcher, the decl will match the CXXRecordDecl of class X. 5896 5897Usable 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>>, 5898 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>>, 5899 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>>, 5900 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>>, 5901 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>>, 5902 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>>, 5903 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5904</pre></td></tr> 5905 5906 5907<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> 5908<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 5909 5910Given 5911 void (*fp)(void); 5912The matcher 5913 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 5914would match the declaration for fp. 5915</pre></td></tr> 5916 5917 5918<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> 5919<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 5920</pre></td></tr> 5921 5922 5923<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> 5924<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 5925matches the specified matcher. 5926 5927Example matches y->x() 5928 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 5929 cxxRecordDecl(hasName("Y"))))))) 5930 class Y { public: void x(); }; 5931 void z() { Y *y; y->x(); } 5932</pre></td></tr> 5933 5934 5935<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> 5936<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 5937</pre></td></tr> 5938 5939 5940<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> 5941<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 5942type matches the specified matcher. 5943 5944Example matches X &x and const X &y 5945 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 5946 class X { 5947 void a(X b) { 5948 X &x = b; 5949 const X &y = b; 5950 } 5951 }; 5952</pre></td></tr> 5953 5954 5955<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> 5956<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 5957matches the given matcher. 5958 5959The associated declaration is: 5960- for type nodes, the declaration of the underlying type 5961- for CallExpr, the declaration of the callee 5962- for MemberExpr, the declaration of the referenced member 5963- for CXXConstructExpr, the declaration of the constructor 5964- for CXXNewExpr, the declaration of the operator new 5965 5966For type nodes, hasDeclaration will generally match the declaration of the 5967sugared type. Given 5968 class X {}; 5969 typedef X Y; 5970 Y y; 5971in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5972typedefDecl. A common use case is to match the underlying, desugared type. 5973This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5974 varDecl(hasType(hasUnqualifiedDesugaredType( 5975 recordType(hasDeclaration(decl()))))) 5976In this matcher, the decl will match the CXXRecordDecl of class X. 5977 5978Usable 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>>, 5979 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>>, 5980 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>>, 5981 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>>, 5982 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>>, 5983 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>>, 5984 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5985</pre></td></tr> 5986 5987 5988<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> 5989<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 5990pointee matches a given matcher. 5991 5992Given 5993 int *a; 5994 int const *b; 5995 float const *f; 5996pointerType(pointee(isConstQualified(), isInteger())) 5997 matches "int const *b" 5998 5999Usable 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>>, 6000 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>> 6001</pre></td></tr> 6002 6003 6004<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> 6005<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 6006pointee matches a given matcher. 6007 6008Given 6009 int *a; 6010 int const *b; 6011 float const *f; 6012pointerType(pointee(isConstQualified(), isInteger())) 6013 matches "int const *b" 6014 6015Usable 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>>, 6016 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>> 6017</pre></td></tr> 6018 6019 6020<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> 6021<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 6022 6023Given 6024 return a + b; 6025hasReturnValue(binaryOperator()) 6026 matches 'return a + b' 6027with binaryOperator() 6028 matching 'a + b' 6029</pre></td></tr> 6030 6031 6032<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> 6033<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 6034a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6035 6036Given 6037 { {}; 1+2; } 6038hasAnySubstatement(compoundStmt()) 6039 matches '{ {}; 1+2; }' 6040with compoundStmt() 6041 matching '{}' 6042</pre></td></tr> 6043 6044 6045<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> 6046<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 6047alignof. 6048</pre></td></tr> 6049 6050 6051<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> 6052<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 6053 6054Given: 6055F& operator=(const F& o) { 6056 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 6057 return *this; 6058} 6059returnStmt(forFunction(hasName("operator="))) 6060 matches 'return *this' 6061 but does match 'return > 0' 6062</pre></td></tr> 6063 6064 6065<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> 6066<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 6067sizeof. 6068</pre></td></tr> 6069 6070 6071<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> 6072<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 6073type that matches the provided matcher. 6074 6075Given 6076 template <typename T> 6077 double F(T t); 6078 int i; 6079 double j = F(i); 6080 6081substTemplateTypeParmType(hasReplacementType(type())) matches int 6082</pre></td></tr> 6083 6084 6085<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> 6086<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 6087statement. This matcher may produce multiple matches. 6088 6089Given 6090 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 6091switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 6092 matches four times, with "c" binding each of "case 1:", "case 2:", 6093"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 6094"switch (1)", "switch (2)" and "switch (2)". 6095</pre></td></tr> 6096 6097 6098<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> 6099<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 6100switch statement or conditional operator. 6101 6102Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6103 if (true) {} 6104</pre></td></tr> 6105 6106 6107<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> 6108<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 6109matches the given matcher. 6110 6111The associated declaration is: 6112- for type nodes, the declaration of the underlying type 6113- for CallExpr, the declaration of the callee 6114- for MemberExpr, the declaration of the referenced member 6115- for CXXConstructExpr, the declaration of the constructor 6116- for CXXNewExpr, the declaration of the operator new 6117 6118For type nodes, hasDeclaration will generally match the declaration of the 6119sugared type. Given 6120 class X {}; 6121 typedef X Y; 6122 Y y; 6123in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6124typedefDecl. A common use case is to match the underlying, desugared type. 6125This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6126 varDecl(hasType(hasUnqualifiedDesugaredType( 6127 recordType(hasDeclaration(decl()))))) 6128In this matcher, the decl will match the CXXRecordDecl of class X. 6129 6130Usable 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>>, 6131 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>>, 6132 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>>, 6133 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>>, 6134 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>>, 6135 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>>, 6136 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6137</pre></td></tr> 6138 6139 6140<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> 6141<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 6142 6143Given 6144 struct B { int next; }; 6145 template<int(B::*next_ptr)> struct A {}; 6146 A<&B::next> a; 6147templateSpecializationType(hasAnyTemplateArgument( 6148 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 6149 matches the specialization A<&B::next> with fieldDecl(...) matching 6150 B::next 6151</pre></td></tr> 6152 6153 6154<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> 6155<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 6156declaration. 6157 6158Given 6159 struct B { int next; }; 6160 template<int(B::*next_ptr)> struct A {}; 6161 A<&B::next> a; 6162classTemplateSpecializationDecl(hasAnyTemplateArgument( 6163 refersToDeclaration(fieldDecl(hasName("next"))))) 6164 matches the specialization A<&B::next> with fieldDecl(...) matching 6165 B::next 6166</pre></td></tr> 6167 6168 6169<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> 6170<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 6171 6172Given 6173 template<int T> struct C {}; 6174 C<42> c; 6175classTemplateSpecializationDecl( 6176 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 6177 matches the implicit instantiation of C in C<42>. 6178</pre></td></tr> 6179 6180 6181<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> 6182<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 6183 6184Given 6185 template<template <typename> class S> class X {}; 6186 template<typename T> class Y {};" 6187 X<Y> xi; 6188classTemplateSpecializationDecl(hasAnyTemplateArgument( 6189 refersToTemplate(templateName()))) 6190 matches the specialization X<Y> 6191</pre></td></tr> 6192 6193 6194<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> 6195<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 6196 6197Given 6198 struct X {}; 6199 template<typename T> struct A {}; 6200 A<X> a; 6201classTemplateSpecializationDecl(hasAnyTemplateArgument( 6202 refersToType(class(hasName("X"))))) 6203 matches the specialization A<X> 6204</pre></td></tr> 6205 6206 6207<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> 6208<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6209functionDecl that have at least one TemplateArgument matching the given 6210InnerMatcher. 6211 6212Given 6213 template<typename T> class A {}; 6214 template<> class A<double> {}; 6215 A<int> a; 6216 6217 template<typename T> f() {}; 6218 void func() { f<int>(); }; 6219 6220classTemplateSpecializationDecl(hasAnyTemplateArgument( 6221 refersToType(asString("int")))) 6222 matches the specialization A<int> 6223 6224functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6225 matches the specialization f<int> 6226</pre></td></tr> 6227 6228 6229<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> 6230<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 6231matches the given matcher. 6232 6233The associated declaration is: 6234- for type nodes, the declaration of the underlying type 6235- for CallExpr, the declaration of the callee 6236- for MemberExpr, the declaration of the referenced member 6237- for CXXConstructExpr, the declaration of the constructor 6238- for CXXNewExpr, the declaration of the operator new 6239 6240For type nodes, hasDeclaration will generally match the declaration of the 6241sugared type. Given 6242 class X {}; 6243 typedef X Y; 6244 Y y; 6245in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6246typedefDecl. A common use case is to match the underlying, desugared type. 6247This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6248 varDecl(hasType(hasUnqualifiedDesugaredType( 6249 recordType(hasDeclaration(decl()))))) 6250In this matcher, the decl will match the CXXRecordDecl of class X. 6251 6252Usable 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>>, 6253 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>>, 6254 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>>, 6255 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>>, 6256 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>>, 6257 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>>, 6258 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6259</pre></td></tr> 6260 6261 6262<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> 6263<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6264functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6265 6266Given 6267 template<typename T, typename U> class A {}; 6268 A<bool, int> b; 6269 A<int, bool> c; 6270 6271 template<typename T> void f() {} 6272 void func() { f<int>(); }; 6273classTemplateSpecializationDecl(hasTemplateArgument( 6274 1, refersToType(asString("int")))) 6275 matches the specialization A<bool, int> 6276 6277functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6278 matches the specialization f<int> 6279</pre></td></tr> 6280 6281 6282<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> 6283<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 6284matches the given matcher. 6285 6286The associated declaration is: 6287- for type nodes, the declaration of the underlying type 6288- for CallExpr, the declaration of the callee 6289- for MemberExpr, the declaration of the referenced member 6290- for CXXConstructExpr, the declaration of the constructor 6291- for CXXNewExpr, the declaration of the operator new 6292 6293For type nodes, hasDeclaration will generally match the declaration of the 6294sugared type. Given 6295 class X {}; 6296 typedef X Y; 6297 Y y; 6298in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6299typedefDecl. A common use case is to match the underlying, desugared type. 6300This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6301 varDecl(hasType(hasUnqualifiedDesugaredType( 6302 recordType(hasDeclaration(decl()))))) 6303In this matcher, the decl will match the CXXRecordDecl of class X. 6304 6305Usable 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>>, 6306 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>>, 6307 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>>, 6308 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>>, 6309 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>>, 6310 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>>, 6311 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6312</pre></td></tr> 6313 6314 6315<tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher<T> Matcher</td></tr> 6316<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 6317 6318Generates results for each match. 6319 6320For example, in: 6321 class A { class B {}; class C {}; }; 6322The matcher: 6323 cxxRecordDecl(hasName("::A"), 6324 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 6325will generate results for A, B and C. 6326 6327Usable as: Any Matcher 6328</pre></td></tr> 6329 6330 6331<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> 6332<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6333matcher. 6334 6335Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6336 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6337 and U (matcher = typedefDecl(hasType(asString("int"))) 6338 class X {}; 6339 void y(X &x) { x; X z; } 6340 typedef int U; 6341</pre></td></tr> 6342 6343 6344<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> 6345<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 6346matches the given matcher. 6347 6348The associated declaration is: 6349- for type nodes, the declaration of the underlying type 6350- for CallExpr, the declaration of the callee 6351- for MemberExpr, the declaration of the referenced member 6352- for CXXConstructExpr, the declaration of the constructor 6353- for CXXNewExpr, the declaration of the operator new 6354 6355For type nodes, hasDeclaration will generally match the declaration of the 6356sugared type. Given 6357 class X {}; 6358 typedef X Y; 6359 Y y; 6360in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6361typedefDecl. A common use case is to match the underlying, desugared type. 6362This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6363 varDecl(hasType(hasUnqualifiedDesugaredType( 6364 recordType(hasDeclaration(decl()))))) 6365In this matcher, the decl will match the CXXRecordDecl of class X. 6366 6367Usable 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>>, 6368 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>>, 6369 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>>, 6370 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>>, 6371 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>>, 6372 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>>, 6373 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6374</pre></td></tr> 6375 6376 6377<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> 6378<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 6379type of the matched node. 6380 6381For example, in: 6382 class A {}; 6383 using B = A; 6384The matcher type(hasUnqualifeidDesugaredType(recordType())) matches 6385both B and A. 6386</pre></td></tr> 6387 6388 6389<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> 6390<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 6391 6392Given 6393 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 6394unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 6395 matches sizeof(a) and alignof(c) 6396</pre></td></tr> 6397 6398 6399<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> 6400<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 6401 6402Example matches true (matcher = hasUnaryOperand( 6403 cxxBoolLiteral(equals(true)))) 6404 !true 6405</pre></td></tr> 6406 6407 6408<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> 6409<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 6410matches the given matcher. 6411 6412The associated declaration is: 6413- for type nodes, the declaration of the underlying type 6414- for CallExpr, the declaration of the callee 6415- for MemberExpr, the declaration of the referenced member 6416- for CXXConstructExpr, the declaration of the constructor 6417- for CXXNewExpr, the declaration of the operator new 6418 6419For type nodes, hasDeclaration will generally match the declaration of the 6420sugared type. Given 6421 class X {}; 6422 typedef X Y; 6423 Y y; 6424in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6425typedefDecl. A common use case is to match the underlying, desugared type. 6426This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6427 varDecl(hasType(hasUnqualifiedDesugaredType( 6428 recordType(hasDeclaration(decl()))))) 6429In this matcher, the decl will match the CXXRecordDecl of class X. 6430 6431Usable 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>>, 6432 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>>, 6433 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>>, 6434 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>>, 6435 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>>, 6436 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>>, 6437 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6438</pre></td></tr> 6439 6440 6441<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> 6442<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 6443 6444Given 6445 namespace X { void b(); } 6446 using X::b; 6447usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 6448 matches using X::b </pre></td></tr> 6449 6450 6451<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> 6452<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 6453matched by the given matcher. 6454 6455Given 6456 namespace X { int a; void b(); } 6457 using X::a; 6458 using X::b; 6459usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 6460 matches using X::b but not using X::a </pre></td></tr> 6461 6462 6463<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> 6464<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6465declaration's type. 6466 6467In case of a value declaration (for example a variable declaration), 6468this resolves one layer of indirection. For example, in the value 6469declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6470X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6471declaration of x. 6472 6473Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6474 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6475 class X {}; 6476 void y(X &x) { x; X z; } 6477 6478Usable 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>> 6479</pre></td></tr> 6480 6481 6482<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> 6483<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 6484matcher. 6485 6486Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6487 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6488 and U (matcher = typedefDecl(hasType(asString("int"))) 6489 class X {}; 6490 void y(X &x) { x; X z; } 6491 typedef int U; 6492</pre></td></tr> 6493 6494 6495<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> 6496<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 6497that matches the given matcher. 6498 6499Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 6500 bool y() { return true; } 6501 bool x = y(); 6502</pre></td></tr> 6503 6504 6505<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> 6506<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 6507expression. 6508 6509Given 6510 void f(int b) { 6511 int a[b]; 6512 } 6513variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 6514 varDecl(hasName("b"))))))) 6515 matches "int a[b]" 6516</pre></td></tr> 6517 6518 6519<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> 6520<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 6521definition that has a given body. 6522 6523Given 6524 for (;;) {} 6525hasBody(compoundStmt()) 6526 matches 'for (;;) {}' 6527with compoundStmt() 6528 matching '{}' 6529</pre></td></tr> 6530 6531 6532<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> 6533<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 6534switch statement or conditional operator. 6535 6536Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6537 if (true) {} 6538</pre></td></tr> 6539 6540 6541<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> 6542<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 6543NestedNameSpecifier-matcher matches. 6544</pre></td></tr> 6545 6546 6547<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> 6548<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 6549QualType-matcher matches. 6550</pre></td></tr> 6551 6552<!--END_TRAVERSAL_MATCHERS --> 6553</table> 6554 6555</div> 6556</body> 6557</html> 6558 6559 6560