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