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