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