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