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