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