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