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 2745<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> 2746<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations. 2747 2748Given: 2749 extern "C" void f() {} 2750 extern "C" { void g() {} } 2751 void h() {} 2752functionDecl(isExternC()) 2753 matches the declaration of f and g, but not the declaration h 2754</pre></td></tr> 2755 2756 2757<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> 2758<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 2759the inline keyword. 2760 2761Given 2762 inline void f(); 2763 void g(); 2764 namespace n { 2765 inline namespace m {} 2766 } 2767functionDecl(isInline()) will match ::f(). 2768namespaceDecl(isInline()) will match n::m. 2769</pre></td></tr> 2770 2771 2772<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> 2773<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 2774 2775Given: 2776 void f(); 2777 void g() noexcept; 2778 void h() throw(); 2779 void i() throw(int); 2780 void j() noexcept(false); 2781functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2782 match the declarations of g, and h, but not f, i or j. 2783</pre></td></tr> 2784 2785 2786<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> 2787<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage 2788class specifier ("static" keyword) written in the source. 2789 2790Given: 2791 static void f() {} 2792 static int i = 0; 2793 extern int j; 2794 int k; 2795functionDecl(isStaticStorageClass()) 2796 matches the function declaration f. 2797varDecl(isStaticStorageClass()) 2798 matches the variable declaration i. 2799</pre></td></tr> 2800 2801 2802<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr> 2803<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 2804member variable template instantiations. 2805 2806Given 2807 template <typename T> class X {}; class A {}; X<A> x; 2808or 2809 template <typename T> class X {}; class A {}; template class X<A>; 2810cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2811 matches the template instantiation of X<A>. 2812 2813But given 2814 template <typename T> class X {}; class A {}; 2815 template <> class X<A> {}; X<A> x; 2816cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2817 does not match, as X<A> is an explicit template specialization. 2818 2819Usable 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>> 2820</pre></td></tr> 2821 2822 2823<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> 2824<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 2825 2826Example matches f, but not g or h. The function i will not match, even when 2827compiled in C mode. 2828 void f(...); 2829 void g(int); 2830 template <typename... Ts> void h(Ts...); 2831 void i(); 2832</pre></td></tr> 2833 2834 2835<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 2836<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2837specific parameter count. 2838 2839Given 2840 void f(int i) {} 2841 void g(int i, int j) {} 2842 void h(int i, int j); 2843 void j(int i); 2844 void k(int x, int y, int z, ...); 2845functionDecl(parameterCountIs(2)) 2846 matches void g(int i, int j) {} 2847functionProtoType(parameterCountIs(2)) 2848 matches void h(int i, int j) 2849functionProtoType(parameterCountIs(3)) 2850 matches void k(int x, int y, int z, ...); 2851</pre></td></tr> 2852 2853 2854<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> 2855<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 2856 2857Given: 2858 void f(); 2859 void g() noexcept; 2860 void h() noexcept(true); 2861 void i() noexcept(false); 2862 void j() throw(); 2863 void k() throw(int); 2864 void l() throw(...); 2865functionDecl(hasDynamicExceptionSpec()) and 2866 functionProtoType(hasDynamicExceptionSpec()) 2867 match the declarations of j, k, and l, but not f, g, h, or i. 2868</pre></td></tr> 2869 2870 2871<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> 2872<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 2873 2874Given: 2875 void f(); 2876 void g() noexcept; 2877 void h() throw(); 2878 void i() throw(int); 2879 void j() noexcept(false); 2880functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2881 match the declarations of g, and h, but not f, i or j. 2882</pre></td></tr> 2883 2884 2885<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> 2886<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2887specific parameter count. 2888 2889Given 2890 void f(int i) {} 2891 void g(int i, int j) {} 2892 void h(int i, int j); 2893 void j(int i); 2894 void k(int x, int y, int z, ...); 2895functionDecl(parameterCountIs(2)) 2896 matches void g(int i, int j) {} 2897functionProtoType(parameterCountIs(2)) 2898 matches void h(int i, int j) 2899functionProtoType(parameterCountIs(3)) 2900 matches void k(int x, int y, int z, ...); 2901</pre></td></tr> 2902 2903 2904<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> 2905<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 2906 2907Given 2908 f('false, 3.14, 42); 2909characterLiteral(equals(0)) 2910 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2911 match false 2912floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2913 match 3.14 2914integerLiteral(equals(42)) 2915 matches 42 2916 2917Note that you cannot directly match a negative numeric literal because the 2918minus sign is not part of the literal: It is a unary operator whose operand 2919is the positive numeric literal. Instead, you must use a unaryOperator() 2920matcher to match the minus sign: 2921 2922unaryOperator(hasOperatorName("-"), 2923 hasUnaryOperand(integerLiteral(equals(13)))) 2924 2925Usable 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>>, 2926 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>> 2927</pre></td></tr> 2928 2929 2930<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> 2931<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 2932 2933 2934<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> 2935<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 2936 2937 2938<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> 2939<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 2940 2941 2942<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> 2943<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 2944to '.'. 2945 2946Member calls on the implicit this pointer match as called with '->'. 2947 2948Given 2949 class Y { 2950 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2951 int a; 2952 static int b; 2953 }; 2954memberExpr(isArrow()) 2955 matches this->x, x, y.x, a, this->b 2956</pre></td></tr> 2957 2958 2959<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> 2960<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 2961 2962Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 2963void f() { 2964 int x; 2965 static int y; 2966} 2967int z; 2968 2969Example matches f() because it has external formal linkage despite being 2970unique to the translation unit as though it has internal likage 2971(matcher = functionDecl(hasExternalFormalLinkage())) 2972 2973namespace { 2974void f() {} 2975} 2976</pre></td></tr> 2977 2978 2979<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> 2980<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 2981 2982Supports specifying enclosing namespaces or classes by prefixing the name 2983with '<enclosing>::'. 2984Does not match typedefs of an underlying type with the given name. 2985 2986Example matches X (Name == "X") 2987 class X; 2988 2989Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 2990 namespace a { namespace b { class X; } } 2991</pre></td></tr> 2992 2993 2994<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> 2995<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 2996a substring matched by the given RegExp. 2997 2998Supports specifying enclosing namespaces or classes by 2999prefixing the name with '<enclosing>::'. Does not match typedefs 3000of an underlying type with the given name. 3001 3002Example matches X (regexp == "::X") 3003 class X; 3004 3005Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3006 namespace foo { namespace bar { class X; } } 3007</pre></td></tr> 3008 3009 3010<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> 3011<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3012 3013Given 3014 namespace n { 3015 namespace {} #1 3016 } 3017namespaceDecl(isAnonymous()) will match #1 but not ::n. 3018</pre></td></tr> 3019 3020 3021<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> 3022<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3023the inline keyword. 3024 3025Given 3026 inline void f(); 3027 void g(); 3028 namespace n { 3029 inline namespace m {} 3030 } 3031functionDecl(isInline()) will match ::f(). 3032namespaceDecl(isInline()) will match n::m. 3033</pre></td></tr> 3034 3035 3036<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> 3037<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3038a specific number of arguments (including absent default arguments). 3039 3040Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3041 void f(int x, int y); 3042 f(0, 0); 3043</pre></td></tr> 3044 3045 3046<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> 3047<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3048 3049objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3050message expression in 3051 3052 UIWebView *webView = ...; 3053 CGRect bodyFrame = webView.frame; 3054 bodyFrame.size.height = self.bodyContentHeight; 3055 webView.frame = bodyFrame; 3056 ^---- matches here 3057</pre></td></tr> 3058 3059 3060<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> 3061<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3062 3063Matches only when the selector of the objCMessageExpr is NULL. This may 3064represent an error condition in the tree! 3065</pre></td></tr> 3066 3067 3068<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> 3069<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3070 3071 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3072 matches the outer message expr in the code below, but NOT the message 3073 invocation for self.bodyView. 3074 [self.bodyView loadHTMLString:html baseURL:NULL]; 3075</pre></td></tr> 3076 3077 3078<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> 3079<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3080 3081 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3082 matches self.bodyView in the code below, but NOT the outer message 3083 invocation of "loadHTMLString:baseURL:". 3084 [self.bodyView loadHTMLString:html baseURL:NULL]; 3085</pre></td></tr> 3086 3087 3088<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> 3089<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 3090a substring matched by the given RegExp. 3091 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 3092 invocation for self.bodyView. 3093 [self.bodyView loadHTMLString:html baseURL:NULL]; 3094</pre></td></tr> 3095 3096 3097<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> 3098<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 3099 3100 matcher = objCMessageExpr(numSelectorArgs(0)); 3101 matches self.bodyView in the code below 3102 3103 matcher = objCMessageExpr(numSelectorArgs(2)); 3104 matches the invocation of "loadHTMLString:baseURL:" but not that 3105 of self.bodyView 3106 [self.bodyView loadHTMLString:html baseURL:NULL]; 3107</pre></td></tr> 3108 3109 3110<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> 3111<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 3112 3113Given 3114 class Y { public: void x(); }; 3115 void z() { Y* y; y->x(); } 3116cxxMemberCallExpr(on(hasType(asString("class Y *")))) 3117 matches y->x() 3118</pre></td></tr> 3119 3120 3121<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> 3122<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 3123 3124Matches a node if it equals the node previously bound to ID. 3125 3126Given 3127 class X { int a; int b; }; 3128cxxRecordDecl( 3129 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3130 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3131 matches the class X, as a and b have the same type. 3132 3133Note that when multiple matches are involved via forEach* matchers, 3134equalsBoundNodes acts as a filter. 3135For example: 3136compoundStmt( 3137 forEachDescendant(varDecl().bind("d")), 3138 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3139will trigger a match for each combination of variable declaration 3140and reference to that variable declaration within a compound statement. 3141</pre></td></tr> 3142 3143 3144<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr> 3145<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 3146the node, not hidden within a typedef. 3147 3148Given 3149 typedef const int const_int; 3150 const_int i; 3151 int *const j; 3152 int *volatile k; 3153 int m; 3154varDecl(hasType(hasLocalQualifiers())) matches only j and k. 3155i is const-qualified but the qualifier is not local. 3156</pre></td></tr> 3157 3158 3159<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> 3160<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 3161 3162Given 3163 void a(char); 3164 void b(wchar_t); 3165 void c(double); 3166functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 3167matches "a(char)", "b(wchar_t)", but not "c(double)". 3168</pre></td></tr> 3169 3170 3171<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> 3172<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 3173the Objective-C object pointer type, which is different despite being 3174syntactically similar. 3175 3176Given 3177 int *i = nullptr; 3178 3179 @interface Foo 3180 @end 3181 Foo *f; 3182 3183 int j; 3184varDecl(hasType(isAnyPointer())) 3185 matches "int *i" and "Foo *f", but not "int j". 3186</pre></td></tr> 3187 3188 3189<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> 3190<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 3191include "top-level" const. 3192 3193Given 3194 void a(int); 3195 void b(int const); 3196 void c(const int); 3197 void d(const int*); 3198 void e(int const) {}; 3199functionDecl(hasAnyParameter(hasType(isConstQualified()))) 3200 matches "void b(int const)", "void c(const int)" and 3201 "void e(int const) {}". It does not match d as there 3202 is no top-level const on the parameter type "const int *". 3203</pre></td></tr> 3204 3205 3206<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> 3207<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 3208 3209Given 3210 void a(int); 3211 void b(long); 3212 void c(double); 3213functionDecl(hasAnyParameter(hasType(isInteger()))) 3214matches "a(int)", "b(long)", but not "c(double)". 3215</pre></td></tr> 3216 3217 3218<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> 3219<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 3220 3221Given 3222 void a(int); 3223 void b(unsigned long); 3224 void c(double); 3225functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 3226matches "a(int)", but not "b(unsigned long)" and "c(double)". 3227</pre></td></tr> 3228 3229 3230<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> 3231<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 3232 3233Given 3234 void a(int); 3235 void b(unsigned long); 3236 void c(double); 3237functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 3238matches "b(unsigned long)", but not "a(int)" and "c(double)". 3239</pre></td></tr> 3240 3241 3242<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> 3243<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 3244include "top-level" volatile. 3245 3246Given 3247 void a(int); 3248 void b(int volatile); 3249 void c(volatile int); 3250 void d(volatile int*); 3251 void e(int volatile) {}; 3252functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 3253 matches "void b(int volatile)", "void c(volatile int)" and 3254 "void e(int volatile) {}". It does not match d as there 3255 is no top-level volatile on the parameter type "volatile int *". 3256</pre></td></tr> 3257 3258 3259<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> 3260<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 3261 3262Example matches C, but not S or U. 3263 struct S {}; 3264 class C {}; 3265 union U {}; 3266</pre></td></tr> 3267 3268 3269<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> 3270<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 3271 3272Example matches S, but not C or U. 3273 struct S {}; 3274 class C {}; 3275 union U {}; 3276</pre></td></tr> 3277 3278 3279<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> 3280<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 3281 3282Example matches U, but not C or S. 3283 struct S {}; 3284 class C {}; 3285 union U {}; 3286</pre></td></tr> 3287 3288 3289<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> 3290<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 3291 3292Matches a node if it equals the node previously bound to ID. 3293 3294Given 3295 class X { int a; int b; }; 3296cxxRecordDecl( 3297 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3298 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3299 matches the class X, as a and b have the same type. 3300 3301Note that when multiple matches are involved via forEach* matchers, 3302equalsBoundNodes acts as a filter. 3303For example: 3304compoundStmt( 3305 forEachDescendant(varDecl().bind("d")), 3306 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3307will trigger a match for each combination of variable declaration 3308and reference to that variable declaration within a compound statement. 3309</pre></td></tr> 3310 3311 3312<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> 3313<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 3314 3315Stmt has pointer identity in the AST. 3316</pre></td></tr> 3317 3318 3319<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> 3320<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 3321partially matching a given regex. 3322 3323Example matches Y but not X 3324 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3325 #include "ASTMatcher.h" 3326 class X {}; 3327ASTMatcher.h: 3328 class Y {}; 3329 3330Usable 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>> 3331</pre></td></tr> 3332 3333 3334<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> 3335<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 3336 3337Example matches X but not Y 3338 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3339 #include <Y.h> 3340 class X {}; 3341Y.h: 3342 class Y {}; 3343 3344Usable 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>> 3345</pre></td></tr> 3346 3347 3348<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> 3349<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 3350 3351Example matches Y but not X 3352 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3353 #include <SystemHeader.h> 3354 class X {}; 3355SystemHeader.h: 3356 class Y {}; 3357 3358Usable 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>> 3359</pre></td></tr> 3360 3361 3362<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> 3363<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 3364 3365Given 3366 int a[42]; 3367 int b[2 * 21]; 3368 int c[41], d[43]; 3369 char *s = "abcd"; 3370 wchar_t *ws = L"abcd"; 3371 char *w = "a"; 3372constantArrayType(hasSize(42)) 3373 matches "int a[42]" and "int b[2 * 21]" 3374stringLiteral(hasSize(4)) 3375 matches "abcd", L"abcd" 3376</pre></td></tr> 3377 3378 3379<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> 3380<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 3381 3382Example matches A, va, fa 3383 class A {}; 3384 class B; Doesn't match, as it has no body. 3385 int va; 3386 extern int vb; Doesn't match, as it doesn't define the variable. 3387 void fa() {} 3388 void fb(); Doesn't match, as it has no body. 3389 3390Usable 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>> 3391</pre></td></tr> 3392 3393 3394<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> 3395<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 3396 3397Note that 'Value' is a string as the template argument's value is 3398an arbitrary precision integer. 'Value' must be euqal to the canonical 3399representation of that integral value in base 10. 3400 3401Given 3402 template<int T> struct A {}; 3403 C<42> c; 3404classTemplateSpecializationDecl( 3405 hasAnyTemplateArgument(equalsIntegralValue("42"))) 3406 matches the implicit instantiation of C in C<42>. 3407</pre></td></tr> 3408 3409 3410<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> 3411<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 3412 3413Given 3414 template<int T> struct A {}; 3415 C<42> c; 3416classTemplateSpecializationDecl( 3417 hasAnyTemplateArgument(isIntegral())) 3418 matches the implicit instantiation of C in C<42> 3419 with isIntegral() matching 42. 3420</pre></td></tr> 3421 3422 3423<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> 3424<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 3425 3426Given 3427 template<typename T> struct C {}; 3428 C<int> c; 3429classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3430 matches C<int>. 3431</pre></td></tr> 3432 3433 3434<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> 3435<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 3436partially matching a given regex. 3437 3438Example matches Y but not X 3439 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3440 #include "ASTMatcher.h" 3441 class X {}; 3442ASTMatcher.h: 3443 class Y {}; 3444 3445Usable 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>> 3446</pre></td></tr> 3447 3448 3449<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> 3450<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 3451 3452Example matches X but not Y 3453 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3454 #include <Y.h> 3455 class X {}; 3456Y.h: 3457 class Y {}; 3458 3459Usable 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>> 3460</pre></td></tr> 3461 3462 3463<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> 3464<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 3465 3466Example matches Y but not X 3467 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3468 #include <SystemHeader.h> 3469 class X {}; 3470SystemHeader.h: 3471 class Y {}; 3472 3473Usable 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>> 3474</pre></td></tr> 3475 3476 3477<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> 3478<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 3479 3480Given 3481 struct S { bool func(); }; 3482functionDecl(returns(booleanType())) 3483 matches "bool func();" 3484</pre></td></tr> 3485 3486 3487<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> 3488<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 3489 3490Matches a node if it equals the node previously bound to ID. 3491 3492Given 3493 class X { int a; int b; }; 3494cxxRecordDecl( 3495 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3496 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3497 matches the class X, as a and b have the same type. 3498 3499Note that when multiple matches are involved via forEach* matchers, 3500equalsBoundNodes acts as a filter. 3501For example: 3502compoundStmt( 3503 forEachDescendant(varDecl().bind("d")), 3504 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3505will trigger a match for each combination of variable declaration 3506and reference to that variable declaration within a compound statement. 3507</pre></td></tr> 3508 3509 3510<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> 3511<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 3512 3513Type has pointer identity in the AST. 3514</pre></td></tr> 3515 3516 3517<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> 3518<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 3519 3520Given 3521 int i; 3522 float f; 3523realFloatingPointType() 3524 matches "float f" but not "int i" 3525</pre></td></tr> 3526 3527 3528<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> 3529<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 3530 3531Given 3532 struct S { void func(); }; 3533functionDecl(returns(voidType())) 3534 matches "void func();" 3535</pre></td></tr> 3536 3537 3538<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> 3539<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 3540 3541Given 3542 int x; 3543 int s = sizeof(x) + alignof(x) 3544unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 3545 matches sizeof(x) 3546</pre></td></tr> 3547 3548 3549<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> 3550<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3551unary). 3552 3553Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3554 !(a || b) 3555</pre></td></tr> 3556 3557 3558<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> 3559<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 3560 3561Example matches x, but not y, z, or a. 3562(matcher = varDecl(hasAutomaticStorageDuration()) 3563void f() { 3564 int x; 3565 static int y; 3566 thread_local int z; 3567} 3568int a; 3569</pre></td></tr> 3570 3571 3572<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> 3573<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 3574 3575Example matches y and z (matcher = varDecl(hasGlobalStorage()) 3576void f() { 3577 int x; 3578 static int y; 3579} 3580int z; 3581</pre></td></tr> 3582 3583 3584<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> 3585<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 3586non-static local variable. 3587 3588Example matches x (matcher = varDecl(hasLocalStorage()) 3589void f() { 3590 int x; 3591 static int y; 3592} 3593int z; 3594</pre></td></tr> 3595 3596 3597<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> 3598<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 3599It includes the variable declared at namespace scope and those declared 3600with "static" and "extern" storage class specifiers. 3601 3602void f() { 3603 int x; 3604 static int y; 3605 thread_local int z; 3606} 3607int a; 3608static int b; 3609extern int c; 3610varDecl(hasStaticStorageDuration()) 3611 matches the function declaration y, a, b and c. 3612</pre></td></tr> 3613 3614 3615<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> 3616<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 3617 3618Example matches z, but not x, z, or a. 3619(matcher = varDecl(hasThreadStorageDuration()) 3620void f() { 3621 int x; 3622 static int y; 3623 thread_local int z; 3624} 3625int a; 3626</pre></td></tr> 3627 3628 3629<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> 3630<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. 3631 3632Given: 3633 constexpr int foo = 42; 3634 constexpr int bar(); 3635varDecl(isConstexpr()) 3636 matches the declaration of foo. 3637functionDecl(isConstexpr()) 3638 matches the declaration of bar. 3639</pre></td></tr> 3640 3641 3642<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> 3643<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 3644 3645Example matches A, va, fa 3646 class A {}; 3647 class B; Doesn't match, as it has no body. 3648 int va; 3649 extern int vb; Doesn't match, as it doesn't define the variable. 3650 void fa() {} 3651 void fb(); Doesn't match, as it has no body. 3652 3653Usable 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>> 3654</pre></td></tr> 3655 3656 3657<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> 3658<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 3659a C++ catch block, or an Objective-C statement. 3660 3661Example matches x (matcher = varDecl(isExceptionVariable()) 3662void f(int y) { 3663 try { 3664 } catch (int x) { 3665 } 3666} 3667</pre></td></tr> 3668 3669 3670<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> 3671<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 3672static member variable template instantiations. 3673 3674Given 3675 template<typename T> void A(T t) { } 3676 template<> void A(int N) { } 3677functionDecl(isExplicitTemplateSpecialization()) 3678 matches the specialization A<int>(). 3679 3680Usable 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>> 3681</pre></td></tr> 3682 3683 3684<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> 3685<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations. 3686 3687Given: 3688 extern "C" void f() {} 3689 extern "C" { void g() {} } 3690 void h() {} 3691functionDecl(isExternC()) 3692 matches the declaration of f and g, but not the declaration h 3693</pre></td></tr> 3694 3695 3696<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> 3697<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage 3698class specifier ("static" keyword) written in the source. 3699 3700Given: 3701 static void f() {} 3702 static int i = 0; 3703 extern int j; 3704 int k; 3705functionDecl(isStaticStorageClass()) 3706 matches the function declaration f. 3707varDecl(isStaticStorageClass()) 3708 matches the variable declaration i. 3709</pre></td></tr> 3710 3711 3712<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> 3713<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 3714member variable template instantiations. 3715 3716Given 3717 template <typename T> class X {}; class A {}; X<A> x; 3718or 3719 template <typename T> class X {}; class A {}; template class X<A>; 3720cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3721 matches the template instantiation of X<A>. 3722 3723But given 3724 template <typename T> class X {}; class A {}; 3725 template <> class X<A> {}; X<A> x; 3726cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3727 does not match, as X<A> is an explicit template specialization. 3728 3729Usable 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>> 3730</pre></td></tr> 3731 3732 3733<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> 3734<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3735template instantiations. 3736 3737Given 3738 template<typename T> void A(T t) { T i; } 3739 A(0); 3740 A(0U); 3741functionDecl(isInstantiated()) 3742 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3743</pre></td></tr> 3744 3745 3746<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> 3747<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3748GNU's __null, C++11's nullptr, or C's NULL macro. 3749 3750Given: 3751 void *v1 = NULL; 3752 void *v2 = nullptr; 3753 void *v3 = __null; GNU extension 3754 char *cp = (char *)0; 3755 int *ip = 0; 3756 int i = 0; 3757expr(nullPointerConstant()) 3758 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3759 initializer for i. 3760</pre></td></tr> 3761 3762 3763<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> 3764<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3765 3766This matcher is only provided as a performance optimization of hasName. 3767 hasAnyName(a, b, c) 3768 is equivalent to, but faster than 3769 anyOf(hasName(a), hasName(b), hasName(c)) 3770</pre></td></tr> 3771 3772 3773<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> 3774<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 3775 3776Given 3777 int j; 3778 template<typename T> void A(T t) { T i; j += 42;} 3779 A(0); 3780 A(0U); 3781declStmt(isInTemplateInstantiation()) 3782 matches 'int i;' and 'unsigned i'. 3783unless(stmt(isInTemplateInstantiation())) 3784 will NOT match j += 42; as it's shared between the template definition and 3785 instantiation. 3786</pre></td></tr> 3787 3788<!--END_NARROWING_MATCHERS --> 3789</table> 3790 3791<!-- ======================================================================= --> 3792<h2 id="traversal-matchers">AST Traversal Matchers</h2> 3793<!-- ======================================================================= --> 3794 3795<p>Traversal matchers specify the relationship to other nodes that are 3796reachable from the current node.</p> 3797 3798<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 3799forEachDescendant) which work on all nodes and allow users to write more generic 3800match expressions.</p> 3801 3802<table> 3803<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 3804<!-- START_TRAVERSAL_MATCHERS --> 3805 3806<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 3807<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 3808 3809Unlike anyOf, eachOf will generate a match result for each 3810matching submatcher. 3811 3812For example, in: 3813 class A { int a; int b; }; 3814The matcher: 3815 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 3816 has(fieldDecl(hasName("b")).bind("v")))) 3817will generate two results binding "v", the first of which binds 3818the field declaration of a, the second the field declaration of 3819b. 3820 3821Usable as: Any Matcher 3822</pre></td></tr> 3823 3824 3825<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 3826<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3827provided matcher. 3828 3829Example matches X, A, B, C 3830 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 3831 class X {}; Matches X, because X::X is a class of name X inside X. 3832 class A { class X {}; }; 3833 class B { class C { class X {}; }; }; 3834 3835DescendantT must be an AST base type. 3836 3837As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 3838each result that matches instead of only on the first one. 3839 3840Note: Recursively combined ForEachDescendant can cause many matches: 3841 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 3842 forEachDescendant(cxxRecordDecl()) 3843 ))) 3844will match 10 times (plus injected class name matches) on: 3845 class A { class B { class C { class D { class E {}; }; }; }; }; 3846 3847Usable as: Any Matcher 3848</pre></td></tr> 3849 3850 3851<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 3852<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 3853provided matcher. 3854 3855Example matches X, Y 3856 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 3857 class X {}; Matches X, because X::X is a class of name X inside X. 3858 class Y { class X {}; }; 3859 class Z { class Y { class X {}; }; }; Does not match Z. 3860 3861ChildT must be an AST base type. 3862 3863As opposed to 'has', 'forEach' will cause a match for each result that 3864matches instead of only on the first one. 3865 3866Usable as: Any Matcher 3867</pre></td></tr> 3868 3869 3870<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 3871<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 3872matcher. 3873 3874Given 3875void f() { if (true) { int x = 42; } } 3876void g() { for (;;) { int x = 43; } } 3877expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 3878 3879Usable as: Any Matcher 3880</pre></td></tr> 3881 3882 3883<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 3884<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3885provided matcher. 3886 3887Example matches X, Y, Z 3888 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 3889 class X {}; Matches X, because X::X is a class of name X inside X. 3890 class Y { class X {}; }; 3891 class Z { class Y { class X {}; }; }; 3892 3893DescendantT must be an AST base type. 3894 3895Usable as: Any Matcher 3896</pre></td></tr> 3897 3898 3899<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 3900<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 3901provided matcher. 3902 3903Example matches X, Y 3904 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 3905 class X {}; Matches X, because X::X is a class of name X inside X. 3906 class Y { class X {}; }; 3907 class Z { class Y { class X {}; }; }; Does not match Z. 3908 3909ChildT must be an AST base type. 3910 3911Usable as: Any Matcher 3912Note that has is direct matcher, so it also matches things like implicit 3913casts and paren casts. If you are matching with expr then you should 3914probably consider using ignoringParenImpCasts like: 3915has(ignoringParenImpCasts(expr())). 3916</pre></td></tr> 3917 3918 3919<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 3920<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 3921matcher. 3922 3923Given 3924void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 3925compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 3926 3927Usable as: Any Matcher 3928</pre></td></tr> 3929 3930 3931<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> 3932<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 3933switch statement or conditional operator. 3934 3935Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 3936 if (true) {} 3937</pre></td></tr> 3938 3939 3940<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> 3941<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 3942(binary or ternary). 3943 3944Example matches b 3945 condition ? a : b 3946 condition ?: b 3947</pre></td></tr> 3948 3949 3950<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> 3951<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 3952 3953Example 1 (conditional ternary operator): matches a 3954 condition ? a : b 3955 3956Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 3957 condition ?: b 3958</pre></td></tr> 3959 3960 3961<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> 3962<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 3963matches the given matcher. 3964 3965The associated declaration is: 3966- for type nodes, the declaration of the underlying type 3967- for CallExpr, the declaration of the callee 3968- for MemberExpr, the declaration of the referenced member 3969- for CXXConstructExpr, the declaration of the constructor 3970- for CXXNewExpr, the declaration of the operator new 3971 3972Also usable as Matcher<T> for any T supporting the getDecl() member 3973function. e.g. various subtypes of clang::Type and various expressions. 3974 3975Usable 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>>, 3976 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>>, 3977 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>>, 3978 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>>, 3979 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>>, 3980 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>>, 3981 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3982</pre></td></tr> 3983 3984 3985<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> 3986<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 3987 3988Given 3989 int i[5]; 3990 void f() { i[1] = 42; } 3991arraySubscriptExpression(hasBase(implicitCastExpr( 3992 hasSourceExpression(declRefExpr())))) 3993 matches i[1] with the declRefExpr() matching i 3994</pre></td></tr> 3995 3996 3997<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> 3998<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 3999 4000Given 4001 int i[5]; 4002 void f() { i[1] = 42; } 4003arraySubscriptExpression(hasIndex(integerLiteral())) 4004 matches i[1] with the integerLiteral() matching 1 4005</pre></td></tr> 4006 4007 4008<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> 4009<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 4010 4011Example matches a (matcher = binaryOperator(hasLHS())) 4012 a || b 4013</pre></td></tr> 4014 4015 4016<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> 4017<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 4018 4019Example matches b (matcher = binaryOperator(hasRHS())) 4020 a || b 4021</pre></td></tr> 4022 4023 4024<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> 4025<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 4026type. 4027 4028Given 4029 struct A {}; 4030 A a[7]; 4031 int b[7]; 4032arrayType(hasElementType(builtinType())) 4033 matches "int b[7]" 4034 4035Usable 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>> 4036</pre></td></tr> 4037 4038 4039<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> 4040<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 4041type. 4042 4043Given 4044 struct A {}; 4045 A a[7]; 4046 int b[7]; 4047arrayType(hasElementType(builtinType())) 4048 matches "int b[7]" 4049 4050Usable 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>> 4051</pre></td></tr> 4052 4053 4054<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> 4055<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 4056 4057Given 4058 _Atomic(int) i; 4059 _Atomic(float) f; 4060atomicType(hasValueType(isInteger())) 4061 matches "_Atomic(int) i" 4062 4063Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4064</pre></td></tr> 4065 4066 4067<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> 4068<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 4069 4070Given 4071 _Atomic(int) i; 4072 _Atomic(float) f; 4073atomicType(hasValueType(isInteger())) 4074 matches "_Atomic(int) i" 4075 4076Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4077</pre></td></tr> 4078 4079 4080<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> 4081<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 4082 4083Note: There is no TypeLoc for the deduced type and thus no 4084getDeducedLoc() matcher. 4085 4086Given 4087 auto a = 1; 4088 auto b = 2.0; 4089autoType(hasDeducedType(isInteger())) 4090 matches "auto a" 4091 4092Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 4093</pre></td></tr> 4094 4095 4096<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> 4097<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 4098binary operator matches. 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('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> 4103<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 4104 4105Example matches a (matcher = binaryOperator(hasLHS())) 4106 a || b 4107</pre></td></tr> 4108 4109 4110<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> 4111<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 4112 4113Example matches b (matcher = binaryOperator(hasRHS())) 4114 a || b 4115</pre></td></tr> 4116 4117 4118<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> 4119<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 4120pointee matches a given matcher. 4121 4122Given 4123 int *a; 4124 int const *b; 4125 float const *f; 4126pointerType(pointee(isConstQualified(), isInteger())) 4127 matches "int const *b" 4128 4129Usable 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>>, 4130 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>> 4131</pre></td></tr> 4132 4133 4134<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> 4135<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 4136pointee matches a given matcher. 4137 4138Given 4139 int *a; 4140 int const *b; 4141 float const *f; 4142pointerType(pointee(isConstQualified(), isInteger())) 4143 matches "int const *b" 4144 4145Usable 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>>, 4146 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>> 4147</pre></td></tr> 4148 4149 4150<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> 4151<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 4152 4153Given 4154 void f(int i); 4155 int y; 4156 f(y); 4157callExpr( 4158 forEachArgumentWithParam( 4159 declRefExpr(to(varDecl(hasName("y")))), 4160 parmVarDecl(hasType(isInteger())) 4161)) 4162 matches f(y); 4163with declRefExpr(...) 4164 matching int y 4165and parmVarDecl(...) 4166 matching int i 4167</pre></td></tr> 4168 4169 4170<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> 4171<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 4172expression. 4173 4174Given 4175 void x(int, int, int) { int y; x(1, y, 42); } 4176callExpr(hasAnyArgument(declRefExpr())) 4177 matches x(1, y, 42) 4178with hasAnyArgument(...) 4179 matching y 4180</pre></td></tr> 4181 4182 4183<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> 4184<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 4185call expression. 4186 4187Example matches y in x(y) 4188 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4189 void x(int) { int y; x(y); } 4190</pre></td></tr> 4191 4192 4193<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> 4194<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 4195matches the given matcher. 4196 4197The associated declaration is: 4198- for type nodes, the declaration of the underlying type 4199- for CallExpr, the declaration of the callee 4200- for MemberExpr, the declaration of the referenced member 4201- for CXXConstructExpr, the declaration of the constructor 4202- for CXXNewExpr, the declaration of the operator new 4203 4204Also usable as Matcher<T> for any T supporting the getDecl() member 4205function. e.g. various subtypes of clang::Type and various expressions. 4206 4207Usable 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>>, 4208 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>>, 4209 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>>, 4210 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>>, 4211 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>>, 4212 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>>, 4213 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4214</pre></td></tr> 4215 4216 4217<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> 4218<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 4219 4220Given 4221 class A { A() : i(42), j(42) {} int i; int j; }; 4222cxxConstructorDecl(forEachConstructorInitializer( 4223 forField(decl().bind("x")) 4224)) 4225 will trigger two matches, binding for 'i' and 'j' respectively. 4226</pre></td></tr> 4227 4228 4229<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> 4230<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 4231 4232Given 4233 struct Foo { 4234 Foo() : foo_(1) { } 4235 int foo_; 4236 }; 4237cxxRecordDecl(has(cxxConstructorDecl( 4238 hasAnyConstructorInitializer(anything()) 4239))) 4240 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 4241</pre></td></tr> 4242 4243 4244<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> 4245<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 4246 4247Given 4248 struct Foo { 4249 Foo() : foo_(1) { } 4250 int foo_; 4251 }; 4252cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 4253 forField(hasName("foo_")))))) 4254 matches Foo 4255with forField matching foo_ 4256</pre></td></tr> 4257 4258 4259<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> 4260<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 4261 4262Given 4263 struct Foo { 4264 Foo() : foo_(1) { } 4265 int foo_; 4266 }; 4267cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 4268 withInitializer(integerLiteral(equals(1))))))) 4269 matches Foo 4270with withInitializer matching (1) 4271</pre></td></tr> 4272 4273 4274<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> 4275<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 4276definition that has a given body. 4277 4278Given 4279 for (;;) {} 4280hasBody(compoundStmt()) 4281 matches 'for (;;) {}' 4282with compoundStmt() 4283 matching '{}' 4284</pre></td></tr> 4285 4286 4287<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> 4288<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 4289 4290Example: 4291 forStmt(hasLoopVariable(anything())) 4292matches 'int x' in 4293 for (int x : a) { } 4294</pre></td></tr> 4295 4296 4297<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> 4298<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 4299 4300Example: 4301 forStmt(hasRangeInit(anything())) 4302matches 'a' in 4303 for (int x : a) { } 4304</pre></td></tr> 4305 4306 4307<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> 4308<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 4309 4310 4311<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> 4312<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 4313 4314Example matches y.x() 4315 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) 4316 class Y { public: void x(); }; 4317 void z() { Y y; y.x(); }", 4318 4319FIXME: Overload to allow directly matching types? 4320</pre></td></tr> 4321 4322 4323<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> 4324<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 4325</pre></td></tr> 4326 4327 4328<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> 4329<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 4330matcher, or is a pointer to a type that matches the InnerMatcher. 4331</pre></td></tr> 4332 4333 4334<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> 4335<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may 4336produce multiple matches. 4337 4338Given 4339 class A { virtual void f(); }; 4340 class B : public A { void f(); }; 4341 class C : public B { void f(); }; 4342cxxMethodDecl(ofClass(hasName("C")), 4343 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4344 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 4345 that B::f is not overridden by C::f). 4346 4347The check can produce multiple matches in case of multiple inheritance, e.g. 4348 class A1 { virtual void f(); }; 4349 class A2 { virtual void f(); }; 4350 class C : public A1, public A2 { void f(); }; 4351cxxMethodDecl(ofClass(hasName("C")), 4352 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4353 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 4354 once with "b" binding "A2::f" and "d" binding "C::f". 4355</pre></td></tr> 4356 4357 4358<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> 4359<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 4360belongs to. 4361 4362FIXME: Generalize this for other kinds of declarations. 4363FIXME: What other kind of declarations would we need to generalize 4364this to? 4365 4366Example matches A() in the last line 4367 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 4368 ofClass(hasName("A")))))) 4369 class A { 4370 public: 4371 A(); 4372 }; 4373 A a = A(); 4374</pre></td></tr> 4375 4376 4377<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> 4378<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 4379matches the given matcher. 4380 4381The associated declaration is: 4382- for type nodes, the declaration of the underlying type 4383- for CallExpr, the declaration of the callee 4384- for MemberExpr, the declaration of the referenced member 4385- for CXXConstructExpr, the declaration of the constructor 4386- for CXXNewExpr, the declaration of the operator new 4387 4388Also usable as Matcher<T> for any T supporting the getDecl() member 4389function. e.g. various subtypes of clang::Type and various expressions. 4390 4391Usable 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>>, 4392 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>>, 4393 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>>, 4394 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>>, 4395 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>>, 4396 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>>, 4397 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4398</pre></td></tr> 4399 4400 4401<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> 4402<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 4403 4404Given: 4405 class A { void func(); }; 4406 class B { void member(); }; 4407 4408cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 4409A but not B. 4410</pre></td></tr> 4411 4412 4413<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> 4414<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 4415a class matching Base. 4416 4417Note that a class is not considered to be derived from itself. 4418 4419Example matches Y, Z, C (Base == hasName("X")) 4420 class X; 4421 class Y : public X {}; directly derived 4422 class Z : public Y {}; indirectly derived 4423 typedef X A; 4424 typedef A B; 4425 class C : public B {}; derived from a typedef of X 4426 4427In the following example, Bar matches isDerivedFrom(hasName("X")): 4428 class Foo; 4429 typedef Foo X; 4430 class Bar : public Foo {}; derived from a type that X is a typedef of 4431</pre></td></tr> 4432 4433 4434<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> 4435<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 4436match Base. 4437</pre></td></tr> 4438 4439 4440<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> 4441<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 4442given matcher. 4443 4444Example matches y.x() (matcher = callExpr(callee( 4445 cxxMethodDecl(hasName("x"))))) 4446 class Y { public: void x(); }; 4447 void z() { Y y; y.x(); } 4448</pre></td></tr> 4449 4450 4451<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> 4452<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 4453 4454Given 4455 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 4456 void f() { f(); } 4457callExpr(callee(expr())) 4458 matches this->x(), x(), y.x(), f() 4459with callee(...) 4460 matching this->x, x, y.x, f respectively 4461 4462Note: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 4463because this introduces ambiguous overloads with calls to Callee taking a 4464internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 4465implemented in terms of implicit casts. 4466</pre></td></tr> 4467 4468 4469<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> 4470<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 4471 4472Given 4473 void f(int i); 4474 int y; 4475 f(y); 4476callExpr( 4477 forEachArgumentWithParam( 4478 declRefExpr(to(varDecl(hasName("y")))), 4479 parmVarDecl(hasType(isInteger())) 4480)) 4481 matches f(y); 4482with declRefExpr(...) 4483 matching int y 4484and parmVarDecl(...) 4485 matching int i 4486</pre></td></tr> 4487 4488 4489<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> 4490<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 4491expression. 4492 4493Given 4494 void x(int, int, int) { int y; x(1, y, 42); } 4495callExpr(hasAnyArgument(declRefExpr())) 4496 matches x(1, y, 42) 4497with hasAnyArgument(...) 4498 matching y 4499</pre></td></tr> 4500 4501 4502<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> 4503<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 4504call expression. 4505 4506Example matches y in x(y) 4507 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4508 void x(int) { int y; x(y); } 4509</pre></td></tr> 4510 4511 4512<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> 4513<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 4514matches the given matcher. 4515 4516The associated declaration is: 4517- for type nodes, the declaration of the underlying type 4518- for CallExpr, the declaration of the callee 4519- for MemberExpr, the declaration of the referenced member 4520- for CXXConstructExpr, the declaration of the constructor 4521- for CXXNewExpr, the declaration of the operator new 4522 4523Also usable as Matcher<T> for any T supporting the getDecl() member 4524function. e.g. various subtypes of clang::Type and various expressions. 4525 4526Usable 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>>, 4527 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>>, 4528 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>>, 4529 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>>, 4530 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>>, 4531 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>>, 4532 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4533</pre></td></tr> 4534 4535 4536<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> 4537<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 4538extension, matches the constant given in the statement. 4539 4540Given 4541 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 4542caseStmt(hasCaseConstant(integerLiteral())) 4543 matches "case 1:" 4544</pre></td></tr> 4545 4546 4547<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> 4548<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr> 4549 4550 4551<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> 4552<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 4553functionDecl that have at least one TemplateArgument matching the given 4554InnerMatcher. 4555 4556Given 4557 template<typename T> class A {}; 4558 template<> class A<double> {}; 4559 A<int> a; 4560 4561 template<typename T> f() {}; 4562 void func() { f<int>(); }; 4563 4564classTemplateSpecializationDecl(hasAnyTemplateArgument( 4565 refersToType(asString("int")))) 4566 matches the specialization A<int> 4567 4568functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 4569 matches the specialization f<int> 4570</pre></td></tr> 4571 4572 4573<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> 4574<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 4575 4576Given 4577 tempalate<typename T> class A {}; 4578 typedef A<int> B; 4579classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 4580 matches 'B' with classTemplateDecl() matching the class template 4581 declaration of 'A'. 4582</pre></td></tr> 4583 4584 4585<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> 4586<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 4587functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 4588 4589Given 4590 template<typename T, typename U> class A {}; 4591 A<bool, int> b; 4592 A<int, bool> c; 4593 4594 template<typename T> f() {}; 4595 void func() { f<int>(); }; 4596classTemplateSpecializationDecl(hasTemplateArgument( 4597 1, refersToType(asString("int")))) 4598 matches the specialization A<bool, int> 4599 4600functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 4601 matches the specialization f<int> 4602</pre></td></tr> 4603 4604 4605<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> 4606<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 4607type. 4608 4609Given 4610 struct A {}; 4611 A a[7]; 4612 int b[7]; 4613arrayType(hasElementType(builtinType())) 4614 matches "int b[7]" 4615 4616Usable 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>> 4617</pre></td></tr> 4618 4619 4620<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> 4621<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 4622type. 4623 4624Given 4625 struct A {}; 4626 A a[7]; 4627 int b[7]; 4628arrayType(hasElementType(builtinType())) 4629 matches "int b[7]" 4630 4631Usable 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>> 4632</pre></td></tr> 4633 4634 4635<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> 4636<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 4637a given matcher. Also matches StmtExprs that have CompoundStmt as children. 4638 4639Given 4640 { {}; 1+2; } 4641hasAnySubstatement(compoundStmt()) 4642 matches '{ {}; 1+2; }' 4643with compoundStmt() 4644 matching '{}' 4645</pre></td></tr> 4646 4647 4648<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> 4649<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 4650</pre></td></tr> 4651 4652 4653<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> 4654<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 4655matches the given matcher. 4656 4657The associated declaration is: 4658- for type nodes, the declaration of the underlying type 4659- for CallExpr, the declaration of the callee 4660- for MemberExpr, the declaration of the referenced member 4661- for CXXConstructExpr, the declaration of the constructor 4662- for CXXNewExpr, the declaration of the operator new 4663 4664Also usable as Matcher<T> for any T supporting the getDecl() member 4665function. e.g. various subtypes of clang::Type and various expressions. 4666 4667Usable 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>>, 4668 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>>, 4669 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>>, 4670 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>>, 4671 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>>, 4672 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>>, 4673 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4674</pre></td></tr> 4675 4676 4677<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> 4678<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 4679specific using shadow declaration. 4680 4681Given 4682 namespace a { void f() {} } 4683 using a::f; 4684 void g() { 4685 f(); Matches this .. 4686 a::f(); .. but not this. 4687 } 4688declRefExpr(throughUsingDecl(anything())) 4689 matches f() 4690</pre></td></tr> 4691 4692 4693<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> 4694<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 4695specified matcher. 4696 4697Example matches x in if(x) 4698 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 4699 bool x; 4700 if (x) {} 4701</pre></td></tr> 4702 4703 4704<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> 4705<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 4706 4707Note that this does not work for global declarations because the AST 4708breaks up multiple-declaration DeclStmt's into multiple single-declaration 4709DeclStmt's. 4710Example: Given non-global declarations 4711 int a, b = 0; 4712 int c; 4713 int d = 2, e; 4714declStmt(containsDeclaration( 4715 0, varDecl(hasInitializer(anything())))) 4716 matches only 'int d = 2, e;', and 4717declStmt(containsDeclaration(1, varDecl())) 4718 matches 'int a, b = 0' as well as 'int d = 2, e;' 4719 but 'int c;' is not matched. 4720</pre></td></tr> 4721 4722 4723<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> 4724<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 4725 4726Given 4727 int a, b; 4728 int c; 4729declStmt(hasSingleDecl(anything())) 4730 matches 'int c;' but not 'int a, b;'. 4731</pre></td></tr> 4732 4733 4734<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> 4735<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 4736the inner matcher. 4737 4738Given 4739 int x; 4740declaratorDecl(hasTypeLoc(loc(asString("int")))) 4741 matches int x 4742</pre></td></tr> 4743 4744 4745<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> 4746<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 4747Decl, matches InnerMatcher. 4748 4749Given 4750 namespace N { 4751 namespace M { 4752 class D {}; 4753 } 4754 } 4755 4756cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 4757declaration of class D. 4758</pre></td></tr> 4759 4760 4761<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> 4762<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 4763definition that has a given body. 4764 4765Given 4766 for (;;) {} 4767hasBody(compoundStmt()) 4768 matches 'for (;;) {}' 4769with compoundStmt() 4770 matching '{}' 4771</pre></td></tr> 4772 4773 4774<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> 4775<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 4776switch statement or conditional operator. 4777 4778Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4779 if (true) {} 4780</pre></td></tr> 4781 4782 4783<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> 4784<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 4785matches InnerMatcher if the qualifier exists. 4786 4787Given 4788 namespace N { 4789 namespace M { 4790 class D {}; 4791 } 4792 } 4793 N::M::D d; 4794 4795elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 4796matches the type of the variable declaration of d. 4797</pre></td></tr> 4798 4799 4800<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> 4801<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 4802 4803Given 4804 namespace N { 4805 namespace M { 4806 class D {}; 4807 } 4808 } 4809 N::M::D d; 4810 4811elaboratedType(namesType(recordType( 4812hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 4813declaration of d. 4814</pre></td></tr> 4815 4816 4817<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> 4818<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 4819matches the given matcher. 4820 4821The associated declaration is: 4822- for type nodes, the declaration of the underlying type 4823- for CallExpr, the declaration of the callee 4824- for MemberExpr, the declaration of the referenced member 4825- for CXXConstructExpr, the declaration of the constructor 4826- for CXXNewExpr, the declaration of the operator new 4827 4828Also usable as Matcher<T> for any T supporting the getDecl() member 4829function. e.g. various subtypes of clang::Type and various expressions. 4830 4831Usable 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>>, 4832 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>>, 4833 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>>, 4834 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>>, 4835 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>>, 4836 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>>, 4837 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4838</pre></td></tr> 4839 4840 4841<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> 4842<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 4843 4844(Note: Clang's AST refers to other conversions as "casts" too, and calls 4845actual casts "explicit" casts.) 4846</pre></td></tr> 4847 4848 4849<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> 4850<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 4851declaration's type. 4852 4853In case of a value declaration (for example a variable declaration), 4854this resolves one layer of indirection. For example, in the value 4855declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 4856X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 4857declaration of x. 4858 4859Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4860 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4861 class X {}; 4862 void y(X &x) { x; X z; } 4863 4864Usable 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>> 4865</pre></td></tr> 4866 4867 4868<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> 4869<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 4870matcher. 4871 4872Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4873 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4874 and U (matcher = typedefDecl(hasType(asString("int"))) 4875 class X {}; 4876 void y(X &x) { x; X z; } 4877 typedef int U; 4878</pre></td></tr> 4879 4880 4881<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> 4882<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 4883are stripped off. 4884 4885Parentheses and explicit casts are not discarded. 4886Given 4887 int arr[5]; 4888 int a = 0; 4889 char b = 0; 4890 const int c = a; 4891 int *d = arr; 4892 long e = (long) 0l; 4893The matchers 4894 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 4895 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 4896would match the declarations for a, b, c, and d, but not e. 4897While 4898 varDecl(hasInitializer(integerLiteral())) 4899 varDecl(hasInitializer(declRefExpr())) 4900only match the declarations for b, c, and d. 4901</pre></td></tr> 4902 4903 4904<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> 4905<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 4906nodes are stripped off. 4907 4908Parentheses and explicit casts are not discarded. 4909Given 4910 class C {}; 4911 C a = C(); 4912 C b; 4913 C c = b; 4914The matchers 4915 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 4916would match the declarations for a, b, and c. 4917While 4918 varDecl(hasInitializer(cxxConstructExpr())) 4919only match the declarations for b and c. 4920</pre></td></tr> 4921 4922 4923<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> 4924<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 4925casts are stripped off. 4926 4927Implicit and non-C Style casts are also discarded. 4928Given 4929 int a = 0; 4930 char b = (0); 4931 void* c = reinterpret_cast<char*>(0); 4932 char d = char(0); 4933The matcher 4934 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 4935would match the declarations for a, b, c, and d. 4936while 4937 varDecl(hasInitializer(integerLiteral())) 4938only match the declaration for a. 4939</pre></td></tr> 4940 4941 4942<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> 4943<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 4944parentheses are stripped off. 4945 4946Explicit casts are not discarded. 4947Given 4948 int arr[5]; 4949 int a = 0; 4950 char b = (0); 4951 const int c = a; 4952 int *d = (arr); 4953 long e = ((long) 0l); 4954The matchers 4955 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 4956 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 4957would match the declarations for a, b, c, and d, but not e. 4958while 4959 varDecl(hasInitializer(integerLiteral())) 4960 varDecl(hasInitializer(declRefExpr())) 4961would only match the declaration for a. 4962</pre></td></tr> 4963 4964 4965<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> 4966<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 4967 4968Given 4969 class C { 4970 int a = 2; 4971 int b = 3; 4972 int c; 4973 }; 4974fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 4975 matches 'int a;' but not 'int b;'. 4976fieldDecl(hasInClassInitializer(anything())) 4977 matches 'int a;' and 'int b;' but not 'int c;'. 4978</pre></td></tr> 4979 4980 4981<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> 4982<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 4983definition that has a given body. 4984 4985Given 4986 for (;;) {} 4987hasBody(compoundStmt()) 4988 matches 'for (;;) {}' 4989with compoundStmt() 4990 matching '{}' 4991</pre></td></tr> 4992 4993 4994<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> 4995<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 4996switch statement or conditional operator. 4997 4998Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4999 if (true) {} 5000</pre></td></tr> 5001 5002 5003<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> 5004<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 5005 5006Example: 5007 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 5008matches '++x' in 5009 for (x; x < N; ++x) { } 5010</pre></td></tr> 5011 5012 5013<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> 5014<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 5015 5016Example: 5017 forStmt(hasLoopInit(declStmt())) 5018matches 'int x = 0' in 5019 for (int x = 0; x < N; ++x) { } 5020</pre></td></tr> 5021 5022 5023<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> 5024<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration. 5025 5026Does not match the 'this' parameter of a method. 5027 5028Given 5029 class X { void f(int x, int y, int z) {} }; 5030cxxMethodDecl(hasAnyParameter(hasName("y"))) 5031 matches f(int x, int y, int z) {} 5032with hasAnyParameter(...) 5033 matching int y 5034</pre></td></tr> 5035 5036 5037<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> 5038<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5039functionDecl that have at least one TemplateArgument matching the given 5040InnerMatcher. 5041 5042Given 5043 template<typename T> class A {}; 5044 template<> class A<double> {}; 5045 A<int> a; 5046 5047 template<typename T> f() {}; 5048 void func() { f<int>(); }; 5049 5050classTemplateSpecializationDecl(hasAnyTemplateArgument( 5051 refersToType(asString("int")))) 5052 matches the specialization A<int> 5053 5054functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5055 matches the specialization f<int> 5056</pre></td></tr> 5057 5058 5059<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> 5060<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 5061definition that has a given body. 5062 5063Given 5064 for (;;) {} 5065hasBody(compoundStmt()) 5066 matches 'for (;;) {}' 5067with compoundStmt() 5068 matching '{}' 5069</pre></td></tr> 5070 5071 5072<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> 5073<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration. 5074 5075Given 5076 class X { void f(int x) {} }; 5077cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5078 matches f(int x) {} 5079with hasParameter(...) 5080 matching int x 5081</pre></td></tr> 5082 5083 5084<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> 5085<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5086functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5087 5088Given 5089 template<typename T, typename U> class A {}; 5090 A<bool, int> b; 5091 A<int, bool> c; 5092 5093 template<typename T> f() {}; 5094 void func() { f<int>(); }; 5095classTemplateSpecializationDecl(hasTemplateArgument( 5096 1, refersToType(asString("int")))) 5097 matches the specialization A<bool, int> 5098 5099functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5100 matches the specialization f<int> 5101</pre></td></tr> 5102 5103 5104<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> 5105<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 5106 5107Given: 5108 class X { int f() { return 1; } }; 5109cxxMethodDecl(returns(asString("int"))) 5110 matches int f() { return 1; } 5111</pre></td></tr> 5112 5113 5114<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> 5115<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 5116switch statement or conditional operator. 5117 5118Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5119 if (true) {} 5120</pre></td></tr> 5121 5122 5123<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> 5124<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 5125 5126Given 5127 if (A* a = GetAPointer()) {} 5128hasConditionVariableStatement(...) 5129 matches 'A* a = GetAPointer()'. 5130</pre></td></tr> 5131 5132 5133<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> 5134<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 5135 5136Examples matches the if statement 5137 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 5138 if (false) false; else true; 5139</pre></td></tr> 5140 5141 5142<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> 5143<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 5144 5145Examples matches the if statement 5146 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 5147 if (false) true; else false; 5148</pre></td></tr> 5149 5150 5151<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> 5152<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 5153matcher. 5154 5155FIXME: Unit test this matcher 5156</pre></td></tr> 5157 5158 5159<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> 5160<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 5161(if expression have it). 5162</pre></td></tr> 5163 5164 5165<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> 5166<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 5167matches the given matcher. 5168 5169The associated declaration is: 5170- for type nodes, the declaration of the underlying type 5171- for CallExpr, the declaration of the callee 5172- for MemberExpr, the declaration of the referenced member 5173- for CXXConstructExpr, the declaration of the constructor 5174- for CXXNewExpr, the declaration of the operator new 5175 5176Also usable as Matcher<T> for any T supporting the getDecl() member 5177function. e.g. various subtypes of clang::Type and various expressions. 5178 5179Usable 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>>, 5180 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>>, 5181 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>>, 5182 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>>, 5183 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>>, 5184 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>>, 5185 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5186</pre></td></tr> 5187 5188 5189<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> 5190<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 5191matches the given matcher. 5192 5193The associated declaration is: 5194- for type nodes, the declaration of the underlying type 5195- for CallExpr, the declaration of the callee 5196- for MemberExpr, the declaration of the referenced member 5197- for CXXConstructExpr, the declaration of the constructor 5198- for CXXNewExpr, the declaration of the operator new 5199 5200Also usable as Matcher<T> for any T supporting the getDecl() member 5201function. e.g. various subtypes of clang::Type and various expressions. 5202 5203Usable 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>>, 5204 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>>, 5205 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>>, 5206 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>>, 5207 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>>, 5208 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>>, 5209 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5210</pre></td></tr> 5211 5212 5213<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> 5214<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 5215matches the given matcher. 5216 5217The associated declaration is: 5218- for type nodes, the declaration of the underlying type 5219- for CallExpr, the declaration of the callee 5220- for MemberExpr, the declaration of the referenced member 5221- for CXXConstructExpr, the declaration of the constructor 5222- for CXXNewExpr, the declaration of the operator new 5223 5224Also usable as Matcher<T> for any T supporting the getDecl() member 5225function. e.g. various subtypes of clang::Type and various expressions. 5226 5227Usable 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>>, 5228 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>>, 5229 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>>, 5230 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>>, 5231 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>>, 5232 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>>, 5233 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5234</pre></td></tr> 5235 5236 5237<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> 5238<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 5239matched by a given matcher. 5240 5241Given 5242 struct X { int m; }; 5243 void f(X x) { x.m; m; } 5244memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) 5245 matches "x.m" and "m" 5246with hasObjectExpression(...) 5247 matching "x" and the implicit object expression of "m" which has type X*. 5248</pre></td></tr> 5249 5250 5251<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> 5252<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 5253given matcher. 5254 5255Given 5256 struct { int first, second; } first, second; 5257 int i(second.first); 5258 int j(first.second); 5259memberExpr(member(hasName("first"))) 5260 matches second.first 5261 but not first.second (because the member name there is "second"). 5262</pre></td></tr> 5263 5264 5265<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> 5266<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 5267pointee matches a given matcher. 5268 5269Given 5270 int *a; 5271 int const *b; 5272 float const *f; 5273pointerType(pointee(isConstQualified(), isInteger())) 5274 matches "int const *b" 5275 5276Usable 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>>, 5277 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>> 5278</pre></td></tr> 5279 5280 5281<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> 5282<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 5283pointee matches a given matcher. 5284 5285Given 5286 int *a; 5287 int const *b; 5288 float const *f; 5289pointerType(pointee(isConstQualified(), isInteger())) 5290 matches "int const *b" 5291 5292Usable 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>>, 5293 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>> 5294</pre></td></tr> 5295 5296 5297<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> 5298<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 5299matcher. 5300 5301Given 5302 namespace N { template<class T> void f(T t); } 5303 template <class T> void g() { using N::f; f(T()); } 5304unresolvedLookupExpr(hasAnyDeclaration( 5305 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 5306 matches the use of f in g() . 5307</pre></td></tr> 5308 5309 5310<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> 5311<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 5312 5313Given 5314 struct A { struct B { struct C {}; }; }; 5315 A::B::C c; 5316nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 5317 matches "A::" 5318</pre></td></tr> 5319 5320 5321<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> 5322<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 5323given TypeLoc. 5324 5325Given 5326 struct A { struct B { struct C {}; }; }; 5327 A::B::C c; 5328nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 5329 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 5330 matches "A::" 5331</pre></td></tr> 5332 5333 5334<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> 5335<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 5336 5337Given 5338 struct A { struct B { struct C {}; }; }; 5339 A::B::C c; 5340nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 5341 matches "A::" 5342</pre></td></tr> 5343 5344 5345<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> 5346<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 5347given namespace matcher. 5348 5349Given 5350 namespace ns { struct A {}; } 5351 ns::A a; 5352nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 5353 matches "ns::" 5354</pre></td></tr> 5355 5356 5357<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> 5358<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 5359given QualType matcher without qualifiers. 5360 5361Given 5362 struct A { struct B { struct C {}; }; }; 5363 A::B::C c; 5364nestedNameSpecifier(specifiesType( 5365 hasDeclaration(cxxRecordDecl(hasName("A"))) 5366)) 5367 matches "A::" 5368</pre></td></tr> 5369 5370 5371<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> 5372<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 5373call expression. 5374 5375Example matches y in x(y) 5376 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5377 void x(int) { int y; x(y); } 5378</pre></td></tr> 5379 5380 5381<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> 5382<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 5383 5384Example 5385matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 5386matches the [webView ...] message invocation. 5387 NSString *webViewJavaScript = ... 5388 UIWebView *webView = ... 5389 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 5390</pre></td></tr> 5391 5392 5393<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> 5394<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr> 5395 5396 5397<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> 5398<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 5399overloads matches the given matcher. 5400 5401Given 5402 template <typename T> void foo(T); 5403 template <typename T> void bar(T); 5404 template <typename T> void baz(T t) { 5405 foo(t); 5406 bar(t); 5407 } 5408unresolvedLookupExpr(hasAnyDeclaration( 5409 functionTemplateDecl(hasName("foo")))) 5410 matches foo in foo(t); but not bar in bar(t); 5411</pre></td></tr> 5412 5413 5414<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> 5415<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 5416 5417Given 5418 int (*ptr_to_array)[4]; 5419 int (*ptr_to_func)(int); 5420 5421varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 5422ptr_to_func but not ptr_to_array. 5423 5424Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 5425</pre></td></tr> 5426 5427 5428<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> 5429<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 5430pointee matches a given matcher. 5431 5432Given 5433 int *a; 5434 int const *b; 5435 float const *f; 5436pointerType(pointee(isConstQualified(), isInteger())) 5437 matches "int const *b" 5438 5439Usable 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>>, 5440 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>> 5441</pre></td></tr> 5442 5443 5444<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> 5445<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 5446pointee matches a given matcher. 5447 5448Given 5449 int *a; 5450 int const *b; 5451 float const *f; 5452pointerType(pointee(isConstQualified(), isInteger())) 5453 matches "int const *b" 5454 5455Usable 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>>, 5456 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>> 5457</pre></td></tr> 5458 5459 5460<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> 5461<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 5462 5463Given: 5464 typedef int &int_ref; 5465 int a; 5466 int_ref b = a; 5467 5468varDecl(hasType(qualType(referenceType()))))) will not match the 5469declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 5470</pre></td></tr> 5471 5472 5473<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> 5474<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 5475matches the given matcher. 5476 5477The associated declaration is: 5478- for type nodes, the declaration of the underlying type 5479- for CallExpr, the declaration of the callee 5480- for MemberExpr, the declaration of the referenced member 5481- for CXXConstructExpr, the declaration of the constructor 5482- for CXXNewExpr, the declaration of the operator new 5483 5484Also usable as Matcher<T> for any T supporting the getDecl() member 5485function. e.g. various subtypes of clang::Type and various expressions. 5486 5487Usable 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>>, 5488 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>>, 5489 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>>, 5490 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>>, 5491 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>>, 5492 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>>, 5493 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5494</pre></td></tr> 5495 5496 5497<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> 5498<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 5499 5500Given 5501 void (*fp)(void); 5502The matcher 5503 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 5504would match the declaration for fp. 5505</pre></td></tr> 5506 5507 5508<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> 5509<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 5510</pre></td></tr> 5511 5512 5513<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> 5514<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 5515matches the specified matcher. 5516 5517Example matches y->x() 5518 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 5519 cxxRecordDecl(hasName("Y"))))))) 5520 class Y { public: void x(); }; 5521 void z() { Y *y; y->x(); } 5522</pre></td></tr> 5523 5524 5525<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> 5526<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 5527</pre></td></tr> 5528 5529 5530<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> 5531<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 5532type matches the specified matcher. 5533 5534Example matches X &x and const X &y 5535 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 5536 class X { 5537 void a(X b) { 5538 X &x = b; 5539 const X &y = b; 5540 } 5541 }; 5542</pre></td></tr> 5543 5544 5545<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> 5546<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 5547matches the given matcher. 5548 5549The associated declaration is: 5550- for type nodes, the declaration of the underlying type 5551- for CallExpr, the declaration of the callee 5552- for MemberExpr, the declaration of the referenced member 5553- for CXXConstructExpr, the declaration of the constructor 5554- for CXXNewExpr, the declaration of the operator new 5555 5556Also usable as Matcher<T> for any T supporting the getDecl() member 5557function. e.g. various subtypes of clang::Type and various expressions. 5558 5559Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5560 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5561 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5562 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 5563 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5564 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5565 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5566</pre></td></tr> 5567 5568 5569<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_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> 5570<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 5571pointee matches a given matcher. 5572 5573Given 5574 int *a; 5575 int const *b; 5576 float const *f; 5577pointerType(pointee(isConstQualified(), isInteger())) 5578 matches "int const *b" 5579 5580Usable 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>>, 5581 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>> 5582</pre></td></tr> 5583 5584 5585<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> 5586<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 5587pointee matches a given matcher. 5588 5589Given 5590 int *a; 5591 int const *b; 5592 float const *f; 5593pointerType(pointee(isConstQualified(), isInteger())) 5594 matches "int const *b" 5595 5596Usable 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>>, 5597 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>> 5598</pre></td></tr> 5599 5600 5601<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> 5602<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 5603 5604Given 5605 return a + b; 5606hasReturnValue(binaryOperator()) 5607 matches 'return a + b' 5608with binaryOperator() 5609 matching 'a + b' 5610</pre></td></tr> 5611 5612 5613<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> 5614<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 5615a given matcher. Also matches StmtExprs that have CompoundStmt as children. 5616 5617Given 5618 { {}; 1+2; } 5619hasAnySubstatement(compoundStmt()) 5620 matches '{ {}; 1+2; }' 5621with compoundStmt() 5622 matching '{}' 5623</pre></td></tr> 5624 5625 5626<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> 5627<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5628alignof. 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('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> 5633<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 5634 5635Given: 5636F& operator=(const F& o) { 5637 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 5638 return *this; 5639} 5640returnStmt(forFunction(hasName("operator="))) 5641 matches 'return *this' 5642 but does match 'return > 0' 5643</pre></td></tr> 5644 5645 5646<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> 5647<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5648sizeof. 5649</pre></td></tr> 5650 5651 5652<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> 5653<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 5654type that matches the provided matcher. 5655 5656Given 5657 template <typename T> 5658 double F(T t); 5659 int i; 5660 double j = F(i); 5661 5662substTemplateTypeParmType(hasReplacementType(type())) matches int 5663</pre></td></tr> 5664 5665 5666<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> 5667<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 5668statement. This matcher may produce multiple matches. 5669 5670Given 5671 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 5672switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 5673 matches four times, with "c" binding each of "case 1:", "case 2:", 5674"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 5675"switch (1)", "switch (2)" and "switch (2)". 5676</pre></td></tr> 5677 5678 5679<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> 5680<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 5681switch statement or conditional operator. 5682 5683Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5684 if (true) {} 5685</pre></td></tr> 5686 5687 5688<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> 5689<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 5690matches the given matcher. 5691 5692The associated declaration is: 5693- for type nodes, the declaration of the underlying type 5694- for CallExpr, the declaration of the callee 5695- for MemberExpr, the declaration of the referenced member 5696- for CXXConstructExpr, the declaration of the constructor 5697- for CXXNewExpr, the declaration of the operator new 5698 5699Also usable as Matcher<T> for any T supporting the getDecl() member 5700function. e.g. various subtypes of clang::Type and various expressions. 5701 5702Usable 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>>, 5703 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>>, 5704 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>>, 5705 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>>, 5706 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>>, 5707 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>>, 5708 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5709</pre></td></tr> 5710 5711 5712<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> 5713<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 5714 5715Given 5716 template<typename T> struct A {}; 5717 struct B { B* next; }; 5718 A<&B::next> a; 5719templateSpecializationType(hasAnyTemplateArgument( 5720 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 5721 matches the specialization A<&B::next> with fieldDecl(...) matching 5722 B::next 5723</pre></td></tr> 5724 5725 5726<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> 5727<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 5728declaration. 5729 5730Given 5731 template<typename T> struct A {}; 5732 struct B { B* next; }; 5733 A<&B::next> a; 5734classTemplateSpecializationDecl(hasAnyTemplateArgument( 5735 refersToDeclaration(fieldDecl(hasName("next")))) 5736 matches the specialization A<&B::next> with fieldDecl(...) matching 5737 B::next 5738</pre></td></tr> 5739 5740 5741<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> 5742<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 5743 5744Given 5745 template<int T> struct A {}; 5746 C<42> c; 5747classTemplateSpecializationDecl( 5748 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 5749 matches the implicit instantiation of C in C<42>. 5750</pre></td></tr> 5751 5752 5753<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> 5754<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 5755 5756Given 5757 template<template <typename> class S> class X {}; 5758 template<typename T> class Y {};" 5759 X<Y> xi; 5760classTemplateSpecializationDecl(hasAnyTemplateArgument( 5761 refersToTemplate(templateName()))) 5762 matches the specialization X<Y> 5763</pre></td></tr> 5764 5765 5766<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> 5767<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 5768 5769Given 5770 struct X {}; 5771 template<typename T> struct A {}; 5772 A<X> a; 5773classTemplateSpecializationDecl(hasAnyTemplateArgument( 5774 refersToType(class(hasName("X"))))) 5775 matches the specialization A<X> 5776</pre></td></tr> 5777 5778 5779<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> 5780<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5781functionDecl that have at least one TemplateArgument matching the given 5782InnerMatcher. 5783 5784Given 5785 template<typename T> class A {}; 5786 template<> class A<double> {}; 5787 A<int> a; 5788 5789 template<typename T> f() {}; 5790 void func() { f<int>(); }; 5791 5792classTemplateSpecializationDecl(hasAnyTemplateArgument( 5793 refersToType(asString("int")))) 5794 matches the specialization A<int> 5795 5796functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5797 matches the specialization f<int> 5798</pre></td></tr> 5799 5800 5801<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> 5802<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 5803matches the given matcher. 5804 5805The associated declaration is: 5806- for type nodes, the declaration of the underlying type 5807- for CallExpr, the declaration of the callee 5808- for MemberExpr, the declaration of the referenced member 5809- for CXXConstructExpr, the declaration of the constructor 5810- for CXXNewExpr, the declaration of the operator new 5811 5812Also usable as Matcher<T> for any T supporting the getDecl() member 5813function. e.g. various subtypes of clang::Type and various expressions. 5814 5815Usable 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>>, 5816 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>>, 5817 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>>, 5818 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>>, 5819 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>>, 5820 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>>, 5821 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5822</pre></td></tr> 5823 5824 5825<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> 5826<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5827functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5828 5829Given 5830 template<typename T, typename U> class A {}; 5831 A<bool, int> b; 5832 A<int, bool> c; 5833 5834 template<typename T> f() {}; 5835 void func() { f<int>(); }; 5836classTemplateSpecializationDecl(hasTemplateArgument( 5837 1, refersToType(asString("int")))) 5838 matches the specialization A<bool, int> 5839 5840functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5841 matches the specialization f<int> 5842</pre></td></tr> 5843 5844 5845<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> 5846<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 5847matches the given matcher. 5848 5849The associated declaration is: 5850- for type nodes, the declaration of the underlying type 5851- for CallExpr, the declaration of the callee 5852- for MemberExpr, the declaration of the referenced member 5853- for CXXConstructExpr, the declaration of the constructor 5854- for CXXNewExpr, the declaration of the operator new 5855 5856Also usable as Matcher<T> for any T supporting the getDecl() member 5857function. e.g. various subtypes of clang::Type and various expressions. 5858 5859Usable 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>>, 5860 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>>, 5861 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>>, 5862 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>>, 5863 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>>, 5864 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>>, 5865 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5866</pre></td></tr> 5867 5868 5869<tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<T> Matcher</td></tr> 5870<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5871 5872Generates results for each match. 5873 5874For example, in: 5875 class A { class B {}; class C {}; }; 5876The matcher: 5877 cxxRecordDecl(hasName("::A"), 5878 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5879will generate results for A, B and C. 5880 5881Usable as: Any Matcher 5882</pre></td></tr> 5883 5884 5885<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> 5886<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 5887matcher. 5888 5889Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5890 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5891 and U (matcher = typedefDecl(hasType(asString("int"))) 5892 class X {}; 5893 void y(X &x) { x; X z; } 5894 typedef int U; 5895</pre></td></tr> 5896 5897 5898<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> 5899<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 5900matches the given matcher. 5901 5902The associated declaration is: 5903- for type nodes, the declaration of the underlying type 5904- for CallExpr, the declaration of the callee 5905- for MemberExpr, the declaration of the referenced member 5906- for CXXConstructExpr, the declaration of the constructor 5907- for CXXNewExpr, the declaration of the operator new 5908 5909Also usable as Matcher<T> for any T supporting the getDecl() member 5910function. e.g. various subtypes of clang::Type and various expressions. 5911 5912Usable 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>>, 5913 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>>, 5914 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>>, 5915 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>>, 5916 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>>, 5917 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>>, 5918 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5919</pre></td></tr> 5920 5921 5922<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> 5923<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 5924type of the matched node. 5925 5926For example, in: 5927 class A {}; 5928 using B = A; 5929The matcher type(hasUniqualifeidDesugaredType(recordType())) matches 5930both B and A. 5931</pre></td></tr> 5932 5933 5934<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> 5935<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 5936 5937Given 5938 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 5939unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 5940 matches sizeof(a) and alignof(c) 5941</pre></td></tr> 5942 5943 5944<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> 5945<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 5946 5947Example matches true (matcher = hasUnaryOperand( 5948 cxxBoolLiteral(equals(true)))) 5949 !true 5950</pre></td></tr> 5951 5952 5953<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> 5954<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 5955matches the given matcher. 5956 5957The associated declaration is: 5958- for type nodes, the declaration of the underlying type 5959- for CallExpr, the declaration of the callee 5960- for MemberExpr, the declaration of the referenced member 5961- for CXXConstructExpr, the declaration of the constructor 5962- for CXXNewExpr, the declaration of the operator new 5963 5964Also usable as Matcher<T> for any T supporting the getDecl() member 5965function. e.g. various subtypes of clang::Type and various expressions. 5966 5967Usable 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>>, 5968 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>>, 5969 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>>, 5970 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>>, 5971 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>>, 5972 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>>, 5973 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5974</pre></td></tr> 5975 5976 5977<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> 5978<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 5979 5980Given 5981 namespace X { void b(); } 5982 using X::b; 5983usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 5984 matches using X::b </pre></td></tr> 5985 5986 5987<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> 5988<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 5989matched by the given matcher. 5990 5991Given 5992 namespace X { int a; void b(); } 5993 using X::a; 5994 using X::b; 5995usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 5996 matches using X::b but not using X::a </pre></td></tr> 5997 5998 5999<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> 6000<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6001declaration's type. 6002 6003In case of a value declaration (for example a variable declaration), 6004this resolves one layer of indirection. For example, in the value 6005declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6006X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6007declaration of x. 6008 6009Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6010 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6011 class X {}; 6012 void y(X &x) { x; X z; } 6013 6014Usable 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>> 6015</pre></td></tr> 6016 6017 6018<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> 6019<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 6020matcher. 6021 6022Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6023 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6024 and U (matcher = typedefDecl(hasType(asString("int"))) 6025 class X {}; 6026 void y(X &x) { x; X z; } 6027 typedef int U; 6028</pre></td></tr> 6029 6030 6031<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> 6032<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 6033that matches the given matcher. 6034 6035Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 6036 bool y() { return true; } 6037 bool x = y(); 6038</pre></td></tr> 6039 6040 6041<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> 6042<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 6043expression. 6044 6045Given 6046 void f(int b) { 6047 int a[b]; 6048 } 6049variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 6050 varDecl(hasName("b"))))))) 6051 matches "int a[b]" 6052</pre></td></tr> 6053 6054 6055<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> 6056<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 6057definition that has a given body. 6058 6059Given 6060 for (;;) {} 6061hasBody(compoundStmt()) 6062 matches 'for (;;) {}' 6063with compoundStmt() 6064 matching '{}' 6065</pre></td></tr> 6066 6067 6068<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> 6069<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 6070switch statement or conditional operator. 6071 6072Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6073 if (true) {} 6074</pre></td></tr> 6075 6076 6077<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> 6078<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 6079NestedNameSpecifier-matcher matches. 6080</pre></td></tr> 6081 6082 6083<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> 6084<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 6085QualType-matcher matches. 6086</pre></td></tr> 6087 6088<!--END_TRAVERSAL_MATCHERS --> 6089</table> 6090 6091</div> 6092</body> 6093</html> 6094 6095 6096