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