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} 20span.mono { font-family: monospace; } 21 22.traverse_compare, .traverse_compare td, .traverse_compare th { 23 border: 1px solid black; 24 border-collapse: collapse; 25} 26</style> 27<script type="text/javascript"> 28function toggle(id) { 29 if (!id) return; 30 row = document.getElementById(id); 31 if (row.style.display != 'table-cell') 32 row.style.display = 'table-cell'; 33 else 34 row.style.display = 'none'; 35} 36</script> 37</head> 38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 39 40<!--#include virtual="../menu.html.incl"--> 41 42<div id="content"> 43 44<h1>AST Matcher Reference</h1> 45 46<p>This document shows all currently implemented matchers. The matchers are grouped 47by category and node type they match. You can click on matcher names to show the 48matcher's source documentation.</p> 49 50<p>There are three different basic categories of matchers: 51<ul> 52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 55</ul> 56</p> 57 58<p>Within each category the matchers are ordered by node type they match on. 59Note that if a matcher can match multiple node types, it will appear 60multiple times. This means that by searching for Matcher<Stmt> you can 61find all matchers that can be used to match on Stmt nodes.</p> 62 63<p>The exception to that rule are matchers that can match on any node. Those 64are marked with a * and are listed in the beginning of each category.</p> 65 66<p>Note that the categorization of matchers is a great help when you combine 67them into matcher expressions. You will usually want to form matcher expressions 68that read like english sentences by alternating between node matchers and 69narrowing or traversal matchers, like this: 70<pre> 71recordDecl(hasDescendant( 72 ifStmt(hasTrueExpression( 73 expr(hasDescendant( 74 ifStmt())))))) 75</pre> 76</p> 77 78<!-- ======================================================================= --> 79<h2 id="traverse-mode">Traverse Mode</h2> 80<!-- ======================================================================= --> 81 82<p>The default mode of operation of AST Matchers visits all nodes in the AST, 83even if they are not spelled in the source. This is 84<span class="mono">AsIs</span> mode. This mode requires writing AST matchers 85that explicitly traverse or ignore implicit nodes, such as parentheses 86surrounding an expression or expressions with cleanups. These implicit 87nodes are not always obvious from the syntax of the source code, and so this 88mode requires careful consideration and testing to get the desired behavior 89from an AST matcher. 90</p> 91 92<p>In addition, because template instantiations are matched in the default mode, 93transformations can be accidentally made to template declarations. Finally, 94because implicit nodes are matched by default, transformations can be made on 95entirely incorrect places in the code.</p> 96 97<p>For these reasons, it is possible to ignore AST nodes which are not spelled 98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span> 99mode. This is likely to be far less error-prone for users who are not already 100very familiar with where implicit nodes appear in the AST. It is also likely 101to be less error-prone for experienced AST users, as difficult cases do not 102need to be encountered and matcher expressions adjusted for these cases.</p> 103 104<p>In clang-query, the mode can be changed with 105<pre> 106set traversal IgnoreUnlessSpelledInSource 107</pre> 108</p> 109This affects both matchers and AST dump output in results. 110 111<p>When using the C++ API such as in clang-tidy checks, the 112<span class="mono">traverse()</span> matcher is used to set the mode: 113<pre> 114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource, 115 returnStmt(hasReturnArgument(integerLiteral(equals(0)))) 116 ), this); 117</pre> 118</p> 119<p>The following table compares the <span class="mono">AsIs</span> mode with 120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p> 121 122<table class="traverse_compare"> 123<tr> 124<th></th> 125<th><span class="mono">AsIs</span></th> 126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th> 127</tr> 128<tr> 129 <td>AST dump of <span class="mono">func1</span>: 130<pre> 131struct B { 132 B(int); 133}; 134 135B func1() { return 42; } 136</pre> 137 138 </td> 139 <td> 140C++98 dialect: 141<pre> 142FunctionDecl 143`-CompoundStmt 144 `-ReturnStmt 145 `-ExprWithCleanups 146 `-CXXConstructExpr 147 `-MaterializeTemporaryExpr 148 `-ImplicitCastExpr 149 `-ImplicitCastExpr 150 `-CXXConstructExpr 151 `-IntegerLiteral 'int' 42 152</pre> 153C++11, C++14 dialect: 154<pre> 155FunctionDecl 156`-CompoundStmt 157 `-ReturnStmt 158 `-ExprWithCleanups 159 `-CXXConstructExpr 160 `-MaterializeTemporaryExpr 161 `-ImplicitCastExpr 162 `-CXXConstructExpr 163 `-IntegerLiteral 'int' 42 164</pre> 165C++17, C++20 dialect: 166<pre> 167FunctionDecl 168`-CompoundStmt 169 `-ReturnStmt 170 `-ImplicitCastExpr 171 `-CXXConstructExpr 172 `-IntegerLiteral 'int' 42 173</pre> 174</td> 175 <td> 176All dialects: 177 <pre> 178FunctionDecl 179`-CompoundStmt 180 `-ReturnStmt 181 `-IntegerLiteral 'int' 42 182</pre></td> 183</tr> 184 185<tr> 186<td>Matcher for returned <span class="mono">42</span>: 187<pre> 188struct B { 189 B(int); 190}; 191 192B func1() { return 42; } 193</pre> 194 195 </td> 196 <td> 197All dialects: 198<pre> 199returnStmt(hasReturnValue( 200 ignoringImplicit( 201 ignoringElidableConstructorCall( 202 ignoringImplicit( 203 cxxConstructExpr(hasArgument(0, 204 ignoringImplicit( 205 integerLiteral().bind("returnVal") 206 ) 207 )) 208 ) 209 ) 210 ) 211 )) 212</pre></td> 213 <td> 214All dialects: 215<pre> 216returnStmt(hasReturnValue( 217 integerLiteral().bind("returnVal") 218)) 219</pre></td> 220</tr> 221<tr> 222<td>Match result for 223<pre>implicitCastExpr()</pre> 224given: 225<pre> 226struct B { 227 B(int); 228}; 229 230B func1() { return 42; } 231</pre> 232 233</td> 234<td> 235Match found.</td> 236 <td> 237No match.</td> 238</tr> 239<tr> 240 <td>Match result for: 241<pre> 242cxxConstructorDecl( 243 isCopyConstructor() 244 ).bind("prepend_explicit") 245</pre> 246given: 247<pre> 248struct Other {}; 249struct Copyable { 250 Other m_o; 251 Copyable(); 252}; 253</pre> 254</td> 255<td> 256Match found. Insertion produces incorrect output: 257<pre> 258struct Other {}; 259struct explicit Copyable { 260 Other m_o; 261 Copyable(); 262}; 263</pre> 264</td> 265<td> 266No match found. Incorrect replacement not possible. 267</td> 268</tr> 269<tr> 270 <td>Replacement of <span class="mono">begin()</span> 271 with <span class="mono">cbegin()</span>: 272<pre> 273cxxMemberCallExpr( 274 on(ConstContainerExpr), 275 callee(cxxMethodDecl(hasName("begin"))) 276 ).bind("replace_with_cbegin") 277</pre> 278given: 279<pre> 280void foo() { 281 const Container c; 282 c.begin(); 283 284 for (auto i : c) { 285 } 286} 287</pre> 288</td> 289<td> 2902 matches found. Replacement produces incorrect output: 291<pre> 292void foo() { 293 const Container c; 294 c.cbegin(); 295 296 for (auto i :.cbegin() c) { 297 } 298} 299</pre> 300</td> 301<td> 3021 match found. Replacement produces correct output: 303<pre> 304void foo() { 305 const Container c; 306 c.cbegin(); 307 308 for (auto i : c) { 309 } 310} 311</pre> 312</td> 313</tr> 314<tr> 315 <td>Replacement of <span class="mono">int</span> member 316 with <span class="mono">safe_int</span>: 317<pre> 318fieldDecl( 319 hasType(asString("int")) 320 ).bind("use_safe_int") 321</pre> 322given: 323<pre> 324struct S { 325 int m_i; 326}; 327 328template <typename T> struct TemplStruct { 329 TemplStruct() {} 330 ~TemplStruct() {} 331 332private: 333 T m_t; 334}; 335 336void instantiate() { TemplStruct<int> ti; } 337</pre> 338</td> 339<td> 3402 matches found. Replacement produces incorrect output: 341<pre> 342struct S { 343 safe_int m_i; 344}; 345 346template <typename T> struct TemplStruct { 347 TemplStruct() {} 348 ~TemplStruct() {} 349 350private: 351 safe_int m_t; 352}; 353 354void instantiate() { TemplStruct<int> ti; } 355</pre> 356</td> 357<td> 3581 match found. Replacement produces correct output: 359<pre> 360struct S { 361 safe_int m_i; 362}; 363 364template <typename T> struct TemplStruct { 365 TemplStruct() {} 366 ~TemplStruct() {} 367 368private: 369 T m_t; 370}; 371 372void instantiate() { TemplStruct<int> ti; } 373</pre> 374</td> 375</tr> 376<tr> 377 <td>Add prefix to member initializer 378<pre> 379cxxCtorInitializer( 380 forField(fieldDecl()) 381 ).bind("add_prefix") 382</pre> 383given: 384<pre> 385struct Simple {}; 386 387struct Record { 388 Record() : i(42) {} 389private: 390 int i; 391 Simple s; 392}; 393</pre> 394</td> 395<td> 3962 matches found. Replacement produces incorrect output: 397<pre> 398struct Simple {}; 399 400struct Record { 401 m_Record() : m_i(42) {} 402private: 403 int i; 404 Simple s; 405}; 406</pre> 407</td> 408<td> 4091 match found. Replacement produces correct output: 410<pre> 411struct Simple {}; 412 413struct Record { 414 Record() : m_i(42) {} 415private: 416 int i; 417 Simple s; 418}; 419</pre> 420</td> 421</tr> 422<tr> 423 <td>Ignored default arguments 424<pre> 425callExpr( 426 callee(functionDecl( 427 hasName("hasDefaultArg") 428 )), 429 argumentCountIs(1) 430 ).bind("add_prefix") 431</pre> 432given: 433<pre> 434void hasDefaultArg(int i, int j = 0) {} 435void callDefaultArg() { hasDefaultArg(42); } 436</pre> 437</td> 438<td> 439No match. 440</td> 441<td> 4421 match found. 443</td> 444</tr> 445<tr> 446 <td>Lambda fields 447<pre> 448fieldDecl( 449 hasType(asString("int")) 450 ).bind("make_safe") 451</pre> 452given: 453<pre> 454struct S { 455 int m_i; 456}; 457 458void func() { 459 int a = 0; 460 int c = 0; 461 462 auto l = [a, b = c](int d) { int e = d; }; 463 l(43); 464} 465</pre> 466</td> 467<td> 4682 matches found. Replacement produces incorrect output: 469<pre> 470struct S { 471 safe_int m_i; 472}; 473 474void func() { 475 int a = 0; 476 int c = 0; 477 478 auto l = [safe_a, safe_b = c](int d) { int e = d; }; 479 l(43); 480} 481</pre> 482</td> 483<td> 4841 match found. Replacement produces correct output: 485<pre> 486struct S { 487 safe_int m_i; 488}; 489 490void func() { 491 int a = 0; 492 int c = 0; 493 494 auto l = [a, b = c](int d) { int e = d; }; 495 l(43); 496} 497</pre> 498</td> 499 500</tr> 501</table> 502 503<!-- ======================================================================= --> 504<h2 id="decl-matchers">Node Matchers</h2> 505<!-- ======================================================================= --> 506 507<p>Node matchers are at the core of matcher expressions - they specify the type 508of node that is expected. Every match expression starts with a node matcher, 509which can then be further refined with a narrowing or traversal matcher. All 510traversal matchers take node matchers as their arguments.</p> 511 512<p>For convenience, all node matchers take an arbitrary number of arguments 513and implicitly act as allOf matchers.</p> 514 515<p>Node matchers are the only matchers that support the bind("id") call to 516bind the matched node to the given string, to be later retrieved from the 517match callback.</p> 518 519<p>It is important to remember that the arguments to node matchers are 520predicates on the same node, just with additional information about the type. 521This is often useful to make matcher expression more readable by inlining bind 522calls into redundant node matchers inside another node matcher: 523<pre> 524// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 525// the same node. 526recordDecl(decl().bind("id"), hasName("::MyClass")) 527</pre> 528</p> 529 530<table> 531<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 532<!-- START_DECL_MATCHERS --> 533 534<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 535<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 536 537Examples matches i(42). 538 class C { 539 C() : i(42) {} 540 int i; 541 }; 542</pre></td></tr> 543 544 545<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 546<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 547 548Given 549 class C { 550 public: 551 int a; 552 }; 553accessSpecDecl() 554 matches 'public:' 555</pre></td></tr> 556 557 558<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 559<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 560 561Example matches the declaration of the nameless block printing an input 562integer. 563 564 myFunc(^(int p) { 565 printf("%d", p); 566 }) 567</pre></td></tr> 568 569 570<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 571<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 572 573Example matches Z 574 template<class T> class Z {}; 575</pre></td></tr> 576 577 578<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 579<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 580 581Given 582 template<class T1, class T2, int I> 583 class A {}; 584 585 template<class T, int I> 586 class A<T, T*, I> {}; 587 588 template<> 589 class A<int, int, 1> {}; 590classTemplatePartialSpecializationDecl() 591 matches the specialization A<T,T*,I> but not A<int,int,1> 592</pre></td></tr> 593 594 595<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 596<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 597 598Given 599 template<typename T> class A {}; 600 template<> class A<double> {}; 601 A<int> a; 602classTemplateSpecializationDecl() 603 matches the specializations A<int> and A<double> 604</pre></td></tr> 605 606 607<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 608<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 609 610Example matches Foo::Foo() and Foo::Foo(int) 611 class Foo { 612 public: 613 Foo(); 614 Foo(int); 615 int DoSomething(); 616 }; 617</pre></td></tr> 618 619 620<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 621<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 622 623Example matches the operator. 624 class X { operator int() const; }; 625</pre></td></tr> 626 627 628<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 629<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 630 631Example matches the deduction guide. 632 template<typename T> 633 class X { X(int) }; 634 X(int) -> X<int>; 635</pre></td></tr> 636 637 638<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 639<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 640 641Example matches Foo::~Foo() 642 class Foo { 643 public: 644 virtual ~Foo(); 645 }; 646</pre></td></tr> 647 648 649<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 650<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 651 652Example matches y 653 class X { void y(); }; 654</pre></td></tr> 655 656 657<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 658<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 659 660Example matches X, Z 661 class X; 662 template<class T> class Z {}; 663</pre></td></tr> 664 665 666<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 667<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 668 669Examples matches X, C, and the friend declaration inside C; 670 void X(); 671 class C { 672 friend X; 673 }; 674</pre></td></tr> 675 676 677<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 678<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 679and non-type template parameter declarations). 680 681Given 682 class X { int y; }; 683declaratorDecl() 684 matches int y. 685</pre></td></tr> 686 687 688<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 689<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 690 691Example matches A, B, C 692 enum X { 693 A, B, C 694 }; 695</pre></td></tr> 696 697 698<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 700 701Example matches X 702 enum X { 703 A, B, C 704 }; 705</pre></td></tr> 706 707 708<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 709<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 710 711Given 712 class X { int m; }; 713fieldDecl() 714 matches 'm'. 715</pre></td></tr> 716 717 718<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 719<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 720 721Given 722 class X { friend void foo(); }; 723friendDecl() 724 matches 'friend void foo()'. 725</pre></td></tr> 726 727 728<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 729<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 730 731Example matches f 732 void f(); 733</pre></td></tr> 734 735 736<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 737<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 738 739Example matches f 740 template<class T> void f(T t) {} 741</pre></td></tr> 742 743 744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 746 747Given 748 struct X { struct { int a; }; }; 749indirectFieldDecl() 750 matches 'a'. 751</pre></td></tr> 752 753 754<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 755<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 756 757Given 758 goto FOO; 759 FOO: bar(); 760labelDecl() 761 matches 'FOO:' 762</pre></td></tr> 763 764 765<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 766<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 767 768Given 769 extern "C" {} 770linkageSpecDecl() 771 matches "extern "C" {}" 772</pre></td></tr> 773 774 775<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 776<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 777 778Example matches X, S, the anonymous union type, i, and U; 779 typedef int X; 780 struct S { 781 union { 782 int i; 783 } U; 784 }; 785</pre></td></tr> 786 787 788<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 789<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 790 791Given 792 namespace test {} 793 namespace alias = ::test; 794namespaceAliasDecl() 795 matches "namespace alias" but not "namespace test" 796</pre></td></tr> 797 798 799<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 800<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 801 802Given 803 namespace {} 804 namespace test {} 805namespaceDecl() 806 matches "namespace {}" and "namespace test {}" 807</pre></td></tr> 808 809 810<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 811<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 812 813Given 814 template <typename T, int N> struct C {}; 815nonTypeTemplateParmDecl() 816 matches 'N', but not 'T'. 817</pre></td></tr> 818 819 820<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 821<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 822 823Example matches Foo (Additions) 824 @interface Foo (Additions) 825 @end 826</pre></td></tr> 827 828 829<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 830<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 831 832Example matches Foo (Additions) 833 @implementation Foo (Additions) 834 @end 835</pre></td></tr> 836 837 838<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 839<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 840 841Example matches Foo 842 @implementation Foo 843 @end 844</pre></td></tr> 845 846 847<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 848<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 849 850Example matches Foo 851 @interface Foo 852 @end 853</pre></td></tr> 854 855 856<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 857<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 858 859Example matches _enabled 860 @implementation Foo { 861 BOOL _enabled; 862 } 863 @end 864</pre></td></tr> 865 866 867<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 868<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 869 870Example matches both declaration and definition of -[Foo method] 871 @interface Foo 872 - (void)method; 873 @end 874 875 @implementation Foo 876 - (void)method {} 877 @end 878</pre></td></tr> 879 880 881<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 882<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 883 884Example matches enabled 885 @interface Foo 886 @property BOOL enabled; 887 @end 888</pre></td></tr> 889 890 891<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 892<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 893 894Example matches FooDelegate 895 @protocol FooDelegate 896 @end 897</pre></td></tr> 898 899 900<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 901<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 902 903Given 904 void f(int x); 905parmVarDecl() 906 matches int x. 907</pre></td></tr> 908 909 910<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 912 913Example matches X, Z, U, and S 914 class X; 915 template<class T> class Z {}; 916 struct S {}; 917 union U {}; 918</pre></td></tr> 919 920 921<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 922<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 923 924Example: 925 staticAssertExpr() 926matches 927 static_assert(sizeof(S) == sizeof(int)) 928in 929 struct S { 930 int x; 931 }; 932 static_assert(sizeof(S) == sizeof(int)); 933</pre></td></tr> 934 935 936<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 937<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 938 939Example matches X, Z, U, S, E 940 class X; 941 template<class T> class Z {}; 942 struct S {}; 943 union U {}; 944 enum E { 945 A, B, C 946 }; 947</pre></td></tr> 948 949 950<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 951<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 952 953Given 954 template <template <typename> class Z, int N> struct C {}; 955templateTypeParmDecl() 956 matches 'Z', but not 'N'. 957</pre></td></tr> 958 959 960<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 961<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 962 963Given 964 template <typename T, int N> struct C {}; 965templateTypeParmDecl() 966 matches 'T', but not 'N'. 967</pre></td></tr> 968 969 970<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 971<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 972 973Given 974 int X; 975 namespace NS { 976 int Y; 977 } // namespace NS 978decl(hasDeclContext(translationUnitDecl())) 979 matches "int X", but not "int Y". 980</pre></td></tr> 981 982 983<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 984<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 985 986Given 987 typedef int X; 988 using Y = int; 989typeAliasDecl() 990 matches "using Y = int", but not "typedef int X" 991</pre></td></tr> 992 993 994<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 995<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 996 997typeAliasTemplateDecl() matches 998 template <typename T> 999 using Y = X<T>; 1000</pre></td></tr> 1001 1002 1003<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 1004<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1005 1006Given 1007 typedef int X; 1008 using Y = int; 1009typedefDecl() 1010 matches "typedef int X", but not "using Y = int" 1011</pre></td></tr> 1012 1013 1014<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1015<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1016 1017Given 1018 typedef int X; 1019 using Y = int; 1020typedefNameDecl() 1021 matches "typedef int X" and "using Y = int" 1022</pre></td></tr> 1023 1024 1025<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 1026<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1027typename. 1028 1029Given 1030 template <typename T> 1031 struct Base { typedef T Foo; }; 1032 1033 template<typename T> 1034 struct S : private Base<T> { 1035 using typename Base<T>::Foo; 1036 }; 1037unresolvedUsingTypenameDecl() 1038 matches using Base<T>::Foo </pre></td></tr> 1039 1040 1041<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 1042<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1043 1044Given 1045 template<typename X> 1046 class C : private X { 1047 using X::x; 1048 }; 1049unresolvedUsingValueDecl() 1050 matches using X::x </pre></td></tr> 1051 1052 1053<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 1054<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1055 1056Given 1057 namespace X { int x; } 1058 using X::x; 1059usingDecl() 1060 matches using X::x </pre></td></tr> 1061 1062 1063<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 1064<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1065 1066Given 1067 namespace X { int x; } 1068 using namespace X; 1069usingDirectiveDecl() 1070 matches using namespace X </pre></td></tr> 1071 1072 1073<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 1074<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1075 1076Example matches A, B, C and F 1077 enum X { A, B, C }; 1078 void F(); 1079</pre></td></tr> 1080 1081 1082<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 1083<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1084 1085Note: this does not match declarations of member variables, which are 1086"field" declarations in Clang parlance. 1087 1088Example matches a 1089 int a; 1090</pre></td></tr> 1091 1092 1093<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 1094<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 1095 1096Examples matches the declaration node with foo and bar, but not 1097number. 1098(matcher = declStmt(has(decompositionDecl()))) 1099 1100 int number = 42; 1101 auto [foo, bar] = std::make_pair{42, 42}; 1102</pre></td></tr> 1103 1104 1105<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 1106<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1107</pre></td></tr> 1108 1109 1110<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 1111<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1112 1113Given 1114 namespace ns { 1115 struct A { static void f(); }; 1116 void A::f() {} 1117 void g() { A::f(); } 1118 } 1119 ns::A a; 1120nestedNameSpecifier() 1121 matches "ns::" and both "A::" 1122</pre></td></tr> 1123 1124 1125<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr> 1126<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1127 1128Given 1129 1130 #pragma omp parallel default(none) 1131 #pragma omp parallel default(shared) 1132 #pragma omp parallel default(firstprivate) 1133 #pragma omp parallel 1134 1135``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1136``default(firstprivate)`` 1137</pre></td></tr> 1138 1139 1140<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 1141<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1142</pre></td></tr> 1143 1144 1145<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1146<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1147 1148Given 1149 FOO: bar(); 1150 void *ptr = &&FOO; 1151 goto *bar; 1152addrLabelExpr() 1153 matches '&&FOO' 1154</pre></td></tr> 1155 1156 1157<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 1158<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1159 1160Given 1161 int i = a[1]; 1162arraySubscriptExpr() 1163 matches "a[1]" 1164</pre></td></tr> 1165 1166 1167<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 1168<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1169 1170 int i = 100; 1171 __asm("mov al, 2"); 1172asmStmt() 1173 matches '__asm("mov al, 2")' 1174</pre></td></tr> 1175 1176 1177<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 1178<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1179Example matches __atomic_load_n(ptr, 1) 1180 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1181</pre></td></tr> 1182 1183 1184<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 1185<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1186 1187Given 1188 @autoreleasepool { 1189 int x = 0; 1190 } 1191autoreleasePoolStmt(stmt()) matches the declaration of "x" 1192inside the autorelease pool. 1193</pre></td></tr> 1194 1195 1196<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 1197<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1198 1199Example matches a ?: b 1200 (a ?: b) + 42; 1201</pre></td></tr> 1202 1203 1204<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 1205<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1206 1207Example matches a || b 1208 !(a || b) 1209</pre></td></tr> 1210 1211 1212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 1213<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1214 1215Example: matches "^{}": 1216 void f() { ^{}(); } 1217</pre></td></tr> 1218 1219 1220<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1221<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1222 1223Given 1224 while (true) { break; } 1225breakStmt() 1226 matches 'break' 1227</pre></td></tr> 1228 1229 1230<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 1231<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1232 1233Example: Matches (int) 2.2f in 1234 int i = (int) 2.2f; 1235</pre></td></tr> 1236 1237 1238<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 1239<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1240 1241Example matches x.y() and y() 1242 X x; 1243 x.y(); 1244 y(); 1245</pre></td></tr> 1246 1247 1248<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 1249<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1250 1251Given 1252 switch(a) { case 42: break; default: break; } 1253caseStmt() 1254 matches 'case 42:'. 1255</pre></td></tr> 1256 1257 1258<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 1259<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1260 1261Example: castExpr() matches each of the following: 1262 (int) 3; 1263 const_cast<Expr *>(SubExpr); 1264 char c = 0; 1265but does not match 1266 int i = (0); 1267 int k = 0; 1268</pre></td></tr> 1269 1270 1271<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 1272<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1273 1274Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1275though. 1276 1277Example matches 'a', L'a' 1278 char ch = 'a'; 1279 wchar_t chw = L'a'; 1280</pre></td></tr> 1281 1282 1283<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1284<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1285</pre></td></tr> 1286 1287 1288<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 1289<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1290 1291Example match: {1}, (1, 2) 1292 int array[4] = {1}; 1293 vector int myvec = (vector int)(1, 2); 1294</pre></td></tr> 1295 1296 1297<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 1298<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1299 1300Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1301 for (;;) {{}} 1302</pre></td></tr> 1303 1304 1305<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 1306<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1307 1308Example matches a ? b : c 1309 (a ? b : c) + 42 1310</pre></td></tr> 1311 1312 1313<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 1314<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1315 1316Example matches the constant in the case statement: 1317 (matcher = constantExpr()) 1318 switch (a) { 1319 case 37: break; 1320 } 1321</pre></td></tr> 1322 1323 1324<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1325<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1326 1327Given 1328 while (true) { continue; } 1329continueStmt() 1330 matches 'continue' 1331</pre></td></tr> 1332 1333 1334<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 1335<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1336 1337Example matches, 1338 kernel<<<i,j>>>(); 1339</pre></td></tr> 1340 1341 1342<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1343<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1344 1345Example matches FunctionTakesString(GetStringByValue()) 1346 (matcher = cxxBindTemporaryExpr()) 1347 FunctionTakesString(GetStringByValue()); 1348 FunctionTakesStringByPointer(GetStringPointer()); 1349</pre></td></tr> 1350 1351 1352<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 1353<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1354 1355Example matches true 1356 true 1357</pre></td></tr> 1358 1359 1360<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 1361<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1362 1363 try {} catch(int i) {} 1364cxxCatchStmt() 1365 matches 'catch(int i)' 1366</pre></td></tr> 1367 1368 1369<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 1370<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1371 1372Example: Matches const_cast<int*>(&r) in 1373 int n = 42; 1374 const int &r(n); 1375 int* p = const_cast<int*>(&r); 1376</pre></td></tr> 1377 1378 1379<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 1380<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1381 1382Example matches string(ptr, n) and ptr within arguments of f 1383 (matcher = cxxConstructExpr()) 1384 void f(const string &a, const string &b); 1385 char *ptr; 1386 int n; 1387 f(string(ptr, n), ptr); 1388</pre></td></tr> 1389 1390 1391<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 1392<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1393 1394Example matches the CXXDefaultArgExpr placeholder inserted for the 1395 default value of the second parameter in the call expression f(42) 1396 (matcher = cxxDefaultArgExpr()) 1397 void f(int x, int y = 0); 1398 f(42); 1399</pre></td></tr> 1400 1401 1402<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 1403<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1404 1405Given 1406 delete X; 1407cxxDeleteExpr() 1408 matches 'delete X'. 1409</pre></td></tr> 1410 1411 1412<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> 1413<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1414resolved because the base expression or the member name was dependent. 1415 1416Given 1417 template <class T> void f() { T t; t.g(); } 1418cxxDependentScopeMemberExpr() 1419 matches t.g 1420</pre></td></tr> 1421 1422 1423<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 1424<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1425 1426Example: 1427 cxxDynamicCastExpr() 1428matches 1429 dynamic_cast<D*>(&b); 1430in 1431 struct B { virtual ~B() {} }; struct D : B {}; 1432 B b; 1433 D* p = dynamic_cast<D*>(&b); 1434</pre></td></tr> 1435 1436 1437<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 1438<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1439 1440cxxForRangeStmt() matches 'for (auto a : i)' 1441 int i[] = {1, 2, 3}; for (auto a : i); 1442 for(int j = 0; j < 5; ++j); 1443</pre></td></tr> 1444 1445 1446<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1447<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1448 1449Example: Matches Foo(bar); 1450 Foo f = bar; 1451 Foo g = (Foo) bar; 1452 Foo h = Foo(bar); 1453</pre></td></tr> 1454 1455 1456<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1457<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1458 1459Example matches x.y() 1460 X x; 1461 x.y(); 1462</pre></td></tr> 1463 1464 1465<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1466<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1467 1468Given 1469 new X; 1470cxxNewExpr() 1471 matches 'new X'. 1472</pre></td></tr> 1473 1474 1475<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1476<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1477 1478Given 1479 bool a() noexcept; 1480 bool b() noexcept(true); 1481 bool c() noexcept(false); 1482 bool d() noexcept(noexcept(a())); 1483 bool e = noexcept(b()) || noexcept(c()); 1484cxxNoexceptExpr() 1485 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1486 doesn't match the noexcept specifier in the declarations a, b, c or d. 1487</pre></td></tr> 1488 1489 1490<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1491<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1492</pre></td></tr> 1493 1494 1495<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1496<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1497 1498Note that if an operator isn't overloaded, it won't match. Instead, use 1499binaryOperator matcher. 1500Currently it does not match operators such as new delete. 1501FIXME: figure out why these do not match? 1502 1503Example matches both operator<<((o << b), c) and operator<<(o, b) 1504 (matcher = cxxOperatorCallExpr()) 1505 ostream &operator<< (ostream &out, int i) { }; 1506 ostream &o; int b = 1, c = 1; 1507 o << b << c; 1508</pre></td></tr> 1509 1510 1511<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1512<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1513 1514Either the source expression or the destination type can be matched 1515using has(), but hasDestinationType() is more specific and can be 1516more readable. 1517 1518Example matches reinterpret_cast<char*>(&p) in 1519 void* p = reinterpret_cast<char*>(&p); 1520</pre></td></tr> 1521 1522 1523<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1524<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1525 1526See also: hasDestinationType 1527See also: reinterpretCast 1528 1529Example: 1530 cxxStaticCastExpr() 1531matches 1532 static_cast<long>(8) 1533in 1534 long eight(static_cast<long>(8)); 1535</pre></td></tr> 1536 1537 1538<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1539<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1540 1541Given 1542 std::vector<int> a({ 1, 2, 3 }); 1543 std::vector<int> b = { 4, 5 }; 1544 int c[] = { 6, 7 }; 1545 std::pair<int, int> d = { 8, 9 }; 1546cxxStdInitializerListExpr() 1547 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1548</pre></td></tr> 1549 1550 1551<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1552<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1553 1554Example: Matches Foo(bar, bar) 1555 Foo h = Foo(bar, bar); 1556</pre></td></tr> 1557 1558 1559<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1560<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1561 1562Example matches the implicit this expression in "return i". 1563 (matcher = cxxThisExpr()) 1564struct foo { 1565 int i; 1566 int f() { return i; } 1567}; 1568</pre></td></tr> 1569 1570 1571<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1572<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1573 1574 try { throw 5; } catch(int i) {} 1575cxxThrowExpr() 1576 matches 'throw 5' 1577</pre></td></tr> 1578 1579 1580<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1581<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1582 1583 try {} catch(int i) {} 1584cxxTryStmt() 1585 matches 'try {}' 1586</pre></td></tr> 1587 1588 1589<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1590<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1591 1592Example matches T(t) in return statement of f 1593 (matcher = cxxUnresolvedConstructExpr()) 1594 template <typename T> 1595 void f(const T& t) { return T(t); } 1596</pre></td></tr> 1597 1598 1599<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1600<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1601 1602Example matches x in if (x) 1603 bool x; 1604 if (x) {} 1605</pre></td></tr> 1606 1607 1608<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1609<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1610 1611Given 1612 int a; 1613declStmt() 1614 matches 'int a'. 1615</pre></td></tr> 1616 1617 1618<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1619<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1620 1621Given 1622 switch(a) { case 42: break; default: break; } 1623defaultStmt() 1624 matches 'default:'. 1625</pre></td></tr> 1626 1627 1628<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1629<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1630 1631Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1632 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1633</pre></td></tr> 1634 1635 1636<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1637<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1638 1639Given 1640 do {} while (true); 1641doStmt() 1642 matches 'do {} while(true)' 1643</pre></td></tr> 1644 1645 1646<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 1647<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1648 1649Matches any cast expression written in user code, whether it be a 1650C-style cast, a functional-style cast, or a keyword cast. 1651 1652Does not match implicit conversions. 1653 1654Note: the name "explicitCast" is chosen to match Clang's terminology, as 1655Clang uses the term "cast" to apply to implicit conversions as well as to 1656actual cast expressions. 1657 1658See also: hasDestinationType. 1659 1660Example: matches all five of the casts in 1661 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1662but does not match the implicit conversion in 1663 long ell = 42; 1664</pre></td></tr> 1665 1666 1667<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1668<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1669 1670Example matches x() 1671 void f() { x(); } 1672</pre></td></tr> 1673 1674 1675<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1676<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1677of the sub-expression's evaluation. 1678 1679Example matches std::string() 1680 const std::string str = std::string(); 1681</pre></td></tr> 1682 1683 1684<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1685<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1686</pre></td></tr> 1687 1688 1689<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1690<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 16911.0, 1.0f, 1.0L and 1e10. 1692 1693Does not match implicit conversions such as 1694 float a = 10; 1695</pre></td></tr> 1696 1697 1698<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1699<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1700 1701Example matches 'for (;;) {}' 1702 for (;;) {} 1703 int i[] = {1, 2, 3}; for (auto a : i); 1704</pre></td></tr> 1705 1706 1707<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1708<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1709</pre></td></tr> 1710 1711 1712<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1713<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1714 1715Given 1716 goto FOO; 1717 FOO: bar(); 1718gotoStmt() 1719 matches 'goto FOO' 1720</pre></td></tr> 1721 1722 1723<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1724<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1725 1726Example matches 'if (x) {}' 1727 if (x) {} 1728</pre></td></tr> 1729 1730 1731<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1732<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1733point literals e.g.: 1i, 1.0i 1734</pre></td></tr> 1735 1736 1737<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1738<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1739 1740This matches many different places, including function call return value 1741eliding, as well as any type conversions. 1742</pre></td></tr> 1743 1744 1745<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1746<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1747 1748Given 1749 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1750implicitValueInitExpr() 1751 matches "[0].y" (implicitly) 1752</pre></td></tr> 1753 1754 1755<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1756<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1757 1758Given 1759 int a[] = { 1, 2 }; 1760 struct B { int x, y; }; 1761 B b = { 5, 6 }; 1762initListExpr() 1763 matches "{ 1, 2 }" and "{ 5, 6 }" 1764</pre></td></tr> 1765 1766 1767<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1768<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 17691, 1L, 0x1 and 1U. 1770 1771Does not match character-encoded integers such as L'a'. 1772</pre></td></tr> 1773 1774 1775<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1776<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1777 1778Given 1779 goto FOO; 1780 FOO: bar(); 1781labelStmt() 1782 matches 'FOO:' 1783</pre></td></tr> 1784 1785 1786<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1787<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1788 1789Example matches [&](){return 5;} 1790 [&](){return 5;} 1791</pre></td></tr> 1792 1793 1794<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1795<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1796 1797Example: Given 1798 struct T {void func();}; 1799 T f(); 1800 void g(T); 1801materializeTemporaryExpr() matches 'f()' in these statements 1802 T u(f()); 1803 g(f()); 1804 f().func(); 1805but does not match 1806 f(); 1807</pre></td></tr> 1808 1809 1810<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1811<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1812 1813Given 1814 class Y { 1815 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1816 int a; static int b; 1817 }; 1818memberExpr() 1819 matches this->x, x, y.x, a, this->b 1820</pre></td></tr> 1821 1822 1823<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1824<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1825 1826 foo();; 1827nullStmt() 1828 matches the second ';' 1829</pre></td></tr> 1830 1831 1832<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1833<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1834 1835Example matches @catch 1836 @try {} 1837 @catch (...) {} 1838</pre></td></tr> 1839 1840 1841<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1842<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1843 1844Example matches @finally 1845 @try {} 1846 @finally {} 1847</pre></td></tr> 1848 1849 1850<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr> 1851<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1852 1853Example: matches "a" in "init" method: 1854@implementation A { 1855 NSString *a; 1856} 1857- (void) init { 1858 a = @"hello"; 1859} 1860</pre></td></tr> 1861 1862 1863<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1864<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1865 1866The innermost message send invokes the "alloc" class method on the 1867NSString class, while the outermost message send invokes the 1868"initWithString" instance method on the object returned from 1869NSString's "alloc". This matcher should match both message sends. 1870 [[NSString alloc] initWithString:@"Hello"] 1871</pre></td></tr> 1872 1873 1874<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 1875<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1876 1877Example matches @throw obj; 1878</pre></td></tr> 1879 1880 1881<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 1882<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1883 1884Example matches @try 1885 @try {} 1886 @catch (...) {} 1887</pre></td></tr> 1888 1889 1890<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 1891<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 1892 1893Given 1894 1895 #pragma omp parallel 1896 #pragma omp parallel default(none) 1897 #pragma omp taskyield 1898 1899``ompExecutableDirective()`` matches ``omp parallel``, 1900``omp parallel default(none)`` and ``omp taskyield``. 1901</pre></td></tr> 1902 1903 1904<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1905<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1906to reference another expressions and can be met 1907in BinaryConditionalOperators, for example. 1908 1909Example matches 'a' 1910 (a ?: c) + 42; 1911</pre></td></tr> 1912 1913 1914<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 1915<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1916 1917Example matches (foo() + 1) 1918 int foo() { return 1; } 1919 int a = (foo() + 1); 1920</pre></td></tr> 1921 1922 1923<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 1924<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1925ParenListExprs don't have a predefined type and are used for late parsing. 1926In the final AST, they can be met in template declarations. 1927 1928Given 1929 template<typename T> class X { 1930 void f() { 1931 X x(*this); 1932 int a = 0, b = 1; int i = (a, b); 1933 } 1934 }; 1935parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1936has a predefined type and is a ParenExpr, not a ParenListExpr. 1937</pre></td></tr> 1938 1939 1940<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 1941<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1942 1943Example: Matches __func__ 1944 printf("%s", __func__); 1945</pre></td></tr> 1946 1947 1948<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 1949<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1950 1951Given 1952 return 1; 1953returnStmt() 1954 matches 'return 1' 1955</pre></td></tr> 1956 1957 1958<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 1959<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1960 1961Given 1962 { ++a; } 1963stmt() 1964 matches both the compound statement '{ ++a; }' and '++a'. 1965</pre></td></tr> 1966 1967 1968<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 1969<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1970 1971Example match: ({ int X = 4; X; }) 1972 int C = ({ int X = 4; X; }); 1973</pre></td></tr> 1974 1975 1976<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 1977<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1978 1979Example matches "abcd", L"abcd" 1980 char *s = "abcd"; 1981 wchar_t *ws = L"abcd"; 1982</pre></td></tr> 1983 1984 1985<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1986<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1987 1988Given 1989 template <int N> 1990 struct A { static const int n = N; }; 1991 struct B : public A<42> {}; 1992substNonTypeTemplateParmExpr() 1993 matches "N" in the right-hand side of "static const int n = N;" 1994</pre></td></tr> 1995 1996 1997<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 1998<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1999 2000Given 2001 switch(a) { case 42: break; default: break; } 2002switchCase() 2003 matches 'case 42:' and 'default:'. 2004</pre></td></tr> 2005 2006 2007<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 2008<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2009 2010Given 2011 switch(a) { case 42: break; default: break; } 2012switchStmt() 2013 matches 'switch(a)'. 2014</pre></td></tr> 2015 2016 2017<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 2018<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2019 2020Given 2021 Foo x = bar; 2022 int y = sizeof(x) + alignof(x); 2023unaryExprOrTypeTraitExpr() 2024 matches sizeof(x) and alignof(x) 2025</pre></td></tr> 2026 2027 2028<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 2029<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2030 2031Example matches !a 2032 !a || b 2033</pre></td></tr> 2034 2035 2036<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 2037<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2038but could not be resolved to a specific declaration. 2039 2040Given 2041 template<typename T> 2042 T foo() { T a; return a; } 2043 template<typename T> 2044 void bar() { 2045 foo<T>(); 2046 } 2047unresolvedLookupExpr() 2048 matches foo<T>() </pre></td></tr> 2049 2050 2051<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 2052<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2053 2054Given 2055 struct X { 2056 template <class T> void f(); 2057 void g(); 2058 }; 2059 template <class T> void h() { X x; x.f<T>(); x.g(); } 2060unresolvedMemberExpr() 2061 matches x.f<T> 2062</pre></td></tr> 2063 2064 2065<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 2066<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2067 2068Example match: "foo"_suffix 2069</pre></td></tr> 2070 2071 2072<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 2073<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2074 2075Given 2076 while (true) {} 2077whileStmt() 2078 matches 'while (true) {}'. 2079</pre></td></tr> 2080 2081 2082<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr> 2083<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2084 2085Given 2086 template <typename T> struct C {}; 2087 C<int> c; 2088templateArgumentLoc() 2089 matches 'int' in C<int>. 2090</pre></td></tr> 2091 2092 2093<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 2094<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2095 2096Given 2097 template <typename T> struct C {}; 2098 C<int> c; 2099templateArgument() 2100 matches 'int' in C<int>. 2101</pre></td></tr> 2102 2103 2104<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 2105<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2106 2107Given 2108 template <typename T> class X { }; 2109 X<int> xi; 2110templateName() 2111 matches 'X' in X<int>. 2112</pre></td></tr> 2113 2114 2115<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 2116<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2117</pre></td></tr> 2118 2119 2120<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 2121<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2122 2123Given 2124 int a[] = { 2, 3 }; 2125 int b[4]; 2126 void f() { int c[a[0]]; } 2127arrayType() 2128 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2129</pre></td></tr> 2130 2131 2132<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 2133<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2134 2135Given 2136 _Atomic(int) i; 2137atomicType() 2138 matches "_Atomic(int) i" 2139</pre></td></tr> 2140 2141 2142<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 2143<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2144 2145Given: 2146 auto n = 4; 2147 int v[] = { 2, 3 } 2148 for (auto i : v) { } 2149autoType() 2150 matches "auto n" and "auto i" 2151</pre></td></tr> 2152 2153 2154<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 2155<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2156"void (^)(int)". 2157 2158The pointee is always required to be a FunctionType. 2159</pre></td></tr> 2160 2161 2162<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 2163<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2164 2165Given 2166 struct A {}; 2167 A a; 2168 int b; 2169 float c; 2170 bool d; 2171builtinType() 2172 matches "int b", "float c" and "bool d" 2173</pre></td></tr> 2174 2175 2176<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 2177<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2178 2179Given 2180 _Complex float f; 2181complexType() 2182 matches "_Complex float f" 2183</pre></td></tr> 2184 2185 2186<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 2187<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2188 2189Given 2190 void() { 2191 int a[2]; 2192 int b[] = { 2, 3 }; 2193 int c[b[0]]; 2194 } 2195constantArrayType() 2196 matches "int a[2]" 2197</pre></td></tr> 2198 2199 2200<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 2201<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2202Example matches i[] in declaration of f. 2203 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2204Example matches i[1]. 2205 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2206 void f(int i[]) { 2207 i[1] = 0; 2208 } 2209</pre></td></tr> 2210 2211 2212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr> 2213<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2214 2215Given: 2216 short i = 1; 2217 int j = 42; 2218 decltype(i + j) result = i + j; 2219decltypeType() 2220 matches "decltype(i + j)" 2221</pre></td></tr> 2222 2223 2224<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 2225<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2226template types. 2227 2228Given 2229 template <typename T> 2230 class C { public: C(T); }; 2231 2232 C c(123); 2233deducedTemplateSpecializationType() matches the type in the declaration 2234of the variable c. 2235</pre></td></tr> 2236 2237 2238<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 2239<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2240 2241Given 2242 template<typename T, int Size> 2243 class array { 2244 T data[Size]; 2245 }; 2246dependentSizedArrayType 2247 matches "T data[Size]" 2248</pre></td></tr> 2249 2250 2251<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 2252<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2253qualified name. 2254 2255Given 2256 namespace N { 2257 namespace M { 2258 class D {}; 2259 } 2260 } 2261 class C {}; 2262 2263 class C c; 2264 N::M::D d; 2265 2266elaboratedType() matches the type of the variable declarations of both 2267c and d. 2268</pre></td></tr> 2269 2270 2271<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 2272<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2273 2274Given 2275 enum C { Green }; 2276 enum class S { Red }; 2277 2278 C c; 2279 S s; 2280 2281enumType() matches the type of the variable declarations of both c and 2282s. 2283</pre></td></tr> 2284 2285 2286<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 2287<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2288 2289Given 2290 int (*f)(int); 2291 void g(); 2292functionProtoType() 2293 matches "int (*f)(int)" and the type of "g" in C++ mode. 2294 In C mode, "g" is not matched because it does not contain a prototype. 2295</pre></td></tr> 2296 2297 2298<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 2299<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2300 2301Given 2302 int (*f)(int); 2303 void g(); 2304functionType() 2305 matches "int (*f)(int)" and the type of "g". 2306</pre></td></tr> 2307 2308 2309<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 2310<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2311 2312Given 2313 int a[] = { 2, 3 }; 2314 int b[42]; 2315 void f(int c[]) { int d[a[0]]; }; 2316incompleteArrayType() 2317 matches "int a[]" and "int c[]" 2318</pre></td></tr> 2319 2320 2321<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 2322<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2323 2324Example matches S s, but not S<T> s. 2325 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2326 template <typename T> struct S { 2327 void f(S s); 2328 void g(S<T> s); 2329 }; 2330</pre></td></tr> 2331 2332 2333<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 2334<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2335 2336Given: 2337 int *a; 2338 int &b = *a; 2339 int &&c = 1; 2340 auto &d = b; 2341 auto &&e = c; 2342 auto &&f = 2; 2343 int g = 5; 2344 2345lValueReferenceType() matches the types of b, d, and e. e is 2346matched since the type is deduced as int& by reference collapsing rules. 2347</pre></td></tr> 2348 2349 2350<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 2351<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2352Given 2353 struct A { int i; } 2354 A::* ptr = A::i; 2355memberPointerType() 2356 matches "A::* ptr" 2357</pre></td></tr> 2358 2359 2360<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 2361<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2362a pointer type, despite being syntactically similar. 2363 2364Given 2365 int *a; 2366 2367 @interface Foo 2368 @end 2369 Foo *f; 2370pointerType() 2371 matches "Foo *f", but does not match "int *a". 2372</pre></td></tr> 2373 2374 2375<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 2376<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2377 2378Given 2379 int (*ptr_to_array)[4]; 2380 int *array_of_ptrs[4]; 2381 2382varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2383array_of_ptrs. 2384</pre></td></tr> 2385 2386 2387<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 2388<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2389types. 2390 2391Given 2392 int *a; 2393 int &b = *a; 2394 int c = 5; 2395 2396 @interface Foo 2397 @end 2398 Foo *f; 2399pointerType() 2400 matches "int *a", but does not match "Foo *f". 2401</pre></td></tr> 2402 2403 2404<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 2405<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2406 2407Given: 2408 int *a; 2409 int &b = *a; 2410 int &&c = 1; 2411 auto &d = b; 2412 auto &&e = c; 2413 auto &&f = 2; 2414 int g = 5; 2415 2416rValueReferenceType() matches the types of c and f. e is not 2417matched as it is deduced to int& by reference collapsing rules. 2418</pre></td></tr> 2419 2420 2421<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 2422<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2423 2424Given 2425 class C {}; 2426 struct S {}; 2427 2428 C c; 2429 S s; 2430 2431recordType() matches the type of the variable declarations of both c 2432and s. 2433</pre></td></tr> 2434 2435 2436<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2437<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2438 2439Given 2440 int *a; 2441 int &b = *a; 2442 int &&c = 1; 2443 auto &d = b; 2444 auto &&e = c; 2445 auto &&f = 2; 2446 int g = 5; 2447 2448referenceType() matches the types of b, c, d, e, and f. 2449</pre></td></tr> 2450 2451 2452<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2453<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2454template type parameter. 2455 2456Given 2457 template <typename T> 2458 void F(T t) { 2459 int i = 1 + t; 2460 } 2461 2462substTemplateTypeParmType() matches the type of 't' but not '1' 2463</pre></td></tr> 2464 2465 2466<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 2467<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2468 2469Given 2470 enum E {}; 2471 class C {}; 2472 2473 E e; 2474 C c; 2475 2476tagType() matches the type of the variable declarations of both e 2477and c. 2478</pre></td></tr> 2479 2480 2481<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2482<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2483 2484Given 2485 template <typename T> 2486 class C { }; 2487 2488 template class C<int>; // A 2489 C<char> var; // B 2490 2491templateSpecializationType() matches the type of the explicit 2492instantiation in A and the type of the variable declaration in B. 2493</pre></td></tr> 2494 2495 2496<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2497<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2498 2499Example matches T, but not int. 2500 (matcher = templateTypeParmType()) 2501 template <typename T> void f(int i); 2502</pre></td></tr> 2503 2504 2505<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2506<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2507</pre></td></tr> 2508 2509 2510<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 2511<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2512 2513Given 2514 typedef int X; 2515typedefType() 2516 matches "typedef int X" 2517</pre></td></tr> 2518 2519 2520<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2521<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2522 2523Given: 2524 typedef __underlying_type(T) type; 2525unaryTransformType() 2526 matches "__underlying_type(T)" 2527</pre></td></tr> 2528 2529 2530<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2531<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2532integer-constant-expression. 2533 2534Given 2535 void f() { 2536 int a[] = { 2, 3 } 2537 int b[42]; 2538 int c[a[0]]; 2539 } 2540variableArrayType() 2541 matches "int c[a[0]]" 2542</pre></td></tr> 2543 2544<!--END_DECL_MATCHERS --> 2545</table> 2546 2547<!-- ======================================================================= --> 2548<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2549<!-- ======================================================================= --> 2550 2551<p>Narrowing matchers match certain attributes on the current node, thus 2552narrowing down the set of nodes of the current type to match on.</p> 2553 2554<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2555which allow users to create more powerful match expressions.</p> 2556 2557<table> 2558<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2559<!-- START_NARROWING_MATCHERS --> 2560 2561<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2562<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2563 2564Usable as: Any Matcher 2565</pre></td></tr> 2566 2567 2568<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2569<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2570 2571Usable as: Any Matcher 2572</pre></td></tr> 2573 2574 2575<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2576<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2577 2578Useful when another matcher requires a child matcher, but there's no 2579additional constraint. This will often be used with an explicit conversion 2580to an internal::Matcher<> type such as TypeMatcher. 2581 2582Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2583"int* p" and "void f()" in 2584 int* p; 2585 void f(); 2586 2587Usable as: Any Matcher 2588</pre></td></tr> 2589 2590 2591<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2592<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2593 2594Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2595 class X {}; 2596 class Y {}; 2597 2598Usable as: Any Matcher 2599</pre></td></tr> 2600 2601 2602<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2603<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2604specified names. 2605 2606 hasAnyOperatorName("+", "-") 2607 Is equivalent to 2608 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2609</pre></td></tr> 2610 2611 2612<tr><td>Matcher<<a href="https://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> 2613<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2614unary). 2615 2616Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2617 !(a || b) 2618</pre></td></tr> 2619 2620 2621<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr> 2622<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2623 2624Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2625 if (a == b) 2626 a += b; 2627 2628Example 2: matches s1 = s2 2629 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2630 struct S { S& operator=(const S&); }; 2631 void x() { S s1, s2; s1 = s2; } 2632</pre></td></tr> 2633 2634 2635<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr> 2636<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2637 2638Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2639 if (a == b) 2640 a += b; 2641 2642Example 2: matches s1 < s2 2643 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2644 struct S { bool operator<(const S& other); }; 2645 void x(S s1, S s2) { bool b1 = s1 < s2; } 2646</pre></td></tr> 2647 2648 2649<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr> 2650<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2651inheritance. 2652 2653Examples: 2654 class C { 2655 public: int a; 2656 protected: int b; 2657 private: int c; // fieldDecl(isPrivate()) matches 'c' 2658 }; 2659 2660 struct Base {}; 2661 struct Derived1 : private Base {}; // matches 'Base' 2662 class Derived2 : Base {}; // matches 'Base' 2663</pre></td></tr> 2664 2665 2666<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr> 2667<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2668protected inheritance. 2669 2670Examples: 2671 class C { 2672 public: int a; 2673 protected: int b; // fieldDecl(isProtected()) matches 'b' 2674 private: int c; 2675 }; 2676 2677 class Base {}; 2678 class Derived : protected Base {}; // matches 'Base' 2679</pre></td></tr> 2680 2681 2682<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr> 2683<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2684inheritance. 2685 2686Examples: 2687 class C { 2688 public: int a; // fieldDecl(isPublic()) matches 'a' 2689 protected: int b; 2690 private: int c; 2691 }; 2692 2693 class Base {}; 2694 class Derived1 : public Base {}; // matches 'Base' 2695 struct Derived2 : Base {}; // matches 'Base' 2696</pre></td></tr> 2697 2698 2699<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr> 2700<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2701virtual inheritance. 2702 2703Example: 2704 class A { 2705 public: 2706 virtual void x(); // matches x 2707 }; 2708 2709Example: 2710 class Base {}; 2711 class DirectlyDerived : virtual Base {}; // matches Base 2712 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2713 2714Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2715</pre></td></tr> 2716 2717 2718<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> 2719<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2720 2721 2722<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr> 2723<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2724 2725Given 2726 f('false, 3.14, 42); 2727characterLiteral(equals(0)) 2728 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2729 match false 2730floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2731 match 3.14 2732integerLiteral(equals(42)) 2733 matches 42 2734 2735Note that you cannot directly match a negative numeric literal because the 2736minus sign is not part of the literal: It is a unary operator whose operand 2737is the positive numeric literal. Instead, you must use a unaryOperator() 2738matcher to match the minus sign: 2739 2740unaryOperator(hasOperatorName("-"), 2741 hasUnaryOperand(integerLiteral(equals(13)))) 2742 2743Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2744 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2745</pre></td></tr> 2746 2747 2748<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr> 2749<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2750 2751 2752<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr> 2753<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2754 2755 2756<tr><td>Matcher<<a href="https://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> 2757<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2758 2759Given 2760 try { 2761 // ... 2762 } catch (int) { 2763 // ... 2764 } catch (...) { 2765 // ... 2766 } 2767cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2768</pre></td></tr> 2769 2770 2771<tr><td>Matcher<<a href="https://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> 2772<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2773a specific number of arguments (including absent default arguments). 2774 2775Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2776 void f(int x, int y); 2777 f(0, 0); 2778</pre></td></tr> 2779 2780 2781<tr><td>Matcher<<a href="https://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> 2782<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2783</pre></td></tr> 2784 2785 2786<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 2787<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2788zero initialization. 2789 2790Given 2791void foo() { 2792 struct point { double x; double y; }; 2793 point pt[2] = { { 1.0, 2.0 } }; 2794} 2795initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2796will match the implicit array filler for pt[1]. 2797</pre></td></tr> 2798 2799 2800<tr><td>Matcher<<a href="https://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> 2801<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2802 2803Given 2804 struct S { 2805 S(); // #1 2806 S(const S &); // #2 2807 S(S &&); // #3 2808 }; 2809cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2810</pre></td></tr> 2811 2812 2813<tr><td>Matcher<<a href="https://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> 2814<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2815 2816Given 2817 struct S { 2818 S(); // #1 2819 S(const S &); // #2 2820 S(S &&); // #3 2821 }; 2822cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2823</pre></td></tr> 2824 2825 2826<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 2827<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2828 2829Given 2830 struct S { 2831 S(); // #1 2832 S(int) {} // #2 2833 S(S &&) : S() {} // #3 2834 }; 2835 S::S() : S(0) {} // #4 2836cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2837#1 or #2. 2838</pre></td></tr> 2839 2840 2841<tr><td>Matcher<<a href="https://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> 2842<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2843that have an explicit specifier if this explicit specifier is resolved to 2844true. 2845 2846Given 2847 template<bool b> 2848 struct S { 2849 S(int); // #1 2850 explicit S(double); // #2 2851 operator int(); // #3 2852 explicit operator bool(); // #4 2853 explicit(false) S(bool) // # 7 2854 explicit(true) S(char) // # 8 2855 explicit(b) S(S) // # 9 2856 }; 2857 S(int) -> S<true> // #5 2858 explicit S(double) -> S<false> // #6 2859cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2860cxxConversionDecl(isExplicit()) will match #4, but not #3. 2861cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2862</pre></td></tr> 2863 2864 2865<tr><td>Matcher<<a href="https://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> 2866<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2867 2868Given 2869 struct S { 2870 S(); // #1 2871 S(const S &); // #2 2872 S(S &&); // #3 2873 }; 2874cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2875</pre></td></tr> 2876 2877 2878<tr><td>Matcher<<a href="https://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> 2879<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 2880that have an explicit specifier if this explicit specifier is resolved to 2881true. 2882 2883Given 2884 template<bool b> 2885 struct S { 2886 S(int); // #1 2887 explicit S(double); // #2 2888 operator int(); // #3 2889 explicit operator bool(); // #4 2890 explicit(false) S(bool) // # 7 2891 explicit(true) S(char) // # 8 2892 explicit(b) S(S) // # 9 2893 }; 2894 S(int) -> S<true> // #5 2895 explicit S(double) -> S<false> // #6 2896cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2897cxxConversionDecl(isExplicit()) will match #4, but not #3. 2898cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2899</pre></td></tr> 2900 2901 2902<tr><td>Matcher<<a href="https://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> 2903<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2904opposed to a member. 2905 2906Given 2907 struct B {}; 2908 struct D : B { 2909 int I; 2910 D(int i) : I(i) {} 2911 }; 2912 struct E : B { 2913 E() : B() {} 2914 }; 2915cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 2916 will match E(), but not match D(int). 2917</pre></td></tr> 2918 2919 2920<tr><td>Matcher<<a href="https://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> 2921<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 2922opposed to a base. 2923 2924Given 2925 struct B {}; 2926 struct D : B { 2927 int I; 2928 D(int i) : I(i) {} 2929 }; 2930 struct E : B { 2931 E() : B() {} 2932 }; 2933cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 2934 will match D(int), but not match E(). 2935</pre></td></tr> 2936 2937 2938<tr><td>Matcher<<a href="https://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> 2939<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 2940code (as opposed to implicitly added by the compiler). 2941 2942Given 2943 struct Foo { 2944 Foo() { } 2945 Foo(int) : foo_("A") { } 2946 string foo_; 2947 }; 2948cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 2949 will match Foo(int), but not Foo() 2950</pre></td></tr> 2951 2952 2953<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr> 2954<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 2955that have an explicit specifier if this explicit specifier is resolved to 2956true. 2957 2958Given 2959 template<bool b> 2960 struct S { 2961 S(int); // #1 2962 explicit S(double); // #2 2963 operator int(); // #3 2964 explicit operator bool(); // #4 2965 explicit(false) S(bool) // # 7 2966 explicit(true) S(char) // # 8 2967 explicit(b) S(S) // # 9 2968 }; 2969 S(int) -> S<true> // #5 2970 explicit S(double) -> S<false> // #6 2971cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2972cxxConversionDecl(isExplicit()) will match #4, but not #3. 2973cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2974</pre></td></tr> 2975 2976 2977<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr> 2978<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names 2979 2980In template declarations, dependent members are not resolved and so can 2981not be matched to particular named declarations. 2982 2983This matcher allows to match on the known name of members. 2984 2985Given 2986 template <typename T> 2987 struct S { 2988 void mem(); 2989 }; 2990 template <typename T> 2991 void x() { 2992 S<T> s; 2993 s.mem(); 2994 } 2995cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 2996</pre></td></tr> 2997 2998 2999<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr> 3000<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3001to '.'. 3002 3003Member calls on the implicit this pointer match as called with '->'. 3004 3005Given 3006 class Y { 3007 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3008 template <class T> void f() { this->f<T>(); f<T>(); } 3009 int a; 3010 static int b; 3011 }; 3012 template <class T> 3013 class Z { 3014 void x() { this->m; } 3015 }; 3016memberExpr(isArrow()) 3017 matches this->x, x, y.x, a, this->b 3018cxxDependentScopeMemberExpr(isArrow()) 3019 matches this->m 3020unresolvedMemberExpr(isArrow()) 3021 matches this->f<T>, f<T> 3022</pre></td></tr> 3023 3024 3025<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr> 3026<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3027node 3028 3029In template declarations, dependent members are not resolved and so can 3030not be matched to particular named declarations. 3031 3032This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3033and CXXMethodDecl nodes. 3034 3035Given 3036 template <typename T> 3037 struct S { 3038 void mem(); 3039 }; 3040 template <typename T> 3041 void x() { 3042 S<T> s; 3043 s.mem(); 3044 } 3045The matcher 3046@code 3047cxxDependentScopeMemberExpr( 3048 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3049 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3050 cxxMethodDecl(hasName("mem")).bind("templMem") 3051 ))))) 3052 )))), 3053 memberHasSameNameAsBoundNode("templMem") 3054 ) 3055@endcode 3056first matches and binds the @c mem member of the @c S template, then 3057compares its name to the usage in @c s.mem() in the @c x function template 3058</pre></td></tr> 3059 3060 3061<tr><td>Matcher<<a href="https://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> 3062<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3063 3064Given 3065struct A { 3066 void foo() const; 3067 void bar(); 3068}; 3069 3070cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3071</pre></td></tr> 3072 3073 3074<tr><td>Matcher<<a href="https://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> 3075<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3076operator. 3077 3078Given 3079struct A { 3080 A &operator=(const A &); 3081 A &operator=(A &&); 3082}; 3083 3084cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3085the second one. 3086</pre></td></tr> 3087 3088 3089<tr><td>Matcher<<a href="https://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> 3090<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3091 3092Given: 3093 class A final {}; 3094 3095 struct B { 3096 virtual void f(); 3097 }; 3098 3099 struct C : B { 3100 void f() final; 3101 }; 3102matches A and C::f, but not B, C, or B::f 3103</pre></td></tr> 3104 3105 3106<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 3107<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3108operator. 3109 3110Given 3111struct A { 3112 A &operator=(const A &); 3113 A &operator=(A &&); 3114}; 3115 3116cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3117the first one. 3118</pre></td></tr> 3119 3120 3121<tr><td>Matcher<<a href="https://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> 3122<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3123 3124Given 3125 class A { 3126 public: 3127 virtual void x(); 3128 }; 3129 class B : public A { 3130 public: 3131 virtual void x(); 3132 }; 3133 matches B::x 3134</pre></td></tr> 3135 3136 3137<tr><td>Matcher<<a href="https://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> 3138<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3139 3140Given 3141 class A { 3142 public: 3143 virtual void x() = 0; 3144 }; 3145 matches A::x 3146</pre></td></tr> 3147 3148 3149<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 3150<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3151 3152Given 3153 struct S { 3154 S(); // #1 3155 S(const S &) = default; // #2 3156 S(S &&) = delete; // #3 3157 }; 3158cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3159</pre></td></tr> 3160 3161 3162<tr><td>Matcher<<a href="https://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> 3163<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3164virtual inheritance. 3165 3166Example: 3167 class A { 3168 public: 3169 virtual void x(); // matches x 3170 }; 3171 3172Example: 3173 class Base {}; 3174 class DirectlyDerived : virtual Base {}; // matches Base 3175 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3176 3177Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 3178</pre></td></tr> 3179 3180 3181<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 3182<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3183 3184Given 3185 class A { 3186 public: 3187 virtual void x(); 3188 }; 3189 class B : public A { 3190 public: 3191 void x(); 3192 }; 3193 matches A::x but not B::x 3194</pre></td></tr> 3195 3196 3197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr> 3198<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3199 3200Given: 3201 MyClass *p1 = new MyClass[10]; 3202cxxNewExpr(isArray()) 3203 matches the expression 'new MyClass[10]'. 3204</pre></td></tr> 3205 3206 3207<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3208<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3209 3210Matches overloaded operator names specified in strings without the 3211"operator" prefix: e.g. "<<". 3212 3213 hasAnyOverloadedOperatorName("+", "-") 3214Is equivalent to 3215 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3216</pre></td></tr> 3217 3218 3219<tr><td>Matcher<<a href="https://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> 3220<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3221 3222Matches overloaded operator names specified in strings without the 3223"operator" prefix: e.g. "<<". 3224 3225Given: 3226 class A { int operator*(); }; 3227 const A &operator<<(const A &a, const A &b); 3228 A a; 3229 a << a; // <-- This matches 3230 3231cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3232specified line and 3233cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3234matches the declaration of A. 3235 3236Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3237</pre></td></tr> 3238 3239 3240<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr> 3241<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3242 3243Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3244 if (a == b) 3245 a += b; 3246 3247Example 2: matches s1 = s2 3248 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3249 struct S { S& operator=(const S&); }; 3250 void x() { S s1, s2; s1 = s2; } 3251</pre></td></tr> 3252 3253 3254<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr> 3255<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3256 3257Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3258 if (a == b) 3259 a += b; 3260 3261Example 2: matches s1 < s2 3262 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3263 struct S { bool operator<(const S& other); }; 3264 void x(S s1, S s2) { bool b1 = s1 < s2; } 3265</pre></td></tr> 3266 3267 3268<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> 3269<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3270 3271Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3272class x {}; 3273class y; 3274</pre></td></tr> 3275 3276 3277<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 3278<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3279</pre></td></tr> 3280 3281 3282<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 3283<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3284</pre></td></tr> 3285 3286 3287<tr><td>Matcher<<a href="https://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> 3288<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3289static member variable template instantiations. 3290 3291Given 3292 template<typename T> void A(T t) { } 3293 template<> void A(int N) { } 3294functionDecl(isExplicitTemplateSpecialization()) 3295 matches the specialization A<int>(). 3296 3297Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3298</pre></td></tr> 3299 3300 3301<tr><td>Matcher<<a href="https://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> 3302<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3303 3304Given: 3305 class A final {}; 3306 3307 struct B { 3308 virtual void f(); 3309 }; 3310 3311 struct C : B { 3312 void f() final; 3313 }; 3314matches A and C::f, but not B, C, or B::f 3315</pre></td></tr> 3316 3317 3318<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 3319<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3320 3321Given: 3322 auto x = []{}; 3323 3324cxxRecordDecl(isLambda()) matches the implicit class declaration of 3325decltype(x) 3326</pre></td></tr> 3327 3328 3329<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 3330<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3331isSameOrDerivedFrom(hasName(...)). 3332</pre></td></tr> 3333 3334 3335<tr><td>Matcher<<a href="https://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> 3336<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3337member variable template instantiations. 3338 3339Given 3340 template <typename T> class X {}; class A {}; X<A> x; 3341or 3342 template <typename T> class X {}; class A {}; template class X<A>; 3343or 3344 template <typename T> class X {}; class A {}; extern template class X<A>; 3345cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3346 matches the template instantiation of X<A>. 3347 3348But given 3349 template <typename T> class X {}; class A {}; 3350 template <> class X<A> {}; X<A> x; 3351cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3352 does not match, as X<A> is an explicit template specialization. 3353 3354Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3355</pre></td></tr> 3356 3357 3358<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 3359<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3360a specific number of arguments (including absent default arguments). 3361 3362Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3363 void f(int x, int y); 3364 f(0, 0); 3365</pre></td></tr> 3366 3367 3368<tr><td>Matcher<<a href="https://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> 3369<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3370a specific number of arguments (including absent default arguments). 3371 3372Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3373 void f(int x, int y); 3374 f(0, 0); 3375</pre></td></tr> 3376 3377 3378<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr> 3379<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3380 3381Example matches y(x) but not y(42) or NS::y(x). 3382 namespace NS { 3383 struct X {}; 3384 void y(X); 3385 } 3386 3387 void y(...); 3388 3389 void test() { 3390 NS::X x; 3391 y(x); // Matches 3392 NS::y(x); // Doesn't match 3393 y(42); // Doesn't match 3394 using NS::y; 3395 y(x); // Found by both unqualified lookup and ADL, doesn't match 3396 } 3397</pre></td></tr> 3398 3399 3400<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 3401<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3402 3403Example: matches the implicit cast around 0 3404(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3405 int *p = 0; 3406 3407If the matcher is use from clang-query, CastKind parameter 3408should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3409</pre></td></tr> 3410 3411 3412<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr> 3413<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3414 3415 3416<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr> 3417<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3418 3419Given 3420 f('false, 3.14, 42); 3421characterLiteral(equals(0)) 3422 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3423 match false 3424floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3425 match 3.14 3426integerLiteral(equals(42)) 3427 matches 42 3428 3429Note that you cannot directly match a negative numeric literal because the 3430minus sign is not part of the literal: It is a unary operator whose operand 3431is the positive numeric literal. Instead, you must use a unaryOperator() 3432matcher to match the minus sign: 3433 3434unaryOperator(hasOperatorName("-"), 3435 hasUnaryOperand(integerLiteral(equals(13)))) 3436 3437Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3438 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 3439</pre></td></tr> 3440 3441 3442<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr> 3443<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3444 3445 3446<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr> 3447<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3448 3449 3450<tr><td>Matcher<<a href="https://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> 3451<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3452 3453Given 3454 template<typename T> struct C {}; 3455 C<int> c; 3456classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3457 matches C<int>. 3458</pre></td></tr> 3459 3460 3461<tr><td>Matcher<<a href="https://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> 3462<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3463child statements. 3464 3465Example: Given 3466 { for (;;) {} } 3467compoundStmt(statementCountIs(0))) 3468 matches '{}' 3469 but does not match the outer compound statement. 3470</pre></td></tr> 3471 3472 3473<tr><td>Matcher<<a href="https://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> 3474<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3475 3476Given 3477 int a[42]; 3478 int b[2 * 21]; 3479 int c[41], d[43]; 3480 char *s = "abcd"; 3481 wchar_t *ws = L"abcd"; 3482 char *w = "a"; 3483constantArrayType(hasSize(42)) 3484 matches "int a[42]" and "int b[2 * 21]" 3485stringLiteral(hasSize(4)) 3486 matches "abcd", L"abcd" 3487</pre></td></tr> 3488 3489 3490<tr><td>Matcher<<a href="https://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> 3491<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3492declarations. 3493 3494Example: Given 3495 int a, b; 3496 int c; 3497 int d = 2, e; 3498declCountIs(2) 3499 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3500</pre></td></tr> 3501 3502 3503<tr><td>Matcher<<a href="https://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> 3504<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3505 3506Matches a node if it equals the node previously bound to ID. 3507 3508Given 3509 class X { int a; int b; }; 3510cxxRecordDecl( 3511 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3512 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3513 matches the class X, as a and b have the same type. 3514 3515Note that when multiple matches are involved via forEach* matchers, 3516equalsBoundNodes acts as a filter. 3517For example: 3518compoundStmt( 3519 forEachDescendant(varDecl().bind("d")), 3520 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3521will trigger a match for each combination of variable declaration 3522and reference to that variable declaration within a compound statement. 3523</pre></td></tr> 3524 3525 3526<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 3527<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3528 3529Decl has pointer identity in the AST. 3530</pre></td></tr> 3531 3532 3533<tr><td>Matcher<<a href="https://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> 3534<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3535 3536Given 3537 __attribute__((device)) void f() { ... } 3538decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3539f. If the matcher is used from clang-query, attr::Kind parameter should be 3540passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3541</pre></td></tr> 3542 3543 3544<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 3545<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3546Does not match if only part of the statement is expanded from that macro or 3547if different parts of the the statement are expanded from different 3548appearances of the macro. 3549</pre></td></tr> 3550 3551 3552<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3553<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3554partially matching a given regex. 3555 3556Example matches Y but not X 3557 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3558 #include "ASTMatcher.h" 3559 class X {}; 3560ASTMatcher.h: 3561 class Y {}; 3562 3563Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3564 3565If the matcher is used in clang-query, RegexFlags parameter 3566should be passed as a quoted string. e.g: "NoFlags". 3567Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3568</pre></td></tr> 3569 3570 3571<tr><td>Matcher<<a href="https://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> 3572<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3573 3574Example matches X but not Y 3575 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3576 #include <Y.h> 3577 class X {}; 3578Y.h: 3579 class Y {}; 3580 3581Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3582</pre></td></tr> 3583 3584 3585<tr><td>Matcher<<a href="https://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> 3586<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3587 3588Example matches Y but not X 3589 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3590 #include <SystemHeader.h> 3591 class X {}; 3592SystemHeader.h: 3593 class Y {}; 3594 3595Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3596</pre></td></tr> 3597 3598 3599<tr><td>Matcher<<a href="https://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> 3600<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3601by the compiler (eg. implicit default/copy constructors). 3602</pre></td></tr> 3603 3604 3605<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr> 3606<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3607 3608Given 3609 class vector {}; 3610 namespace foo { 3611 class vector {}; 3612 namespace std { 3613 class vector {}; 3614 } 3615 } 3616 namespace std { 3617 inline namespace __1 { 3618 class vector {}; // #1 3619 namespace experimental { 3620 class vector {}; 3621 } 3622 } 3623 } 3624cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3625</pre></td></tr> 3626 3627 3628<tr><td>Matcher<<a href="https://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> 3629<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3630template instantiations. 3631 3632Given 3633 template<typename T> void A(T t) { T i; } 3634 A(0); 3635 A(0U); 3636functionDecl(isInstantiated()) 3637 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3638</pre></td></tr> 3639 3640 3641<tr><td>Matcher<<a href="https://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> 3642<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3643inheritance. 3644 3645Examples: 3646 class C { 3647 public: int a; 3648 protected: int b; 3649 private: int c; // fieldDecl(isPrivate()) matches 'c' 3650 }; 3651 3652 struct Base {}; 3653 struct Derived1 : private Base {}; // matches 'Base' 3654 class Derived2 : Base {}; // matches 'Base' 3655</pre></td></tr> 3656 3657 3658<tr><td>Matcher<<a href="https://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> 3659<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3660protected inheritance. 3661 3662Examples: 3663 class C { 3664 public: int a; 3665 protected: int b; // fieldDecl(isProtected()) matches 'b' 3666 private: int c; 3667 }; 3668 3669 class Base {}; 3670 class Derived : protected Base {}; // matches 'Base' 3671</pre></td></tr> 3672 3673 3674<tr><td>Matcher<<a href="https://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> 3675<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3676inheritance. 3677 3678Examples: 3679 class C { 3680 public: int a; // fieldDecl(isPublic()) matches 'a' 3681 protected: int b; 3682 private: int c; 3683 }; 3684 3685 class Base {}; 3686 class Derived1 : public Base {}; // matches 'Base' 3687 struct Derived2 : Base {}; // matches 'Base' 3688</pre></td></tr> 3689 3690 3691<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr> 3692<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3693a specific number of designators. 3694 3695Example: Given 3696 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3697 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3698designatorCountIs(2) 3699 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3700 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3701</pre></td></tr> 3702 3703 3704<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr> 3705<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3706 3707Example matches Y (matcher = enumDecl(isScoped())) 3708enum X {}; 3709enum class Y {}; 3710</pre></td></tr> 3711 3712 3713<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr> 3714<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3715neither type- nor value-dependent. 3716 3717In the following example, the expression sizeof(sizeof(T() + T())) 3718is instantiation-dependent (since it involves a template parameter T), 3719but is neither type- nor value-dependent, since the type of the inner 3720sizeof is known (std::size_t) and therefore the size of the outer 3721sizeof is known. 3722 template<typename T> 3723 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3724expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3725</pre></td></tr> 3726 3727 3728<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> 3729<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3730is not yet instantiated. 3731 3732For example, the expressions "x" and "x + y" are type-dependent in 3733the following code, but "y" is not type-dependent: 3734 template<typename T> 3735 void add(T x, int y) { 3736 x + y; 3737 } 3738expr(isTypeDependent()) matches x + y 3739</pre></td></tr> 3740 3741 3742<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr> 3743<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3744non-type template parameter. 3745 3746For example, the array bound of "Chars" in the following example is 3747value-dependent. 3748 template<int Size> int f() { return Size; } 3749expr(isValueDependent()) matches return Size 3750</pre></td></tr> 3751 3752 3753<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr> 3754<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3755GNU's __null, C++11's nullptr, or C's NULL macro. 3756 3757Given: 3758 void *v1 = NULL; 3759 void *v2 = nullptr; 3760 void *v3 = __null; // GNU extension 3761 char *cp = (char *)0; 3762 int *ip = 0; 3763 int i = 0; 3764expr(nullPointerConstant()) 3765 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3766 initializer for i. 3767</pre></td></tr> 3768 3769 3770<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 3771<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3772bit width. 3773 3774Given 3775 class C { 3776 int a : 2; 3777 int b : 4; 3778 int c : 2; 3779 }; 3780fieldDecl(hasBitWidth(2)) 3781 matches 'int a;' and 'int c;' but not 'int b;'. 3782</pre></td></tr> 3783 3784 3785<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 3786<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3787 3788Given 3789 class C { 3790 int a : 2; 3791 int b; 3792 }; 3793fieldDecl(isBitField()) 3794 matches 'int a;' but not 'int b;'. 3795</pre></td></tr> 3796 3797 3798<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr> 3799<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3800 3801Given 3802 f('false, 3.14, 42); 3803characterLiteral(equals(0)) 3804 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3805 match false 3806floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3807 match 3.14 3808integerLiteral(equals(42)) 3809 matches 42 3810 3811Note that you cannot directly match a negative numeric literal because the 3812minus sign is not part of the literal: It is a unary operator whose operand 3813is the positive numeric literal. Instead, you must use a unaryOperator() 3814matcher to match the minus sign: 3815 3816unaryOperator(hasOperatorName("-"), 3817 hasUnaryOperand(integerLiteral(equals(13)))) 3818 3819Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3820 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 3821</pre></td></tr> 3822 3823 3824<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr> 3825<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3826 3827 3828<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3829<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3830 3831Matches overloaded operator names specified in strings without the 3832"operator" prefix: e.g. "<<". 3833 3834 hasAnyOverloadedOperatorName("+", "-") 3835Is equivalent to 3836 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3837</pre></td></tr> 3838 3839 3840<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 3841<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3842 3843Given: 3844 void f(); 3845 void g() noexcept; 3846 void h() noexcept(true); 3847 void i() noexcept(false); 3848 void j() throw(); 3849 void k() throw(int); 3850 void l() throw(...); 3851functionDecl(hasDynamicExceptionSpec()) and 3852 functionProtoType(hasDynamicExceptionSpec()) 3853 match the declarations of j, k, and l, but not f, g, h, or i. 3854</pre></td></tr> 3855 3856 3857<tr><td>Matcher<<a href="https://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> 3858<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 3859 3860Matches overloaded operator names specified in strings without the 3861"operator" prefix: e.g. "<<". 3862 3863Given: 3864 class A { int operator*(); }; 3865 const A &operator<<(const A &a, const A &b); 3866 A a; 3867 a << a; // <-- This matches 3868 3869cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3870specified line and 3871cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3872matches the declaration of A. 3873 3874Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3875</pre></td></tr> 3876 3877 3878<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr> 3879<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 3880 3881Example matches Y (matcher = functionDecl(hasTrailingReturn())) 3882int X() {} 3883auto Y() -> int {} 3884</pre></td></tr> 3885 3886 3887<tr><td>Matcher<<a href="https://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> 3888<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 3889 and if constexpr. 3890 3891Given: 3892 constexpr int foo = 42; 3893 constexpr int bar(); 3894 void baz() { if constexpr(1 > 0) {} } 3895varDecl(isConstexpr()) 3896 matches the declaration of foo. 3897functionDecl(isConstexpr()) 3898 matches the declaration of bar. 3899ifStmt(isConstexpr()) 3900 matches the if statement in baz. 3901</pre></td></tr> 3902 3903 3904<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 3905<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 3906 3907Given: 3908 class A { ~A(); }; 3909 class B { ~B() = default; }; 3910functionDecl(isDefaulted()) 3911 matches the declaration of ~B, but not ~A. 3912</pre></td></tr> 3913 3914 3915<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr> 3916<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 3917 3918Example matches A, va, fa 3919 class A {}; 3920 class B; // Doesn't match, as it has no body. 3921 int va; 3922 extern int vb; // Doesn't match, as it doesn't define the variable. 3923 void fa() {} 3924 void fb(); // Doesn't match, as it has no body. 3925 @interface X 3926 - (void)ma; // Doesn't match, interface is declaration. 3927 @end 3928 @implementation X 3929 - (void)ma {} 3930 @end 3931 3932Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 3933 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3934</pre></td></tr> 3935 3936 3937<tr><td>Matcher<<a href="https://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> 3938<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 3939 3940Given: 3941 void Func(); 3942 void DeletedFunc() = delete; 3943functionDecl(isDeleted()) 3944 matches the declaration of DeletedFunc, but not Func. 3945</pre></td></tr> 3946 3947 3948<tr><td>Matcher<<a href="https://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> 3949<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 3950static member variable template instantiations. 3951 3952Given 3953 template<typename T> void A(T t) { } 3954 template<> void A(int N) { } 3955functionDecl(isExplicitTemplateSpecialization()) 3956 matches the specialization A<int>(). 3957 3958Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3959</pre></td></tr> 3960 3961 3962<tr><td>Matcher<<a href="https://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> 3963<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 3964 3965Given: 3966 extern "C" void f() {} 3967 extern "C" { void g() {} } 3968 void h() {} 3969 extern "C" int x = 1; 3970 extern "C" int y = 2; 3971 int z = 3; 3972functionDecl(isExternC()) 3973 matches the declaration of f and g, but not the declaration of h. 3974varDecl(isExternC()) 3975 matches the declaration of x and y, but not the declaration of z. 3976</pre></td></tr> 3977 3978 3979<tr><td>Matcher<<a href="https://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> 3980<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 3981the inline keyword. 3982 3983Given 3984 inline void f(); 3985 void g(); 3986 namespace n { 3987 inline namespace m {} 3988 } 3989functionDecl(isInline()) will match ::f(). 3990namespaceDecl(isInline()) will match n::m. 3991</pre></td></tr> 3992 3993 3994<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr> 3995<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 3996into an executable program. 3997</pre></td></tr> 3998 3999 4000<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> 4001<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4002 4003Given 4004 void nope(); 4005 [[noreturn]] void a(); 4006 __attribute__((noreturn)) void b(); 4007 struct c { [[noreturn]] c(); }; 4008functionDecl(isNoReturn()) 4009 matches all of those except 4010 void nope(); 4011</pre></td></tr> 4012 4013 4014<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 4015<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4016 4017Given: 4018 void f(); 4019 void g() noexcept; 4020 void h() throw(); 4021 void i() throw(int); 4022 void j() noexcept(false); 4023functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4024 match the declarations of g, and h, but not f, i or j. 4025</pre></td></tr> 4026 4027 4028<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> 4029<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4030class specifier ("static" keyword) written in the source. 4031 4032Given: 4033 static void f() {} 4034 static int i = 0; 4035 extern int j; 4036 int k; 4037functionDecl(isStaticStorageClass()) 4038 matches the function declaration f. 4039varDecl(isStaticStorageClass()) 4040 matches the variable declaration i. 4041</pre></td></tr> 4042 4043 4044<tr><td>Matcher<<a href="https://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> 4045<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4046member variable template instantiations. 4047 4048Given 4049 template <typename T> class X {}; class A {}; X<A> x; 4050or 4051 template <typename T> class X {}; class A {}; template class X<A>; 4052or 4053 template <typename T> class X {}; class A {}; extern template class X<A>; 4054cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4055 matches the template instantiation of X<A>. 4056 4057But given 4058 template <typename T> class X {}; class A {}; 4059 template <> class X<A> {}; X<A> x; 4060cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4061 does not match, as X<A> is an explicit template specialization. 4062 4063Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 4064</pre></td></tr> 4065 4066 4067<tr><td>Matcher<<a href="https://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> 4068<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4069 4070Example matches f, but not g or h. The function i will not match, even when 4071compiled in C mode. 4072 void f(...); 4073 void g(int); 4074 template <typename... Ts> void h(Ts...); 4075 void i(); 4076</pre></td></tr> 4077 4078 4079<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr> 4080<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4081 4082Given: 4083 void foo() __attribute__((__weakref__("__foo"))); 4084 void bar(); 4085functionDecl(isWeak()) 4086 matches the weak declaration "foo", but not "bar". 4087</pre></td></tr> 4088 4089 4090<tr><td>Matcher<<a href="https://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> 4091<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4092specific parameter count. 4093 4094Given 4095 void f(int i) {} 4096 void g(int i, int j) {} 4097 void h(int i, int j); 4098 void j(int i); 4099 void k(int x, int y, int z, ...); 4100functionDecl(parameterCountIs(2)) 4101 matches g and h 4102functionProtoType(parameterCountIs(2)) 4103 matches g and h 4104functionProtoType(parameterCountIs(3)) 4105 matches k 4106</pre></td></tr> 4107 4108 4109<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 4110<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4111 4112Given: 4113 void f(); 4114 void g() noexcept; 4115 void h() noexcept(true); 4116 void i() noexcept(false); 4117 void j() throw(); 4118 void k() throw(int); 4119 void l() throw(...); 4120functionDecl(hasDynamicExceptionSpec()) and 4121 functionProtoType(hasDynamicExceptionSpec()) 4122 match the declarations of j, k, and l, but not f, g, h, or i. 4123</pre></td></tr> 4124 4125 4126<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 4127<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4128 4129Given: 4130 void f(); 4131 void g() noexcept; 4132 void h() throw(); 4133 void i() throw(int); 4134 void j() noexcept(false); 4135functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4136 match the declarations of g, and h, but not f, i or j. 4137</pre></td></tr> 4138 4139 4140<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4141<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4142specific parameter count. 4143 4144Given 4145 void f(int i) {} 4146 void g(int i, int j) {} 4147 void h(int i, int j); 4148 void j(int i); 4149 void k(int x, int y, int z, ...); 4150functionDecl(parameterCountIs(2)) 4151 matches g and h 4152functionProtoType(parameterCountIs(2)) 4153 matches g and h 4154functionProtoType(parameterCountIs(3)) 4155 matches k 4156</pre></td></tr> 4157 4158 4159<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr> 4160<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4161 and if constexpr. 4162 4163Given: 4164 constexpr int foo = 42; 4165 constexpr int bar(); 4166 void baz() { if constexpr(1 > 0) {} } 4167varDecl(isConstexpr()) 4168 matches the declaration of foo. 4169functionDecl(isConstexpr()) 4170 matches the declaration of bar. 4171ifStmt(isConstexpr()) 4172 matches the if statement in baz. 4173</pre></td></tr> 4174 4175 4176<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr> 4177<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4178 4179 4180<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr> 4181<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4182 4183Given 4184 f('false, 3.14, 42); 4185characterLiteral(equals(0)) 4186 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4187 match false 4188floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4189 match 3.14 4190integerLiteral(equals(42)) 4191 matches 42 4192 4193Note that you cannot directly match a negative numeric literal because the 4194minus sign is not part of the literal: It is a unary operator whose operand 4195is the positive numeric literal. Instead, you must use a unaryOperator() 4196matcher to match the minus sign: 4197 4198unaryOperator(hasOperatorName("-"), 4199 hasUnaryOperand(integerLiteral(equals(13)))) 4200 4201Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 4202 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 4203</pre></td></tr> 4204 4205 4206<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr> 4207<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4208 4209 4210<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr> 4211<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4212 4213 4214<tr><td>Matcher<<a href="https://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> 4215<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4216to '.'. 4217 4218Member calls on the implicit this pointer match as called with '->'. 4219 4220Given 4221 class Y { 4222 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4223 template <class T> void f() { this->f<T>(); f<T>(); } 4224 int a; 4225 static int b; 4226 }; 4227 template <class T> 4228 class Z { 4229 void x() { this->m; } 4230 }; 4231memberExpr(isArrow()) 4232 matches this->x, x, y.x, a, this->b 4233cxxDependentScopeMemberExpr(isArrow()) 4234 matches this->m 4235unresolvedMemberExpr(isArrow()) 4236 matches this->f<T>, f<T> 4237</pre></td></tr> 4238 4239 4240<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr> 4241<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4242 4243This matcher is only provided as a performance optimization of hasName. 4244 hasAnyName(a, b, c) 4245 is equivalent to, but faster than 4246 anyOf(hasName(a), hasName(b), hasName(c)) 4247</pre></td></tr> 4248 4249 4250<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr> 4251<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4252 4253Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4254void f() { 4255 int x; 4256 static int y; 4257} 4258int z; 4259 4260Example matches f() because it has external formal linkage despite being 4261unique to the translation unit as though it has internal likage 4262(matcher = functionDecl(hasExternalFormalLinkage())) 4263 4264namespace { 4265void f() {} 4266} 4267</pre></td></tr> 4268 4269 4270<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr> 4271<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4272 4273Supports specifying enclosing namespaces or classes by prefixing the name 4274with '<enclosing>::'. 4275Does not match typedefs of an underlying type with the given name. 4276 4277Example matches X (Name == "X") 4278 class X; 4279 4280Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4281 namespace a { namespace b { class X; } } 4282</pre></td></tr> 4283 4284 4285<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4286<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4287a substring matched by the given RegExp. 4288 4289Supports specifying enclosing namespaces or classes by 4290prefixing the name with '<enclosing>::'. Does not match typedefs 4291of an underlying type with the given name. 4292 4293Example matches X (regexp == "::X") 4294 class X; 4295 4296Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4297 namespace foo { namespace bar { class X; } } 4298 4299If the matcher is used in clang-query, RegexFlags parameter 4300should be passed as a quoted string. e.g: "NoFlags". 4301Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4302</pre></td></tr> 4303 4304 4305<tr><td>Matcher<<a href="https://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> 4306<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4307 4308Given 4309 namespace n { 4310 namespace {} // #1 4311 } 4312namespaceDecl(isAnonymous()) will match #1 but not ::n. 4313</pre></td></tr> 4314 4315 4316<tr><td>Matcher<<a href="https://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> 4317<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4318the inline keyword. 4319 4320Given 4321 inline void f(); 4322 void g(); 4323 namespace n { 4324 inline namespace m {} 4325 } 4326functionDecl(isInline()) will match ::f(). 4327namespaceDecl(isInline()) will match n::m. 4328</pre></td></tr> 4329 4330 4331<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr> 4332<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4333specified. 4334 4335Given 4336 4337 #pragma omp parallel 4338 #pragma omp parallel default(none) 4339 #pragma omp parallel default(shared) 4340 #pragma omp parallel default(firstprivate) 4341 4342``ompDefaultClause(isFirstPrivateKind())`` matches only 4343``default(firstprivate)``. 4344</pre></td></tr> 4345 4346 4347<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr> 4348<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4349 4350Given 4351 4352 #pragma omp parallel 4353 #pragma omp parallel default(none) 4354 #pragma omp parallel default(shared) 4355 #pragma omp parallel default(firstprivate) 4356 4357``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4358</pre></td></tr> 4359 4360 4361<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr> 4362<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4363 4364Given 4365 4366 #pragma omp parallel 4367 #pragma omp parallel default(none) 4368 #pragma omp parallel default(shared) 4369 #pragma omp parallel default(firstprivate) 4370 4371``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4372</pre></td></tr> 4373 4374 4375<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr> 4376<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4377clause kind. 4378 4379Given 4380 4381 #pragma omp parallel 4382 #pragma omp parallel for 4383 #pragma omp for 4384 4385`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4386``omp parallel`` and ``omp parallel for``. 4387 4388If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4389should be passed as a quoted string. e.g., 4390``isAllowedToContainClauseKind("OMPC_default").`` 4391</pre></td></tr> 4392 4393 4394<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr> 4395<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4396i.e., directives that can't have a structured block. 4397 4398Given 4399 4400 #pragma omp parallel 4401 {} 4402 #pragma omp taskyield 4403 4404``ompExecutableDirective(isStandaloneDirective()))`` matches 4405``omp taskyield``. 4406</pre></td></tr> 4407 4408 4409<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 4410<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4411</pre></td></tr> 4412 4413 4414<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 4415<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4416</pre></td></tr> 4417 4418 4419<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 4420<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4421isSameOrDerivedFrom(hasName(...)). 4422</pre></td></tr> 4423 4424 4425<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 4426<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4427a specific number of arguments (including absent default arguments). 4428 4429Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4430 void f(int x, int y); 4431 f(0, 0); 4432</pre></td></tr> 4433 4434 4435<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr> 4436<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4437Selector.getAsString() 4438 4439 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4440 matches both of the expressions below: 4441 [myObj methodA:argA]; 4442 [myObj methodB:argB]; 4443</pre></td></tr> 4444 4445 4446<tr><td>Matcher<<a href="https://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> 4447<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4448 4449objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4450message expression in 4451 4452 UIWebView *webView = ...; 4453 CGRect bodyFrame = webView.frame; 4454 bodyFrame.size.height = self.bodyContentHeight; 4455 webView.frame = bodyFrame; 4456 // ^---- matches here 4457</pre></td></tr> 4458 4459 4460<tr><td>Matcher<<a href="https://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> 4461<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4462 4463Matches only when the selector of the objCMessageExpr is NULL. This may 4464represent an error condition in the tree! 4465</pre></td></tr> 4466 4467 4468<tr><td>Matcher<<a href="https://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> 4469<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4470 4471 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4472 matches the outer message expr in the code below, but NOT the message 4473 invocation for self.bodyView. 4474 [self.bodyView loadHTMLString:html baseURL:NULL]; 4475</pre></td></tr> 4476 4477 4478<tr><td>Matcher<<a href="https://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> 4479<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4480 4481 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4482 matches self.bodyView in the code below, but NOT the outer message 4483 invocation of "loadHTMLString:baseURL:". 4484 [self.bodyView loadHTMLString:html baseURL:NULL]; 4485</pre></td></tr> 4486 4487 4488<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr> 4489<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4490 4491Example 4492matcher = objcMessageExpr(isClassMessage()) 4493matches 4494 [NSString stringWithFormat:@"format"]; 4495but not 4496 NSString *x = @"hello"; 4497 [x containsString:@"h"]; 4498</pre></td></tr> 4499 4500 4501<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr> 4502<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4503 4504Example 4505matcher = objcMessageExpr(isInstanceMessage()) 4506matches 4507 NSString *x = @"hello"; 4508 [x containsString:@"h"]; 4509but not 4510 [NSString stringWithFormat:@"format"]; 4511</pre></td></tr> 4512 4513 4514<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4515<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4516a substring matched by the given RegExp. 4517 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4518 invocation for self.bodyView. 4519 [self.bodyView loadHTMLString:html baseURL:NULL]; 4520 4521If the matcher is used in clang-query, RegexFlags parameter 4522should be passed as a quoted string. e.g: "NoFlags". 4523Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4524</pre></td></tr> 4525 4526 4527<tr><td>Matcher<<a href="https://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> 4528<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4529 4530 matcher = objCMessageExpr(numSelectorArgs(0)); 4531 matches self.bodyView in the code below 4532 4533 matcher = objCMessageExpr(numSelectorArgs(2)); 4534 matches the invocation of "loadHTMLString:baseURL:" but not that 4535 of self.bodyView 4536 [self.bodyView loadHTMLString:html baseURL:NULL]; 4537</pre></td></tr> 4538 4539 4540<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr> 4541<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4542 4543Example 4544matcher = objcMethodDecl(isClassMethod()) 4545matches 4546@interface I + (void)foo; @end 4547but not 4548@interface I - (void)bar; @end 4549</pre></td></tr> 4550 4551 4552<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 4553<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4554 4555Example matches A, va, fa 4556 class A {}; 4557 class B; // Doesn't match, as it has no body. 4558 int va; 4559 extern int vb; // Doesn't match, as it doesn't define the variable. 4560 void fa() {} 4561 void fb(); // Doesn't match, as it has no body. 4562 @interface X 4563 - (void)ma; // Doesn't match, interface is declaration. 4564 @end 4565 @implementation X 4566 - (void)ma {} 4567 @end 4568 4569Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4570 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4571</pre></td></tr> 4572 4573 4574<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr> 4575<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4576 4577Example 4578matcher = objcMethodDecl(isInstanceMethod()) 4579matches 4580@interface I - (void)bar; @end 4581but not 4582@interface I + (void)foo; @end 4583</pre></td></tr> 4584 4585 4586<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr> 4587<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4588 4589Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4590void x(int val) {} 4591void y(int val = 0) {} 4592 4593Deprecated. Use hasInitializer() instead to be able to 4594match on the contents of the default argument. For example: 4595 4596void x(int val = 7) {} 4597void y(int val = 42) {} 4598parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4599 matches the parameter of y 4600 4601A matcher such as 4602 parmVarDecl(hasInitializer(anything())) 4603is equivalent to parmVarDecl(hasDefaultArgument()). 4604</pre></td></tr> 4605 4606 4607<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr> 4608<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4609list. The parameter list could be that of either a block, function, or 4610objc-method. 4611 4612 4613Given 4614 4615void f(int a, int b, int c) { 4616} 4617 4618``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4619 4620``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4621</pre></td></tr> 4622 4623 4624<tr><td>Matcher<<a href="https://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> 4625<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4626 4627Given 4628 class Y { public: void x(); }; 4629 void z() { Y* y; y->x(); } 4630cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4631 matches y->x() 4632</pre></td></tr> 4633 4634 4635<tr><td>Matcher<<a href="https://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> 4636<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4637 4638Matches a node if it equals the node previously bound to ID. 4639 4640Given 4641 class X { int a; int b; }; 4642cxxRecordDecl( 4643 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4644 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4645 matches the class X, as a and b have the same type. 4646 4647Note that when multiple matches are involved via forEach* matchers, 4648equalsBoundNodes acts as a filter. 4649For example: 4650compoundStmt( 4651 forEachDescendant(varDecl().bind("d")), 4652 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4653will trigger a match for each combination of variable declaration 4654and reference to that variable declaration within a compound statement. 4655</pre></td></tr> 4656 4657 4658<tr><td>Matcher<<a href="https://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> 4659<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4660the node, not hidden within a typedef. 4661 4662Given 4663 typedef const int const_int; 4664 const_int i; 4665 int *const j; 4666 int *volatile k; 4667 int m; 4668varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4669i is const-qualified but the qualifier is not local. 4670</pre></td></tr> 4671 4672 4673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 4674<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4675 4676Given 4677 void a(char); 4678 void b(wchar_t); 4679 void c(double); 4680functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4681matches "a(char)", "b(wchar_t)", but not "c(double)". 4682</pre></td></tr> 4683 4684 4685<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr> 4686<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4687the Objective-C object pointer type, which is different despite being 4688syntactically similar. 4689 4690Given 4691 int *i = nullptr; 4692 4693 @interface Foo 4694 @end 4695 Foo *f; 4696 4697 int j; 4698varDecl(hasType(isAnyPointer())) 4699 matches "int *i" and "Foo *f", but not "int j". 4700</pre></td></tr> 4701 4702 4703<tr><td>Matcher<<a href="https://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> 4704<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4705include "top-level" const. 4706 4707Given 4708 void a(int); 4709 void b(int const); 4710 void c(const int); 4711 void d(const int*); 4712 void e(int const) {}; 4713functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4714 matches "void b(int const)", "void c(const int)" and 4715 "void e(int const) {}". It does not match d as there 4716 is no top-level const on the parameter type "const int *". 4717</pre></td></tr> 4718 4719 4720<tr><td>Matcher<<a href="https://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> 4721<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4722 4723Given 4724 void a(int); 4725 void b(long); 4726 void c(double); 4727functionDecl(hasAnyParameter(hasType(isInteger()))) 4728matches "a(int)", "b(long)", but not "c(double)". 4729</pre></td></tr> 4730 4731 4732<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 4733<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4734 4735Given 4736 void a(int); 4737 void b(unsigned long); 4738 void c(double); 4739functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4740matches "a(int)", but not "b(unsigned long)" and "c(double)". 4741</pre></td></tr> 4742 4743 4744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 4745<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4746 4747Given 4748 void a(int); 4749 void b(unsigned long); 4750 void c(double); 4751functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4752matches "b(unsigned long)", but not "a(int)" and "c(double)". 4753</pre></td></tr> 4754 4755 4756<tr><td>Matcher<<a href="https://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> 4757<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4758include "top-level" volatile. 4759 4760Given 4761 void a(int); 4762 void b(int volatile); 4763 void c(volatile int); 4764 void d(volatile int*); 4765 void e(int volatile) {}; 4766functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4767 matches "void b(int volatile)", "void c(volatile int)" and 4768 "void e(int volatile) {}". It does not match d as there 4769 is no top-level volatile on the parameter type "volatile int *". 4770</pre></td></tr> 4771 4772 4773<tr><td>Matcher<<a href="https://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> 4774<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4775 4776Matches a node if it equals the node previously bound to ID. 4777 4778Given 4779 class X { int a; int b; }; 4780cxxRecordDecl( 4781 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4782 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4783 matches the class X, as a and b have the same type. 4784 4785Note that when multiple matches are involved via forEach* matchers, 4786equalsBoundNodes acts as a filter. 4787For example: 4788compoundStmt( 4789 forEachDescendant(varDecl().bind("d")), 4790 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4791will trigger a match for each combination of variable declaration 4792and reference to that variable declaration within a compound statement. 4793</pre></td></tr> 4794 4795 4796<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr> 4797<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4798 4799Stmt has pointer identity in the AST. 4800</pre></td></tr> 4801 4802 4803<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 4804<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 4805Does not match if only part of the statement is expanded from that macro or 4806if different parts of the the statement are expanded from different 4807appearances of the macro. 4808</pre></td></tr> 4809 4810 4811<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4812<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4813partially matching a given regex. 4814 4815Example matches Y but not X 4816 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4817 #include "ASTMatcher.h" 4818 class X {}; 4819ASTMatcher.h: 4820 class Y {}; 4821 4822Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 4823 4824If the matcher is used in clang-query, RegexFlags parameter 4825should be passed as a quoted string. e.g: "NoFlags". 4826Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4827</pre></td></tr> 4828 4829 4830<tr><td>Matcher<<a href="https://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> 4831<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4832 4833Example matches X but not Y 4834 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4835 #include <Y.h> 4836 class X {}; 4837Y.h: 4838 class Y {}; 4839 4840Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 4841</pre></td></tr> 4842 4843 4844<tr><td>Matcher<<a href="https://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> 4845<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 4846 4847Example matches Y but not X 4848 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4849 #include <SystemHeader.h> 4850 class X {}; 4851SystemHeader.h: 4852 class Y {}; 4853 4854Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 4855</pre></td></tr> 4856 4857 4858<tr><td>Matcher<<a href="https://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> 4859<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 4860 4861Given 4862 int j; 4863 template<typename T> void A(T t) { T i; j += 42;} 4864 A(0); 4865 A(0U); 4866declStmt(isInTemplateInstantiation()) 4867 matches 'int i;' and 'unsigned i'. 4868unless(stmt(isInTemplateInstantiation())) 4869 will NOT match j += 42; as it's shared between the template definition and 4870 instantiation. 4871</pre></td></tr> 4872 4873 4874<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr> 4875<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 4876 4877Given 4878 int a[42]; 4879 int b[2 * 21]; 4880 int c[41], d[43]; 4881 char *s = "abcd"; 4882 wchar_t *ws = L"abcd"; 4883 char *w = "a"; 4884constantArrayType(hasSize(42)) 4885 matches "int a[42]" and "int b[2 * 21]" 4886stringLiteral(hasSize(4)) 4887 matches "abcd", L"abcd" 4888</pre></td></tr> 4889 4890 4891<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 4892<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 4893 4894Example matches C, but not S, U or E. 4895 struct S {}; 4896 class C {}; 4897 union U {}; 4898 enum E {}; 4899</pre></td></tr> 4900 4901 4902<tr><td>Matcher<<a href="https://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> 4903<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 4904 4905Example matches A, va, fa 4906 class A {}; 4907 class B; // Doesn't match, as it has no body. 4908 int va; 4909 extern int vb; // Doesn't match, as it doesn't define the variable. 4910 void fa() {} 4911 void fb(); // Doesn't match, as it has no body. 4912 @interface X 4913 - (void)ma; // Doesn't match, interface is declaration. 4914 @end 4915 @implementation X 4916 - (void)ma {} 4917 @end 4918 4919Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4920 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4921</pre></td></tr> 4922 4923 4924<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr> 4925<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 4926 4927Example matches E, but not C, S or U. 4928 struct S {}; 4929 class C {}; 4930 union U {}; 4931 enum E {}; 4932</pre></td></tr> 4933 4934 4935<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 4936<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 4937 4938Example matches S, but not C, U or E. 4939 struct S {}; 4940 class C {}; 4941 union U {}; 4942 enum E {}; 4943</pre></td></tr> 4944 4945 4946<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 4947<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 4948 4949Example matches U, but not C, S or E. 4950 struct S {}; 4951 class C {}; 4952 union U {}; 4953 enum E {}; 4954</pre></td></tr> 4955 4956 4957<tr><td>Matcher<<a href="https://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> 4958<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 4959 4960Note that 'Value' is a string as the template argument's value is 4961an arbitrary precision integer. 'Value' must be euqal to the canonical 4962representation of that integral value in base 10. 4963 4964Given 4965 template<int T> struct C {}; 4966 C<42> c; 4967classTemplateSpecializationDecl( 4968 hasAnyTemplateArgument(equalsIntegralValue("42"))) 4969 matches the implicit instantiation of C in C<42>. 4970</pre></td></tr> 4971 4972 4973<tr><td>Matcher<<a href="https://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> 4974<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 4975 4976Given 4977 template<int T> struct C {}; 4978 C<42> c; 4979classTemplateSpecializationDecl( 4980 hasAnyTemplateArgument(isIntegral())) 4981 matches the implicit instantiation of C in C<42> 4982 with isIntegral() matching 42. 4983</pre></td></tr> 4984 4985 4986<tr><td>Matcher<<a href="https://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> 4987<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 4988 4989Given 4990 template<typename T> struct C {}; 4991 C<int> c; 4992classTemplateSpecializationDecl(templateArgumentCountIs(1)) 4993 matches C<int>. 4994</pre></td></tr> 4995 4996 4997<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 4998<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 4999Does not match if only part of the statement is expanded from that macro or 5000if different parts of the the statement are expanded from different 5001appearances of the macro. 5002</pre></td></tr> 5003 5004 5005<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 5006<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5007partially matching a given regex. 5008 5009Example matches Y but not X 5010 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5011 #include "ASTMatcher.h" 5012 class X {}; 5013ASTMatcher.h: 5014 class Y {}; 5015 5016Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5017 5018If the matcher is used in clang-query, RegexFlags parameter 5019should be passed as a quoted string. e.g: "NoFlags". 5020Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5021</pre></td></tr> 5022 5023 5024<tr><td>Matcher<<a href="https://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> 5025<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5026 5027Example matches X but not Y 5028 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5029 #include <Y.h> 5030 class X {}; 5031Y.h: 5032 class Y {}; 5033 5034Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5035</pre></td></tr> 5036 5037 5038<tr><td>Matcher<<a href="https://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> 5039<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5040 5041Example matches Y but not X 5042 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5043 #include <SystemHeader.h> 5044 class X {}; 5045SystemHeader.h: 5046 class Y {}; 5047 5048Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5049</pre></td></tr> 5050 5051 5052<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr> 5053<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5054 5055Given 5056 struct S { bool func(); }; 5057functionDecl(returns(booleanType())) 5058 matches "bool func();" 5059</pre></td></tr> 5060 5061 5062<tr><td>Matcher<<a href="https://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> 5063<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5064 5065Matches a node if it equals the node previously bound to ID. 5066 5067Given 5068 class X { int a; int b; }; 5069cxxRecordDecl( 5070 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5071 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5072 matches the class X, as a and b have the same type. 5073 5074Note that when multiple matches are involved via forEach* matchers, 5075equalsBoundNodes acts as a filter. 5076For example: 5077compoundStmt( 5078 forEachDescendant(varDecl().bind("d")), 5079 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5080will trigger a match for each combination of variable declaration 5081and reference to that variable declaration within a compound statement. 5082</pre></td></tr> 5083 5084 5085<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr> 5086<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5087 5088Type has pointer identity in the AST. 5089</pre></td></tr> 5090 5091 5092<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr> 5093<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5094 5095Given 5096 int i; 5097 float f; 5098realFloatingPointType() 5099 matches "float f" but not "int i" 5100</pre></td></tr> 5101 5102 5103<tr><td>Matcher<<a href="https://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> 5104<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5105 5106Given 5107 struct S { void func(); }; 5108functionDecl(returns(voidType())) 5109 matches "void func();" 5110</pre></td></tr> 5111 5112 5113<tr><td>Matcher<<a href="https://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> 5114<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5115 5116Given 5117 int x; 5118 int s = sizeof(x) + alignof(x) 5119unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5120 matches sizeof(x) 5121 5122If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5123should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5124</pre></td></tr> 5125 5126 5127<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 5128<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 5129specified names. 5130 5131 hasAnyOperatorName("+", "-") 5132 Is equivalent to 5133 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5134</pre></td></tr> 5135 5136 5137<tr><td>Matcher<<a href="https://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> 5138<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 5139unary). 5140 5141Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5142 !(a || b) 5143</pre></td></tr> 5144 5145 5146<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr> 5147<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5148to '.'. 5149 5150Member calls on the implicit this pointer match as called with '->'. 5151 5152Given 5153 class Y { 5154 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5155 template <class T> void f() { this->f<T>(); f<T>(); } 5156 int a; 5157 static int b; 5158 }; 5159 template <class T> 5160 class Z { 5161 void x() { this->m; } 5162 }; 5163memberExpr(isArrow()) 5164 matches this->x, x, y.x, a, this->b 5165cxxDependentScopeMemberExpr(isArrow()) 5166 matches this->m 5167unresolvedMemberExpr(isArrow()) 5168 matches this->f<T>, f<T> 5169</pre></td></tr> 5170 5171 5172<tr><td>Matcher<<a href="https://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> 5173<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5174 5175Example matches x, but not y, z, or a. 5176(matcher = varDecl(hasAutomaticStorageDuration()) 5177void f() { 5178 int x; 5179 static int y; 5180 thread_local int z; 5181} 5182int a; 5183</pre></td></tr> 5184 5185 5186<tr><td>Matcher<<a href="https://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> 5187<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5188 5189Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5190void f() { 5191 int x; 5192 static int y; 5193} 5194int z; 5195</pre></td></tr> 5196 5197 5198<tr><td>Matcher<<a href="https://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> 5199<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5200non-static local variable. 5201 5202Example matches x (matcher = varDecl(hasLocalStorage()) 5203void f() { 5204 int x; 5205 static int y; 5206} 5207int z; 5208</pre></td></tr> 5209 5210 5211<tr><td>Matcher<<a href="https://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> 5212<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5213It includes the variable declared at namespace scope and those declared 5214with "static" and "extern" storage class specifiers. 5215 5216void f() { 5217 int x; 5218 static int y; 5219 thread_local int z; 5220} 5221int a; 5222static int b; 5223extern int c; 5224varDecl(hasStaticStorageDuration()) 5225 matches the function declaration y, a, b and c. 5226</pre></td></tr> 5227 5228 5229<tr><td>Matcher<<a href="https://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> 5230<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5231 5232Example matches z, but not x, z, or a. 5233(matcher = varDecl(hasThreadStorageDuration()) 5234void f() { 5235 int x; 5236 static int y; 5237 thread_local int z; 5238} 5239int a; 5240</pre></td></tr> 5241 5242 5243<tr><td>Matcher<<a href="https://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> 5244<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5245 and if constexpr. 5246 5247Given: 5248 constexpr int foo = 42; 5249 constexpr int bar(); 5250 void baz() { if constexpr(1 > 0) {} } 5251varDecl(isConstexpr()) 5252 matches the declaration of foo. 5253functionDecl(isConstexpr()) 5254 matches the declaration of bar. 5255ifStmt(isConstexpr()) 5256 matches the if statement in baz. 5257</pre></td></tr> 5258 5259 5260<tr><td>Matcher<<a href="https://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> 5261<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5262 5263Example matches A, va, fa 5264 class A {}; 5265 class B; // Doesn't match, as it has no body. 5266 int va; 5267 extern int vb; // Doesn't match, as it doesn't define the variable. 5268 void fa() {} 5269 void fb(); // Doesn't match, as it has no body. 5270 @interface X 5271 - (void)ma; // Doesn't match, interface is declaration. 5272 @end 5273 @implementation X 5274 - (void)ma {} 5275 @end 5276 5277Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 5278 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5279</pre></td></tr> 5280 5281 5282<tr><td>Matcher<<a href="https://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> 5283<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5284a C++ catch block, or an Objective-C statement. 5285 5286Example matches x (matcher = varDecl(isExceptionVariable()) 5287void f(int y) { 5288 try { 5289 } catch (int x) { 5290 } 5291} 5292</pre></td></tr> 5293 5294 5295<tr><td>Matcher<<a href="https://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> 5296<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5297static member variable template instantiations. 5298 5299Given 5300 template<typename T> void A(T t) { } 5301 template<> void A(int N) { } 5302functionDecl(isExplicitTemplateSpecialization()) 5303 matches the specialization A<int>(). 5304 5305Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5306</pre></td></tr> 5307 5308 5309<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr> 5310<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5311 5312Given: 5313 extern "C" void f() {} 5314 extern "C" { void g() {} } 5315 void h() {} 5316 extern "C" int x = 1; 5317 extern "C" int y = 2; 5318 int z = 3; 5319functionDecl(isExternC()) 5320 matches the declaration of f and g, but not the declaration of h. 5321varDecl(isExternC()) 5322 matches the declaration of x and y, but not the declaration of z. 5323</pre></td></tr> 5324 5325 5326<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr> 5327<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5328 5329Example matches y (matcher = varDecl(isStaticLocal())) 5330void f() { 5331 int x; 5332 static int y; 5333} 5334static int z; 5335</pre></td></tr> 5336 5337 5338<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr> 5339<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5340class specifier ("static" keyword) written in the source. 5341 5342Given: 5343 static void f() {} 5344 static int i = 0; 5345 extern int j; 5346 int k; 5347functionDecl(isStaticStorageClass()) 5348 matches the function declaration f. 5349varDecl(isStaticStorageClass()) 5350 matches the variable declaration i. 5351</pre></td></tr> 5352 5353 5354<tr><td>Matcher<<a href="https://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> 5355<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5356member variable template instantiations. 5357 5358Given 5359 template <typename T> class X {}; class A {}; X<A> x; 5360or 5361 template <typename T> class X {}; class A {}; template class X<A>; 5362or 5363 template <typename T> class X {}; class A {}; extern template class X<A>; 5364cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5365 matches the template instantiation of X<A>. 5366 5367But given 5368 template <typename T> class X {}; class A {}; 5369 template <> class X<A> {}; X<A> x; 5370cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5371 does not match, as X<A> is an explicit template specialization. 5372 5373Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5374</pre></td></tr> 5375 5376<!--END_NARROWING_MATCHERS --> 5377</table> 5378 5379<!-- ======================================================================= --> 5380<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5381<!-- ======================================================================= --> 5382 5383<p>Traversal matchers specify the relationship to other nodes that are 5384reachable from the current node.</p> 5385 5386<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5387forEachDescendant) which work on all nodes and allow users to write more generic 5388match expressions.</p> 5389 5390<table> 5391<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5392<!-- START_TRAVERSAL_MATCHERS --> 5393 5394<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5395<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5396 5397Unlike anyOf, eachOf will generate a match result for each 5398matching submatcher. 5399 5400For example, in: 5401 class A { int a; int b; }; 5402The matcher: 5403 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5404 has(fieldDecl(hasName("b")).bind("v")))) 5405will generate two results binding "v", the first of which binds 5406the field declaration of a, the second the field declaration of 5407b. 5408 5409Usable as: Any Matcher 5410</pre></td></tr> 5411 5412 5413<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5414<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5415 5416Generates results for each match. 5417 5418For example, in: 5419 class A { class B {}; class C {}; }; 5420The matcher: 5421 cxxRecordDecl(hasName("::A"), 5422 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5423will generate results for A, B and C. 5424 5425Usable as: Any Matcher 5426</pre></td></tr> 5427 5428 5429<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5430<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5431provided matcher. 5432 5433Example matches X, A, A::X, B, B::C, B::C::X 5434 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5435 class X {}; 5436 class A { class X {}; }; // Matches A, because A::X is a class of name 5437 // X inside A. 5438 class B { class C { class X {}; }; }; 5439 5440DescendantT must be an AST base type. 5441 5442As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5443each result that matches instead of only on the first one. 5444 5445Note: Recursively combined ForEachDescendant can cause many matches: 5446 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5447 forEachDescendant(cxxRecordDecl()) 5448 ))) 5449will match 10 times (plus injected class name matches) on: 5450 class A { class B { class C { class D { class E {}; }; }; }; }; 5451 5452Usable as: Any Matcher 5453</pre></td></tr> 5454 5455 5456<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5457<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5458provided matcher. 5459 5460Example matches X, Y, Y::X, Z::Y, Z::Y::X 5461 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5462 class X {}; 5463 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5464 // inside Y. 5465 class Z { class Y { class X {}; }; }; // Does not match Z. 5466 5467ChildT must be an AST base type. 5468 5469As opposed to 'has', 'forEach' will cause a match for each result that 5470matches instead of only on the first one. 5471 5472Usable as: Any Matcher 5473</pre></td></tr> 5474 5475 5476<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5477<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5478matcher. 5479 5480Given 5481void f() { if (true) { int x = 42; } } 5482void g() { for (;;) { int x = 43; } } 5483expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5484 5485Usable as: Any Matcher 5486</pre></td></tr> 5487 5488 5489<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5490<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5491provided matcher. 5492 5493Example matches X, Y, Z 5494 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5495 class X {}; // Matches X, because X::X is a class of name X inside X. 5496 class Y { class X {}; }; 5497 class Z { class Y { class X {}; }; }; 5498 5499DescendantT must be an AST base type. 5500 5501Usable as: Any Matcher 5502</pre></td></tr> 5503 5504 5505<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5506<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5507provided matcher. 5508 5509Example matches X, Y 5510 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5511 class X {}; // Matches X, because X::X is a class of name X inside X. 5512 class Y { class X {}; }; 5513 class Z { class Y { class X {}; }; }; // Does not match Z. 5514 5515ChildT must be an AST base type. 5516 5517Usable as: Any Matcher 5518Note that has is direct matcher, so it also matches things like implicit 5519casts and paren casts. If you are matching with expr then you should 5520probably consider using ignoringParenImpCasts like: 5521has(ignoringParenImpCasts(expr())). 5522</pre></td></tr> 5523 5524 5525<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5526<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5527matcher. 5528 5529Given 5530void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5531compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5532 5533Usable as: Any Matcher 5534</pre></td></tr> 5535 5536 5537<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5538<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5539 5540However, optionally will retain any bindings generated by the submatcher. 5541Useful when additional information which may or may not present about a main 5542matching node is desired. 5543 5544For example, in: 5545 class Foo { 5546 int bar; 5547 } 5548The matcher: 5549 cxxRecordDecl( 5550 optionally(has( 5551 fieldDecl(hasName("bar")).bind("var") 5552 ))).bind("record") 5553will produce a result binding for both "record" and "var". 5554The matcher will produce a "record" binding for even if there is no data 5555member named "bar" in that class. 5556 5557Usable as: Any Matcher 5558</pre></td></tr> 5559 5560 5561<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5562<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5563 5564Given 5565 void foo() 5566 { 5567 int i = 3.0; 5568 } 5569The matcher 5570 traverse(TK_IgnoreUnlessSpelledInSource, 5571 varDecl(hasInitializer(floatLiteral().bind("init"))) 5572 ) 5573matches the variable declaration with "init" bound to the "3.0". 5574</pre></td></tr> 5575 5576 5577<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5578<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5579switch statement or conditional operator. 5580 5581Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5582 if (true) {} 5583</pre></td></tr> 5584 5585 5586<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5587<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5588(binary or ternary). 5589 5590Example matches b 5591 condition ? a : b 5592 condition ?: b 5593</pre></td></tr> 5594 5595 5596<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5597<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5598 5599Example 1 (conditional ternary operator): matches a 5600 condition ? a : b 5601 5602Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5603 condition ?: b 5604</pre></td></tr> 5605 5606 5607<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5608<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5609matches the given matcher. 5610 5611The associated declaration is: 5612- for type nodes, the declaration of the underlying type 5613- for CallExpr, the declaration of the callee 5614- for MemberExpr, the declaration of the referenced member 5615- for CXXConstructExpr, the declaration of the constructor 5616- for CXXNewExpr, the declaration of the operator new 5617- for ObjCIvarExpr, the declaration of the ivar 5618 5619For type nodes, hasDeclaration will generally match the declaration of the 5620sugared type. Given 5621 class X {}; 5622 typedef X Y; 5623 Y y; 5624in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5625typedefDecl. A common use case is to match the underlying, desugared type. 5626This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5627 varDecl(hasType(hasUnqualifiedDesugaredType( 5628 recordType(hasDeclaration(decl()))))) 5629In this matcher, the decl will match the CXXRecordDecl of class X. 5630 5631Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5632 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5633 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5634 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 5635 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5636 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5637 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5638</pre></td></tr> 5639 5640 5641<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5642<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5643 5644Given 5645 int i[5]; 5646 void f() { i[1] = 42; } 5647arraySubscriptExpression(hasBase(implicitCastExpr( 5648 hasSourceExpression(declRefExpr())))) 5649 matches i[1] with the declRefExpr() matching i 5650</pre></td></tr> 5651 5652 5653<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5654<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5655 5656Given 5657 int i[5]; 5658 void f() { i[1] = 42; } 5659arraySubscriptExpression(hasIndex(integerLiteral())) 5660 matches i[1] with the integerLiteral() matching 1 5661</pre></td></tr> 5662 5663 5664<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5665<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 5666 5667Example matches a (matcher = binaryOperator(hasLHS())) 5668 a || b 5669</pre></td></tr> 5670 5671 5672<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5673<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 5674 5675Example matches b (matcher = binaryOperator(hasRHS())) 5676 a || b 5677</pre></td></tr> 5678 5679 5680<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5681<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5682type. 5683 5684Given 5685 struct A {}; 5686 A a[7]; 5687 int b[7]; 5688arrayType(hasElementType(builtinType())) 5689 matches "int b[7]" 5690 5691Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 5692</pre></td></tr> 5693 5694 5695<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5696<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5697 5698Given 5699 _Atomic(int) i; 5700 _Atomic(float) f; 5701atomicType(hasValueType(isInteger())) 5702 matches "_Atomic(int) i" 5703 5704Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5705</pre></td></tr> 5706 5707 5708<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5709<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5710 5711Note: There is no TypeLoc for the deduced type and thus no 5712getDeducedLoc() matcher. 5713 5714Given 5715 auto a = 1; 5716 auto b = 2.0; 5717autoType(hasDeducedType(isInteger())) 5718 matches "auto a" 5719 5720Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5721</pre></td></tr> 5722 5723 5724<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5725<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5726binary operator matches. 5727</pre></td></tr> 5728 5729 5730<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5731<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5732 5733Example matches a (matcher = binaryOperator(hasLHS())) 5734 a || b 5735</pre></td></tr> 5736 5737 5738<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr> 5739<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5740 5741Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5742 integerLiteral(equals(2))) 5743 1 + 2 // Match 5744 2 + 1 // Match 5745 1 + 1 // No match 5746 2 + 2 // No match 5747</pre></td></tr> 5748 5749 5750<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5751<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 5752 5753Example matches b (matcher = binaryOperator(hasRHS())) 5754 a || b 5755</pre></td></tr> 5756 5757 5758<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 5759<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 5760block. 5761 5762Does not match the 'this' parameter of a method. 5763 5764Given 5765 class X { void f(int x, int y, int z) {} }; 5766cxxMethodDecl(hasAnyParameter(hasName("y"))) 5767 matches f(int x, int y, int z) {} 5768with hasAnyParameter(...) 5769 matching int y 5770 5771For ObjectiveC, given 5772 @interface I - (void) f:(int) y; @end 5773 5774the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5775matches the declaration of method f with hasParameter 5776matching y. 5777 5778For blocks, given 5779 b = ^(int y) { printf("%d", y) }; 5780 5781the matcher blockDecl(hasAnyParameter(hasName("y"))) 5782matches the declaration of the block b with hasParameter 5783matching y. 5784</pre></td></tr> 5785 5786 5787<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 5788<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 5789declaration or a block. 5790 5791Given 5792 class X { void f(int x) {} }; 5793cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5794 matches f(int x) {} 5795with hasParameter(...) 5796 matching int x 5797 5798For ObjectiveC, given 5799 @interface I - (void) f:(int) y; @end 5800 5801the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5802matches the declaration of method f with hasParameter 5803matching y. 5804</pre></td></tr> 5805 5806 5807<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5808<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 5809pointee matches a given matcher. 5810 5811Given 5812 int *a; 5813 int const *b; 5814 float const *f; 5815pointerType(pointee(isConstQualified(), isInteger())) 5816 matches "int const *b" 5817 5818Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5819 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5820</pre></td></tr> 5821 5822 5823<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5824<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 5825declaration's type. 5826 5827In case of a value declaration (for example a variable declaration), 5828this resolves one layer of indirection. For example, in the value 5829declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5830X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5831declaration of x. 5832 5833Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5834 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5835 and friend class X (matcher = friendDecl(hasType("X")) 5836 class X {}; 5837 void y(X &x) { x; X z; } 5838 class Y { friend class X; }; 5839 5840Example matches class Derived 5841(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 5842class Base {}; 5843class Derived : Base {}; 5844 5845Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 5846Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 5847</pre></td></tr> 5848 5849 5850<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 5851<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 5852 5853Given 5854 void f(int i); 5855 int y; 5856 f(y); 5857callExpr( 5858 forEachArgumentWithParam( 5859 declRefExpr(to(varDecl(hasName("y")))), 5860 parmVarDecl(hasType(isInteger())) 5861)) 5862 matches f(y); 5863with declRefExpr(...) 5864 matching int y 5865and parmVarDecl(...) 5866 matching int i 5867</pre></td></tr> 5868 5869 5870<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType1')"><a name="forEachArgumentWithParamType1Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 5871<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 5872CXXConstructExpr. It is very similar to forEachArgumentWithParam but 5873it works on calls through function pointers as well. 5874 5875The difference is, that function pointers do not provide access to a 5876ParmVarDecl, but only the QualType for each argument. 5877 5878Given 5879 void f(int i); 5880 int y; 5881 f(y); 5882 void (*f_ptr)(int) = f; 5883 f_ptr(y); 5884callExpr( 5885 forEachArgumentWithParamType( 5886 declRefExpr(to(varDecl(hasName("y")))), 5887 qualType(isInteger()).bind("type) 5888)) 5889 matches f(y) and f_ptr(y) 5890with declRefExpr(...) 5891 matching int y 5892and qualType(...) 5893 matching int 5894</pre></td></tr> 5895 5896 5897<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5898<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 5899expression, or an ObjC-message-send expression. 5900 5901Given 5902 void x(int, int, int) { int y; x(1, y, 42); } 5903callExpr(hasAnyArgument(declRefExpr())) 5904 matches x(1, y, 42) 5905with hasAnyArgument(...) 5906 matching y 5907 5908For ObjectiveC, given 5909 @interface I - (void) f:(int) y; @end 5910 void foo(I *i) { [i f:12]; } 5911objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5912 matches [i f:12] 5913</pre></td></tr> 5914 5915 5916<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5917<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 5918call expression. 5919 5920Example matches y in x(y) 5921 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5922 void x(int) { int y; x(y); } 5923</pre></td></tr> 5924 5925 5926<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5927<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 5928matches the given matcher. 5929 5930The associated declaration is: 5931- for type nodes, the declaration of the underlying type 5932- for CallExpr, the declaration of the callee 5933- for MemberExpr, the declaration of the referenced member 5934- for CXXConstructExpr, the declaration of the constructor 5935- for CXXNewExpr, the declaration of the operator new 5936- for ObjCIvarExpr, the declaration of the ivar 5937 5938For type nodes, hasDeclaration will generally match the declaration of the 5939sugared type. Given 5940 class X {}; 5941 typedef X Y; 5942 Y y; 5943in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5944typedefDecl. A common use case is to match the underlying, desugared type. 5945This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5946 varDecl(hasType(hasUnqualifiedDesugaredType( 5947 recordType(hasDeclaration(decl()))))) 5948In this matcher, the decl will match the CXXRecordDecl of class X. 5949 5950Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5951 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5952 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5953 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 5954 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5955 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5956 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5957</pre></td></tr> 5958 5959 5960<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 5961<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 5962 5963Given 5964 class A { A() : i(42), j(42) {} int i; int j; }; 5965cxxConstructorDecl(forEachConstructorInitializer( 5966 forField(decl().bind("x")) 5967)) 5968 will trigger two matches, binding for 'i' and 'j' respectively. 5969</pre></td></tr> 5970 5971 5972<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 5973<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 5974 5975Given 5976 struct Foo { 5977 Foo() : foo_(1) { } 5978 int foo_; 5979 }; 5980cxxRecordDecl(has(cxxConstructorDecl( 5981 hasAnyConstructorInitializer(anything()) 5982))) 5983 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5984</pre></td></tr> 5985 5986 5987<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr> 5988<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5989 5990Given 5991 struct Foo { 5992 Foo() : foo_(1) { } 5993 int foo_; 5994 }; 5995cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5996 forField(hasName("foo_")))))) 5997 matches Foo 5998with forField matching foo_ 5999</pre></td></tr> 6000 6001 6002<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6003<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6004 6005Given 6006 struct Foo { 6007 Foo() : foo_(1) { } 6008 int foo_; 6009 }; 6010cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6011 withInitializer(integerLiteral(equals(1))))))) 6012 matches Foo 6013with withInitializer matching (1) 6014</pre></td></tr> 6015 6016 6017<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6018<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6019given matcher. Implicit object expressions are included; that is, it matches 6020use of implicit `this`. 6021 6022Given 6023 struct X { 6024 int m; 6025 int f(X x) { x.m; return m; } 6026 }; 6027memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6028 matches `x.m`, but not `m`; however, 6029memberExpr(hasObjectExpression(hasType(pointsTo( 6030 cxxRecordDecl(hasName("X")))))) 6031 matches `m` (aka. `this->m`), but not `x.m`. 6032</pre></td></tr> 6033 6034 6035<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6036<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6037 6038 6039<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasInitStatement2')"><a name="hasInitStatement2Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6040<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6041 6042Given: 6043 void foo() { 6044 if (int i = foobar(); i > 0) {} 6045 switch (int i = foobar(); i) {} 6046 for (auto& a = get_range(); auto& x : a) {} 6047 } 6048 void bar() { 6049 if (foobar() > 0) {} 6050 switch (foobar()) {} 6051 for (auto& x : get_range()) {} 6052 } 6053ifStmt(hasInitStatement(anything())) 6054 matches the if statement in foo but not in bar. 6055switchStmt(hasInitStatement(anything())) 6056 matches the switch statement in foo but not in bar. 6057cxxForRangeStmt(hasInitStatement(anything())) 6058 matches the range for statement in foo but not in bar. 6059</pre></td></tr> 6060 6061 6062<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 6063<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6064 6065Example: 6066 forStmt(hasLoopVariable(anything())) 6067matches 'int x' in 6068 for (int x : a) { } 6069</pre></td></tr> 6070 6071 6072<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6073<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6074 6075Example: 6076 forStmt(hasRangeInit(anything())) 6077matches 'a' in 6078 for (int x : a) { } 6079</pre></td></tr> 6080 6081 6082<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6083<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6084`on`, matches the argument directly without stripping away anything. 6085 6086Given 6087 class Y { public: void m(); }; 6088 Y g(); 6089 class X : public Y { void g(); }; 6090 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6091cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6092 cxxRecordDecl(hasName("Y"))))) 6093 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6094cxxMemberCallExpr(on(callExpr())) 6095 does not match `(g()).m()`, because the parens are not ignored. 6096 6097FIXME: Overload to allow directly matching types? 6098</pre></td></tr> 6099 6100 6101<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6102<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6103stripping off any parentheses or implicit casts. 6104 6105Given 6106 class Y { public: void m(); }; 6107 Y g(); 6108 class X : public Y {}; 6109 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6110cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6111 matches `y.m()` and `(g()).m()`. 6112cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6113 matches `x.m()`. 6114cxxMemberCallExpr(on(callExpr())) 6115 matches `(g()).m()`. 6116 6117FIXME: Overload to allow directly matching types? 6118</pre></td></tr> 6119 6120 6121<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6122<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6123</pre></td></tr> 6124 6125 6126<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6127<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6128matches the InnerMatcher, or is a pointer to a type that matches the 6129InnerMatcher. 6130 6131Given 6132 class Y { public: void m(); }; 6133 class X : public Y { void g(); }; 6134 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6135cxxMemberCallExpr(thisPointerType(hasDeclaration( 6136 cxxRecordDecl(hasName("Y"))))) 6137 matches `y.m()`, `p->m()` and `x.m()`. 6138cxxMemberCallExpr(thisPointerType(hasDeclaration( 6139 cxxRecordDecl(hasName("X"))))) 6140 matches `x.g()`. 6141</pre></td></tr> 6142 6143 6144<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 6145<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6146produce multiple matches. 6147 6148Given 6149 class A { virtual void f(); }; 6150 class B : public A { void f(); }; 6151 class C : public B { void f(); }; 6152cxxMethodDecl(ofClass(hasName("C")), 6153 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6154 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6155 that B::f is not overridden by C::f). 6156 6157The check can produce multiple matches in case of multiple inheritance, e.g. 6158 class A1 { virtual void f(); }; 6159 class A2 { virtual void f(); }; 6160 class C : public A1, public A2 { void f(); }; 6161cxxMethodDecl(ofClass(hasName("C")), 6162 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6163 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6164 once with "b" binding "A2::f" and "d" binding "C::f". 6165</pre></td></tr> 6166 6167 6168<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr> 6169<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6170belongs to. 6171 6172FIXME: Generalize this for other kinds of declarations. 6173FIXME: What other kind of declarations would we need to generalize 6174this to? 6175 6176Example matches A() in the last line 6177 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6178 ofClass(hasName("A")))))) 6179 class A { 6180 public: 6181 A(); 6182 }; 6183 A a = A(); 6184</pre></td></tr> 6185 6186 6187<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasAnyPlacementArg0')"><a name="hasAnyPlacementArg0Anchor">hasAnyPlacementArg</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6188<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6189 6190Given: 6191 MyClass *p1 = new (Storage) MyClass(); 6192cxxNewExpr(hasAnyPlacementArg(anything())) 6193 matches the expression 'new (Storage, 16) MyClass()'. 6194</pre></td></tr> 6195 6196 6197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6198<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6199 6200Given: 6201 MyClass *p1 = new MyClass[10]; 6202cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6203 matches the expression 'new MyClass[10]'. 6204</pre></td></tr> 6205 6206 6207<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6208<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6209matches the given matcher. 6210 6211The associated declaration is: 6212- for type nodes, the declaration of the underlying type 6213- for CallExpr, the declaration of the callee 6214- for MemberExpr, the declaration of the referenced member 6215- for CXXConstructExpr, the declaration of the constructor 6216- for CXXNewExpr, the declaration of the operator new 6217- for ObjCIvarExpr, the declaration of the ivar 6218 6219For type nodes, hasDeclaration will generally match the declaration of the 6220sugared type. Given 6221 class X {}; 6222 typedef X Y; 6223 Y y; 6224in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6225typedefDecl. A common use case is to match the underlying, desugared type. 6226This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6227 varDecl(hasType(hasUnqualifiedDesugaredType( 6228 recordType(hasDeclaration(decl()))))) 6229In this matcher, the decl will match the CXXRecordDecl of class X. 6230 6231Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6232 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6233 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6234 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6235 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6236 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6237 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6238</pre></td></tr> 6239 6240 6241<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasPlacementArg0')"><a name="hasPlacementArg0Anchor">hasPlacementArg</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6242<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6243 6244Given: 6245 MyClass *p1 = new (Storage, 16) MyClass(); 6246cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6247 matches the expression 'new (Storage, 16) MyClass()'. 6248</pre></td></tr> 6249 6250 6251<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasAnyBase0')"><a name="hasAnyBase0Anchor">hasAnyBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 6252<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6253 6254Example: 6255matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6256 class Foo; 6257 class Bar : Foo {}; 6258 class Baz : Bar {}; 6259 class SpecialBase; 6260 class Proxy : SpecialBase {}; // matches Proxy 6261 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6262 6263FIXME: Refactor this and isDerivedFrom to reuse implementation. 6264</pre></td></tr> 6265 6266 6267<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDirectBase0')"><a name="hasDirectBase0Anchor">hasDirectBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 6268<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6269 6270Example: 6271matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6272 class Foo; 6273 class Bar : Foo {}; 6274 class Baz : Bar {}; 6275 class SpecialBase; 6276 class Proxy : SpecialBase {}; // matches Proxy 6277 class IndirectlyDerived : Proxy {}; // doesn't match 6278</pre></td></tr> 6279 6280 6281<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 6282<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6283 6284Given: 6285 class A { void func(); }; 6286 class B { void member(); }; 6287 6288cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6289A but not B. 6290</pre></td></tr> 6291 6292 6293<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6294<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6295matching Base, or Objective-C classes that directly or indirectly 6296subclass a class matching Base. 6297 6298Note that a class is not considered to be derived from itself. 6299 6300Example matches Y, Z, C (Base == hasName("X")) 6301 class X; 6302 class Y : public X {}; // directly derived 6303 class Z : public Y {}; // indirectly derived 6304 typedef X A; 6305 typedef A B; 6306 class C : public B {}; // derived from a typedef of X 6307 6308In the following example, Bar matches isDerivedFrom(hasName("X")): 6309 class Foo; 6310 typedef Foo X; 6311 class Bar : public Foo {}; // derived from a type that X is a typedef of 6312 6313In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6314 @interface NSObject @end 6315 @interface Bar : NSObject @end 6316 6317Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>> 6318</pre></td></tr> 6319 6320 6321<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6322<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6323matching Base. 6324 6325Note that a class is not considered to be derived from itself. 6326 6327Example matches Y, C (Base == hasName("X")) 6328 class X; 6329 class Y : public X {}; // directly derived 6330 class Z : public Y {}; // indirectly derived 6331 typedef X A; 6332 typedef A B; 6333 class C : public B {}; // derived from a typedef of X 6334 6335In the following example, Bar matches isDerivedFrom(hasName("X")): 6336 class Foo; 6337 typedef Foo X; 6338 class Bar : public Foo {}; // derived from a type that X is a typedef of 6339</pre></td></tr> 6340 6341 6342<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6343<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6344match Base. 6345</pre></td></tr> 6346 6347 6348<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6349<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6350expression, or an ObjC-message-send expression. 6351 6352Given 6353 void x(int, int, int) { int y; x(1, y, 42); } 6354callExpr(hasAnyArgument(declRefExpr())) 6355 matches x(1, y, 42) 6356with hasAnyArgument(...) 6357 matching y 6358 6359For ObjectiveC, given 6360 @interface I - (void) f:(int) y; @end 6361 void foo(I *i) { [i f:12]; } 6362objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6363 matches [i f:12] 6364</pre></td></tr> 6365 6366 6367<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6368<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6369call expression. 6370 6371Example matches y in x(y) 6372 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6373 void x(int) { int y; x(y); } 6374</pre></td></tr> 6375 6376 6377<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6378<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 6379given matcher. 6380 6381Example matches y.x() (matcher = callExpr(callee( 6382 cxxMethodDecl(hasName("x"))))) 6383 class Y { public: void x(); }; 6384 void z() { Y y; y.x(); } 6385</pre></td></tr> 6386 6387 6388<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6389<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 6390 6391Given 6392 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 6393 void f() { f(); } 6394callExpr(callee(expr())) 6395 matches this->x(), x(), y.x(), f() 6396with callee(...) 6397 matching this->x, x, y.x, f respectively 6398 6399Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 6400because this introduces ambiguous overloads with calls to Callee taking a 6401internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 6402implemented in terms of implicit casts. 6403</pre></td></tr> 6404 6405 6406<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 6407<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 6408 6409Given 6410 void f(int i); 6411 int y; 6412 f(y); 6413callExpr( 6414 forEachArgumentWithParam( 6415 declRefExpr(to(varDecl(hasName("y")))), 6416 parmVarDecl(hasType(isInteger())) 6417)) 6418 matches f(y); 6419with declRefExpr(...) 6420 matching int y 6421and parmVarDecl(...) 6422 matching int i 6423</pre></td></tr> 6424 6425 6426<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType0')"><a name="forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 6427<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 6428CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6429it works on calls through function pointers as well. 6430 6431The difference is, that function pointers do not provide access to a 6432ParmVarDecl, but only the QualType for each argument. 6433 6434Given 6435 void f(int i); 6436 int y; 6437 f(y); 6438 void (*f_ptr)(int) = f; 6439 f_ptr(y); 6440callExpr( 6441 forEachArgumentWithParamType( 6442 declRefExpr(to(varDecl(hasName("y")))), 6443 qualType(isInteger()).bind("type) 6444)) 6445 matches f(y) and f_ptr(y) 6446with declRefExpr(...) 6447 matching int y 6448and qualType(...) 6449 matching int 6450</pre></td></tr> 6451 6452 6453<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6454<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 6455expression, or an ObjC-message-send expression. 6456 6457Given 6458 void x(int, int, int) { int y; x(1, y, 42); } 6459callExpr(hasAnyArgument(declRefExpr())) 6460 matches x(1, y, 42) 6461with hasAnyArgument(...) 6462 matching y 6463 6464For ObjectiveC, given 6465 @interface I - (void) f:(int) y; @end 6466 void foo(I *i) { [i f:12]; } 6467objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6468 matches [i f:12] 6469</pre></td></tr> 6470 6471 6472<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6473<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 6474call expression. 6475 6476Example matches y in x(y) 6477 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6478 void x(int) { int y; x(y); } 6479</pre></td></tr> 6480 6481 6482<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6483<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 6484matches the given matcher. 6485 6486The associated declaration is: 6487- for type nodes, the declaration of the underlying type 6488- for CallExpr, the declaration of the callee 6489- for MemberExpr, the declaration of the referenced member 6490- for CXXConstructExpr, the declaration of the constructor 6491- for CXXNewExpr, the declaration of the operator new 6492- for ObjCIvarExpr, the declaration of the ivar 6493 6494For type nodes, hasDeclaration will generally match the declaration of the 6495sugared type. Given 6496 class X {}; 6497 typedef X Y; 6498 Y y; 6499in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6500typedefDecl. A common use case is to match the underlying, desugared type. 6501This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6502 varDecl(hasType(hasUnqualifiedDesugaredType( 6503 recordType(hasDeclaration(decl()))))) 6504In this matcher, the decl will match the CXXRecordDecl of class X. 6505 6506Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6507 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6508 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6509 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6510 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6511 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6512 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6513</pre></td></tr> 6514 6515 6516<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6517<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 6518extension, matches the constant given in the statement. 6519 6520Given 6521 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 6522caseStmt(hasCaseConstant(integerLiteral())) 6523 matches "case 1:" 6524</pre></td></tr> 6525 6526 6527<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6528<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 6529or opaque value's source expression matches the given matcher. 6530 6531Example 1: matches "a string" 6532(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6533class URL { URL(string); }; 6534URL url = "a string"; 6535 6536Example 2: matches 'b' (matcher = 6537opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6538int a = b ?: 1; 6539</pre></td></tr> 6540 6541 6542<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 6543<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6544functionDecl that have at least one TemplateArgument matching the given 6545InnerMatcher. 6546 6547Given 6548 template<typename T> class A {}; 6549 template<> class A<double> {}; 6550 A<int> a; 6551 6552 template<typename T> f() {}; 6553 void func() { f<int>(); }; 6554 6555classTemplateSpecializationDecl(hasAnyTemplateArgument( 6556 refersToType(asString("int")))) 6557 matches the specialization A<int> 6558 6559functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6560 matches the specialization f<int> 6561</pre></td></tr> 6562 6563 6564<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>> InnerMatcher</td></tr> 6565<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6566 6567Given 6568 template<typename T> class A {}; #1 6569 template<> class A<int> {}; #2 6570classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 6571 matches '#2' with classTemplateDecl() matching the class template 6572 declaration of 'A' at #1. 6573</pre></td></tr> 6574 6575 6576<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 6577<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6578functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6579 6580Given 6581 template<typename T, typename U> class A {}; 6582 A<bool, int> b; 6583 A<int, bool> c; 6584 6585 template<typename T> void f() {} 6586 void func() { f<int>(); }; 6587classTemplateSpecializationDecl(hasTemplateArgument( 6588 1, refersToType(asString("int")))) 6589 matches the specialization A<bool, int> 6590 6591functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6592 matches the specialization f<int> 6593</pre></td></tr> 6594 6595 6596<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6597<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 6598type. 6599 6600Given 6601 struct A {}; 6602 A a[7]; 6603 int b[7]; 6604arrayType(hasElementType(builtinType())) 6605 matches "int b[7]" 6606 6607Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 6608</pre></td></tr> 6609 6610 6611<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6612<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 6613a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6614 6615Given 6616 { {}; 1+2; } 6617hasAnySubstatement(compoundStmt()) 6618 matches '{ {}; 1+2; }' 6619with compoundStmt() 6620 matching '{}' 6621</pre></td></tr> 6622 6623 6624<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr> 6625<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 6626</pre></td></tr> 6627 6628 6629<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6630<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6631matches the given matcher. 6632 6633The associated declaration is: 6634- for type nodes, the declaration of the underlying type 6635- for CallExpr, the declaration of the callee 6636- for MemberExpr, the declaration of the referenced member 6637- for CXXConstructExpr, the declaration of the constructor 6638- for CXXNewExpr, the declaration of the operator new 6639- for ObjCIvarExpr, the declaration of the ivar 6640 6641For type nodes, hasDeclaration will generally match the declaration of the 6642sugared type. Given 6643 class X {}; 6644 typedef X Y; 6645 Y y; 6646in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6647typedefDecl. A common use case is to match the underlying, desugared type. 6648This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6649 varDecl(hasType(hasUnqualifiedDesugaredType( 6650 recordType(hasDeclaration(decl()))))) 6651In this matcher, the decl will match the CXXRecordDecl of class X. 6652 6653Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6654 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6655 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6656 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6657 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6658 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6659 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6660</pre></td></tr> 6661 6662 6663<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 6664<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6665specific using shadow declaration. 6666 6667Given 6668 namespace a { void f() {} } 6669 using a::f; 6670 void g() { 6671 f(); // Matches this .. 6672 a::f(); // .. but not this. 6673 } 6674declRefExpr(throughUsingDecl(anything())) 6675 matches f() 6676</pre></td></tr> 6677 6678 6679<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6680<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 6681specified matcher. 6682 6683Example matches x in if(x) 6684 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 6685 bool x; 6686 if (x) {} 6687</pre></td></tr> 6688 6689 6690<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6691<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 6692 6693Note that this does not work for global declarations because the AST 6694breaks up multiple-declaration DeclStmt's into multiple single-declaration 6695DeclStmt's. 6696Example: Given non-global declarations 6697 int a, b = 0; 6698 int c; 6699 int d = 2, e; 6700declStmt(containsDeclaration( 6701 0, varDecl(hasInitializer(anything())))) 6702 matches only 'int d = 2, e;', and 6703declStmt(containsDeclaration(1, varDecl())) 6704 matches 'int a, b = 0' as well as 'int d = 2, e;' 6705 but 'int c;' is not matched. 6706</pre></td></tr> 6707 6708 6709<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6710<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 6711 6712Given 6713 int a, b; 6714 int c; 6715declStmt(hasSingleDecl(anything())) 6716 matches 'int c;' but not 'int a, b;'. 6717</pre></td></tr> 6718 6719 6720<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6721<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 6722the inner matcher. 6723 6724Given 6725 int x; 6726declaratorDecl(hasTypeLoc(loc(asString("int")))) 6727 matches int x 6728</pre></td></tr> 6729 6730 6731<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6732<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 6733Decl, matches InnerMatcher. 6734 6735Given 6736 namespace N { 6737 namespace M { 6738 class D {}; 6739 } 6740 } 6741 6742cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 6743declaration of class D. 6744</pre></td></tr> 6745 6746 6747<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>></td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6748<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 6749 6750Given 6751 decltype(1) a = 1; 6752 decltype(2.0) b = 2.0; 6753decltypeType(hasUnderlyingType(isInteger())) 6754 matches the type of "a" 6755 6756Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 6757</pre></td></tr> 6758 6759 6760<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6761<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 6762 6763 6764<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6765<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 6766switch statement or conditional operator. 6767 6768Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6769 if (true) {} 6770</pre></td></tr> 6771 6772 6773<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 6774<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 6775matches InnerMatcher if the qualifier exists. 6776 6777Given 6778 namespace N { 6779 namespace M { 6780 class D {}; 6781 } 6782 } 6783 N::M::D d; 6784 6785elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 6786matches the type of the variable declaration of d. 6787</pre></td></tr> 6788 6789 6790<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6791<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 6792 6793Given 6794 namespace N { 6795 namespace M { 6796 class D {}; 6797 } 6798 } 6799 N::M::D d; 6800 6801elaboratedType(namesType(recordType( 6802hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 6803declaration of d. 6804</pre></td></tr> 6805 6806 6807<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6808<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 6809matches the given matcher. 6810 6811The associated declaration is: 6812- for type nodes, the declaration of the underlying type 6813- for CallExpr, the declaration of the callee 6814- for MemberExpr, the declaration of the referenced member 6815- for CXXConstructExpr, the declaration of the constructor 6816- for CXXNewExpr, the declaration of the operator new 6817- for ObjCIvarExpr, the declaration of the ivar 6818 6819For type nodes, hasDeclaration will generally match the declaration of the 6820sugared type. Given 6821 class X {}; 6822 typedef X Y; 6823 Y y; 6824in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6825typedefDecl. A common use case is to match the underlying, desugared type. 6826This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6827 varDecl(hasType(hasUnqualifiedDesugaredType( 6828 recordType(hasDeclaration(decl()))))) 6829In this matcher, the decl will match the CXXRecordDecl of class X. 6830 6831Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6832 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6833 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6834 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6835 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6836 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6837 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6838</pre></td></tr> 6839 6840 6841<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6842<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 6843 6844(Note: Clang's AST refers to other conversions as "casts" too, and calls 6845actual casts "explicit" casts.) 6846</pre></td></tr> 6847 6848 6849<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6850<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6851declaration's type. 6852 6853In case of a value declaration (for example a variable declaration), 6854this resolves one layer of indirection. For example, in the value 6855declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6856X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6857declaration of x. 6858 6859Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6860 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6861 and friend class X (matcher = friendDecl(hasType("X")) 6862 class X {}; 6863 void y(X &x) { x; X z; } 6864 class Y { friend class X; }; 6865 6866Example matches class Derived 6867(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6868class Base {}; 6869class Derived : Base {}; 6870 6871Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 6872Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6873</pre></td></tr> 6874 6875 6876<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6877<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 6878matcher. 6879 6880Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6881 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6882 and U (matcher = typedefDecl(hasType(asString("int"))) 6883 and friend class X (matcher = friendDecl(hasType("X")) 6884 class X {}; 6885 void y(X &x) { x; X z; } 6886 typedef int U; 6887 class Y { friend class X; }; 6888</pre></td></tr> 6889 6890 6891<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6892<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 6893elidable constructor and other corresponding bookkeeping nodes. 6894 6895In C++17, elidable copy constructors are no longer being generated in the 6896AST as it is not permitted by the standard. They are, however, part of the 6897AST in C++14 and earlier. So, a matcher must abstract over these differences 6898to work in all language modes. This matcher skips elidable constructor-call 6899AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 6900various implicit nodes inside the constructor calls, all of which will not 6901appear in the C++17 AST. 6902 6903Given 6904 6905struct H {}; 6906H G(); 6907void f() { 6908 H D = G(); 6909} 6910 6911``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 6912matches ``H D = G()`` in C++11 through C++17 (and beyond). 6913</pre></td></tr> 6914 6915 6916<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6917<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 6918are stripped off. 6919 6920Parentheses and explicit casts are not discarded. 6921Given 6922 int arr[5]; 6923 int a = 0; 6924 char b = 0; 6925 const int c = a; 6926 int *d = arr; 6927 long e = (long) 0l; 6928The matchers 6929 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 6930 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 6931would match the declarations for a, b, c, and d, but not e. 6932While 6933 varDecl(hasInitializer(integerLiteral())) 6934 varDecl(hasInitializer(declRefExpr())) 6935only match the declarations for b, c, and d. 6936</pre></td></tr> 6937 6938 6939<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6940<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 6941nodes are stripped off. 6942 6943Parentheses and explicit casts are not discarded. 6944Given 6945 class C {}; 6946 C a = C(); 6947 C b; 6948 C c = b; 6949The matchers 6950 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 6951would match the declarations for a, b, and c. 6952While 6953 varDecl(hasInitializer(cxxConstructExpr())) 6954only match the declarations for b and c. 6955</pre></td></tr> 6956 6957 6958<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6959<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 6960casts are stripped off. 6961 6962Implicit and non-C Style casts are also discarded. 6963Given 6964 int a = 0; 6965 char b = (0); 6966 void* c = reinterpret_cast<char*>(0); 6967 char d = char(0); 6968The matcher 6969 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 6970would match the declarations for a, b, c, and d. 6971while 6972 varDecl(hasInitializer(integerLiteral())) 6973only match the declaration for a. 6974</pre></td></tr> 6975 6976 6977<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6978<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 6979parentheses are stripped off. 6980 6981Explicit casts are not discarded. 6982Given 6983 int arr[5]; 6984 int a = 0; 6985 char b = (0); 6986 const int c = a; 6987 int *d = (arr); 6988 long e = ((long) 0l); 6989The matchers 6990 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 6991 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 6992would match the declarations for a, b, c, and d, but not e. 6993while 6994 varDecl(hasInitializer(integerLiteral())) 6995 varDecl(hasInitializer(declRefExpr())) 6996would only match the declaration for a. 6997</pre></td></tr> 6998 6999 7000<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7001<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7002 7003Given 7004 const char* str = ("my-string"); 7005The matcher 7006 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7007would match the implicit cast resulting from the assignment. 7008</pre></td></tr> 7009 7010 7011<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7012<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7013 7014Given 7015 class C { 7016 int a = 2; 7017 int b = 3; 7018 int c; 7019 }; 7020fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7021 matches 'int a;' but not 'int b;'. 7022fieldDecl(hasInClassInitializer(anything())) 7023 matches 'int a;' and 'int b;' but not 'int c;'. 7024</pre></td></tr> 7025 7026 7027<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7028<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7029 7030 7031<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7032<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7033switch statement or conditional operator. 7034 7035Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7036 if (true) {} 7037</pre></td></tr> 7038 7039 7040<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7041<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7042 7043Example: 7044 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7045matches '++x' in 7046 for (x; x < N; ++x) { } 7047</pre></td></tr> 7048 7049 7050<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7051<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7052 7053Example: 7054 forStmt(hasLoopInit(declStmt())) 7055matches 'int x = 0' in 7056 for (int x = 0; x < N; ++x) { } 7057</pre></td></tr> 7058 7059 7060<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7061<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7062declaration's type. 7063 7064In case of a value declaration (for example a variable declaration), 7065this resolves one layer of indirection. For example, in the value 7066declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7067X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7068declaration of x. 7069 7070Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7071 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7072 and friend class X (matcher = friendDecl(hasType("X")) 7073 class X {}; 7074 void y(X &x) { x; X z; } 7075 class Y { friend class X; }; 7076 7077Example matches class Derived 7078(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7079class Base {}; 7080class Derived : Base {}; 7081 7082Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 7083Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7084</pre></td></tr> 7085 7086 7087<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7088<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7089matcher. 7090 7091Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7092 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7093 and U (matcher = typedefDecl(hasType(asString("int"))) 7094 and friend class X (matcher = friendDecl(hasType("X")) 7095 class X {}; 7096 void y(X &x) { x; X z; } 7097 typedef int U; 7098 class Y { friend class X; }; 7099</pre></td></tr> 7100 7101 7102<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7103<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7104Note that this matcher matches all the declarations of a function whose 7105body is present in the AST. 7106 7107Given 7108 void f(); 7109 void f() {} 7110 void g(); 7111hasAnyBody(functionDecl()) 7112 matches both 'void f();' 7113 and 'void f() {}' 7114with compoundStmt() 7115 matching '{}' 7116 but does not match 'void g();' 7117</pre></td></tr> 7118 7119 7120<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7121<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7122block. 7123 7124Does not match the 'this' parameter of a method. 7125 7126Given 7127 class X { void f(int x, int y, int z) {} }; 7128cxxMethodDecl(hasAnyParameter(hasName("y"))) 7129 matches f(int x, int y, int z) {} 7130with hasAnyParameter(...) 7131 matching int y 7132 7133For ObjectiveC, given 7134 @interface I - (void) f:(int) y; @end 7135 7136the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7137matches the declaration of method f with hasParameter 7138matching y. 7139 7140For blocks, given 7141 b = ^(int y) { printf("%d", y) }; 7142 7143the matcher blockDecl(hasAnyParameter(hasName("y"))) 7144matches the declaration of the block b with hasParameter 7145matching y. 7146</pre></td></tr> 7147 7148 7149<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7150<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7151functionDecl that have at least one TemplateArgument matching the given 7152InnerMatcher. 7153 7154Given 7155 template<typename T> class A {}; 7156 template<> class A<double> {}; 7157 A<int> a; 7158 7159 template<typename T> f() {}; 7160 void func() { f<int>(); }; 7161 7162classTemplateSpecializationDecl(hasAnyTemplateArgument( 7163 refersToType(asString("int")))) 7164 matches the specialization A<int> 7165 7166functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7167 matches the specialization f<int> 7168</pre></td></tr> 7169 7170 7171<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7172<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7173 7174 7175<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7176<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7177declaration. 7178 7179Given 7180 template<bool b> 7181 struct S { 7182 S(int); // #1 7183 explicit S(double); // #2 7184 operator int(); // #3 7185 explicit operator bool(); // #4 7186 explicit(false) S(bool) // # 7 7187 explicit(true) S(char) // # 8 7188 explicit(b) S(S) // # 9 7189 }; 7190 S(int) -> S<true> // #5 7191 explicit S(double) -> S<false> // #6 7192cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7193cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7194cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7195</pre></td></tr> 7196 7197 7198<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7199<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7200declaration or a block. 7201 7202Given 7203 class X { void f(int x) {} }; 7204cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7205 matches f(int x) {} 7206with hasParameter(...) 7207 matching int x 7208 7209For ObjectiveC, given 7210 @interface I - (void) f:(int) y; @end 7211 7212the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7213matches the declaration of method f with hasParameter 7214matching y. 7215</pre></td></tr> 7216 7217 7218<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7219<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7220functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7221 7222Given 7223 template<typename T, typename U> class A {}; 7224 A<bool, int> b; 7225 A<int, bool> c; 7226 7227 template<typename T> void f() {} 7228 void func() { f<int>(); }; 7229classTemplateSpecializationDecl(hasTemplateArgument( 7230 1, refersToType(asString("int")))) 7231 matches the specialization A<bool, int> 7232 7233functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7234 matches the specialization f<int> 7235</pre></td></tr> 7236 7237 7238<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7239<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 7240 7241Given: 7242 class X { int f() { return 1; } }; 7243cxxMethodDecl(returns(asString("int"))) 7244 matches int f() { return 1; } 7245</pre></td></tr> 7246 7247 7248<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7249<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 7250switch statement or conditional operator. 7251 7252Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7253 if (true) {} 7254</pre></td></tr> 7255 7256 7257<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr> 7258<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 7259 7260Given 7261 if (A* a = GetAPointer()) {} 7262hasConditionVariableStatement(...) 7263 matches 'A* a = GetAPointer()'. 7264</pre></td></tr> 7265 7266 7267<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7268<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 7269 7270Examples matches the if statement 7271 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 7272 if (false) false; else true; 7273</pre></td></tr> 7274 7275 7276<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasInitStatement0')"><a name="hasInitStatement0Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7277<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 7278 7279Given: 7280 void foo() { 7281 if (int i = foobar(); i > 0) {} 7282 switch (int i = foobar(); i) {} 7283 for (auto& a = get_range(); auto& x : a) {} 7284 } 7285 void bar() { 7286 if (foobar() > 0) {} 7287 switch (foobar()) {} 7288 for (auto& x : get_range()) {} 7289 } 7290ifStmt(hasInitStatement(anything())) 7291 matches the if statement in foo but not in bar. 7292switchStmt(hasInitStatement(anything())) 7293 matches the switch statement in foo but not in bar. 7294cxxForRangeStmt(hasInitStatement(anything())) 7295 matches the range for statement in foo but not in bar. 7296</pre></td></tr> 7297 7298 7299<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7300<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 7301 7302Examples matches the if statement 7303 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 7304 if (false) true; else false; 7305</pre></td></tr> 7306 7307 7308<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7309<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 7310matcher. 7311 7312FIXME: Unit test this matcher 7313</pre></td></tr> 7314 7315 7316<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7317<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 7318 7319Example matches y. 7320 (matcher = initListExpr(hasInit(0, expr()))) 7321 int x{y}. 7322</pre></td></tr> 7323 7324 7325<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7326<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 7327(if expression have it). 7328</pre></td></tr> 7329 7330 7331<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7332<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 7333matches the given matcher. 7334 7335The associated declaration is: 7336- for type nodes, the declaration of the underlying type 7337- for CallExpr, the declaration of the callee 7338- for MemberExpr, the declaration of the referenced member 7339- for CXXConstructExpr, the declaration of the constructor 7340- for CXXNewExpr, the declaration of the operator new 7341- for ObjCIvarExpr, the declaration of the ivar 7342 7343For type nodes, hasDeclaration will generally match the declaration of the 7344sugared type. Given 7345 class X {}; 7346 typedef X Y; 7347 Y y; 7348in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7349typedefDecl. A common use case is to match the underlying, desugared type. 7350This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7351 varDecl(hasType(hasUnqualifiedDesugaredType( 7352 recordType(hasDeclaration(decl()))))) 7353In this matcher, the decl will match the CXXRecordDecl of class X. 7354 7355Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7356 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7357 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7358 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7359 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7360 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7361 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7362</pre></td></tr> 7363 7364 7365<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7366<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 7367matches the given matcher. 7368 7369The associated declaration is: 7370- for type nodes, the declaration of the underlying type 7371- for CallExpr, the declaration of the callee 7372- for MemberExpr, the declaration of the referenced member 7373- for CXXConstructExpr, the declaration of the constructor 7374- for CXXNewExpr, the declaration of the operator new 7375- for ObjCIvarExpr, the declaration of the ivar 7376 7377For type nodes, hasDeclaration will generally match the declaration of the 7378sugared type. Given 7379 class X {}; 7380 typedef X Y; 7381 Y y; 7382in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7383typedefDecl. A common use case is to match the underlying, desugared type. 7384This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7385 varDecl(hasType(hasUnqualifiedDesugaredType( 7386 recordType(hasDeclaration(decl()))))) 7387In this matcher, the decl will match the CXXRecordDecl of class X. 7388 7389Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7390 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7391 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7392 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7393 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7394 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7395 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7396</pre></td></tr> 7397 7398 7399<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>> InnerMatcher</td></tr> 7400<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 7401 7402Given 7403 struct foo { 7404 void bar() { 7405 auto f = [this](){}; 7406 } 7407 } 7408lambdaExpr(hasAnyCapture(cxxThisExpr())) 7409 matches [this](){}; 7410</pre></td></tr> 7411 7412 7413<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 7414<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 7415 7416Given 7417 void foo() { 7418 int x; 7419 auto f = [x](){}; 7420 } 7421lambdaExpr(hasAnyCapture(anything())) 7422 matches [x](){}; 7423</pre></td></tr> 7424 7425 7426<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7427<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 7428matches the given matcher. 7429 7430The associated declaration is: 7431- for type nodes, the declaration of the underlying type 7432- for CallExpr, the declaration of the callee 7433- for MemberExpr, the declaration of the referenced member 7434- for CXXConstructExpr, the declaration of the constructor 7435- for CXXNewExpr, the declaration of the operator new 7436- for ObjCIvarExpr, the declaration of the ivar 7437 7438For type nodes, hasDeclaration will generally match the declaration of the 7439sugared type. Given 7440 class X {}; 7441 typedef X Y; 7442 Y y; 7443in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7444typedefDecl. A common use case is to match the underlying, desugared type. 7445This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7446 varDecl(hasType(hasUnqualifiedDesugaredType( 7447 recordType(hasDeclaration(decl()))))) 7448In this matcher, the decl will match the CXXRecordDecl of class X. 7449 7450Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7451 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7452 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7453 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7454 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7455 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7456 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7457</pre></td></tr> 7458 7459 7460<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7461<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 7462given matcher. Implicit object expressions are included; that is, it matches 7463use of implicit `this`. 7464 7465Given 7466 struct X { 7467 int m; 7468 int f(X x) { x.m; return m; } 7469 }; 7470memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7471 matches `x.m`, but not `m`; however, 7472memberExpr(hasObjectExpression(hasType(pointsTo( 7473 cxxRecordDecl(hasName("X")))))) 7474 matches `m` (aka. `this->m`), but not `x.m`. 7475</pre></td></tr> 7476 7477 7478<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 7479<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 7480given matcher. 7481 7482Given 7483 struct { int first, second; } first, second; 7484 int i(second.first); 7485 int j(first.second); 7486memberExpr(member(hasName("first"))) 7487 matches second.first 7488 but not first.second (because the member name there is "second"). 7489</pre></td></tr> 7490 7491 7492<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7493<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 7494pointee matches a given matcher. 7495 7496Given 7497 int *a; 7498 int const *b; 7499 float const *f; 7500pointerType(pointee(isConstQualified(), isInteger())) 7501 matches "int const *b" 7502 7503Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 7504 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 7505</pre></td></tr> 7506 7507 7508<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 7509<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7510matcher. 7511 7512Given 7513 namespace N { template<class T> void f(T t); } 7514 template <class T> void g() { using N::f; f(T()); } 7515unresolvedLookupExpr(hasAnyDeclaration( 7516 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7517 matches the use of f in g() . 7518</pre></td></tr> 7519 7520 7521<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr> 7522<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 7523 7524Given 7525 struct A { struct B { struct C {}; }; }; 7526 A::B::C c; 7527nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 7528 matches "A::" 7529</pre></td></tr> 7530 7531 7532<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 7533<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7534NestedNameSpecifier-matcher matches. 7535</pre></td></tr> 7536 7537 7538<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 7539<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7540given TypeLoc. 7541 7542Given 7543 struct A { struct B { struct C {}; }; }; 7544 A::B::C c; 7545nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7546 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7547 matches "A::" 7548</pre></td></tr> 7549 7550 7551<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 7552<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7553 7554Given 7555 struct A { struct B { struct C {}; }; }; 7556 A::B::C c; 7557nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7558 matches "A::" 7559</pre></td></tr> 7560 7561 7562<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr> 7563<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7564given namespace matcher. 7565 7566Given 7567 namespace ns { struct A {}; } 7568 ns::A a; 7569nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7570 matches "ns::" 7571</pre></td></tr> 7572 7573 7574<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7575<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7576given QualType matcher without qualifiers. 7577 7578Given 7579 struct A { struct B { struct C {}; }; }; 7580 A::B::C c; 7581nestedNameSpecifier(specifiesType( 7582 hasDeclaration(cxxRecordDecl(hasName("A"))) 7583)) 7584 matches "A::" 7585</pre></td></tr> 7586 7587 7588<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>> InnerMatcher</td></tr> 7589<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7590 7591Given 7592 7593 #pragma omp parallel 7594 #pragma omp parallel default(none) 7595 7596``ompExecutableDirective(hasAnyClause(anything()))`` matches 7597``omp parallel default(none)``. 7598</pre></td></tr> 7599 7600 7601<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7602<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 7603 7604Prerequisite: the executable directive must not be standalone directive. 7605If it is, it will never match. 7606 7607Given 7608 7609 #pragma omp parallel 7610 ; 7611 #pragma omp parallel 7612 {} 7613 7614``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 7615</pre></td></tr> 7616 7617 7618<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 7619<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 7620matching Base, or Objective-C classes that directly or indirectly 7621subclass a class matching Base. 7622 7623Note that a class is not considered to be derived from itself. 7624 7625Example matches Y, Z, C (Base == hasName("X")) 7626 class X; 7627 class Y : public X {}; // directly derived 7628 class Z : public Y {}; // indirectly derived 7629 typedef X A; 7630 typedef A B; 7631 class C : public B {}; // derived from a typedef of X 7632 7633In the following example, Bar matches isDerivedFrom(hasName("X")): 7634 class Foo; 7635 typedef Foo X; 7636 class Bar : public Foo {}; // derived from a type that X is a typedef of 7637 7638In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7639 @interface NSObject @end 7640 @interface Bar : NSObject @end 7641 7642Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>> 7643</pre></td></tr> 7644 7645 7646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 7647<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7648matching Base. 7649 7650Note that a class is not considered to be derived from itself. 7651 7652Example matches Y, C (Base == hasName("X")) 7653 class X; 7654 class Y : public X {}; // directly derived 7655 class Z : public Y {}; // indirectly derived 7656 typedef X A; 7657 typedef A B; 7658 class C : public B {}; // derived from a typedef of X 7659 7660In the following example, Bar matches isDerivedFrom(hasName("X")): 7661 class Foo; 7662 typedef Foo X; 7663 class Bar : public Foo {}; // derived from a type that X is a typedef of 7664</pre></td></tr> 7665 7666 7667<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 7668<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7669match Base. 7670</pre></td></tr> 7671 7672 7673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7674<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 7675expression, or an ObjC-message-send expression. 7676 7677Given 7678 void x(int, int, int) { int y; x(1, y, 42); } 7679callExpr(hasAnyArgument(declRefExpr())) 7680 matches x(1, y, 42) 7681with hasAnyArgument(...) 7682 matching y 7683 7684For ObjectiveC, given 7685 @interface I - (void) f:(int) y; @end 7686 void foo(I *i) { [i f:12]; } 7687objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7688 matches [i f:12] 7689</pre></td></tr> 7690 7691 7692<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument3')"><a name="hasArgument3Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7693<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 7694call expression. 7695 7696Example matches y in x(y) 7697 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7698 void x(int) { int y; x(y); } 7699</pre></td></tr> 7700 7701 7702<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7703<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 7704and the inner matcher matches on that instance. 7705 7706For example the method call in 7707 NSString *x = @"hello"; 7708 [x containsString:@"h"]; 7709is matched by 7710objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 7711</pre></td></tr> 7712 7713 7714<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7715<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 7716 7717Example 7718matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 7719matches the [webView ...] message invocation. 7720 NSString *webViewJavaScript = ... 7721 UIWebView *webView = ... 7722 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 7723</pre></td></tr> 7724 7725 7726<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7727<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 7728block. 7729 7730Does not match the 'this' parameter of a method. 7731 7732Given 7733 class X { void f(int x, int y, int z) {} }; 7734cxxMethodDecl(hasAnyParameter(hasName("y"))) 7735 matches f(int x, int y, int z) {} 7736with hasAnyParameter(...) 7737 matching int y 7738 7739For ObjectiveC, given 7740 @interface I - (void) f:(int) y; @end 7741 7742the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7743matches the declaration of method f with hasParameter 7744matching y. 7745 7746For blocks, given 7747 b = ^(int y) { printf("%d", y) }; 7748 7749the matcher blockDecl(hasAnyParameter(hasName("y"))) 7750matches the declaration of the block b with hasParameter 7751matching y. 7752</pre></td></tr> 7753 7754 7755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7756<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 7757declaration or a block. 7758 7759Given 7760 class X { void f(int x) {} }; 7761cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7762 matches f(int x) {} 7763with hasParameter(...) 7764 matching int x 7765 7766For ObjectiveC, given 7767 @interface I - (void) f:(int) y; @end 7768 7769the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7770matches the declaration of method f with hasParameter 7771matching y. 7772</pre></td></tr> 7773 7774 7775<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7776<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 7777or opaque value's source expression matches the given matcher. 7778 7779Example 1: matches "a string" 7780(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7781class URL { URL(string); }; 7782URL url = "a string"; 7783 7784Example 2: matches 'b' (matcher = 7785opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7786int a = b ?: 1; 7787</pre></td></tr> 7788 7789 7790<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>></td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7791<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 7792overloads matches the given matcher. 7793 7794Given 7795 template <typename T> void foo(T); 7796 template <typename T> void bar(T); 7797 template <typename T> void baz(T t) { 7798 foo(t); 7799 bar(t); 7800 } 7801unresolvedLookupExpr(hasAnyDeclaration( 7802 functionTemplateDecl(hasName("foo")))) 7803 matches foo in foo(t); but not bar in bar(t); 7804</pre></td></tr> 7805 7806 7807<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7808<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 7809 7810Given 7811 int (*ptr_to_array)[4]; 7812 int (*ptr_to_func)(int); 7813 7814varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 7815ptr_to_func but not ptr_to_array. 7816 7817Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 7818</pre></td></tr> 7819 7820 7821<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7822<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 7823pointee matches a given matcher. 7824 7825Given 7826 int *a; 7827 int const *b; 7828 float const *f; 7829pointerType(pointee(isConstQualified(), isInteger())) 7830 matches "int const *b" 7831 7832Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 7833 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 7834</pre></td></tr> 7835 7836 7837<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7838<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 7839 7840Given: 7841 typedef int &int_ref; 7842 int a; 7843 int_ref b = a; 7844 7845varDecl(hasType(qualType(referenceType()))))) will not match the 7846declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 7847</pre></td></tr> 7848 7849 7850<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7851<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 7852matches the given matcher. 7853 7854The associated declaration is: 7855- for type nodes, the declaration of the underlying type 7856- for CallExpr, the declaration of the callee 7857- for MemberExpr, the declaration of the referenced member 7858- for CXXConstructExpr, the declaration of the constructor 7859- for CXXNewExpr, the declaration of the operator new 7860- for ObjCIvarExpr, the declaration of the ivar 7861 7862For type nodes, hasDeclaration will generally match the declaration of the 7863sugared type. Given 7864 class X {}; 7865 typedef X Y; 7866 Y y; 7867in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7868typedefDecl. A common use case is to match the underlying, desugared type. 7869This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7870 varDecl(hasType(hasUnqualifiedDesugaredType( 7871 recordType(hasDeclaration(decl()))))) 7872In this matcher, the decl will match the CXXRecordDecl of class X. 7873 7874Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7875 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7876 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7877 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7878 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7879 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7880 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7881</pre></td></tr> 7882 7883 7884<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7885<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 7886 7887Given 7888 void (*fp)(void); 7889The matcher 7890 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 7891would match the declaration for fp. 7892</pre></td></tr> 7893 7894 7895<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7896<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 7897</pre></td></tr> 7898 7899 7900<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7901<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 7902matches the specified matcher. 7903 7904Example matches y->x() 7905 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 7906 cxxRecordDecl(hasName("Y"))))))) 7907 class Y { public: void x(); }; 7908 void z() { Y *y; y->x(); } 7909</pre></td></tr> 7910 7911 7912<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7913<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 7914</pre></td></tr> 7915 7916 7917<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7918<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 7919type matches the specified matcher. 7920 7921Example matches X &x and const X &y 7922 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 7923 class X { 7924 void a(X b) { 7925 X &x = b; 7926 const X &y = b; 7927 } 7928 }; 7929</pre></td></tr> 7930 7931 7932<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7933<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 7934matches the given matcher. 7935 7936The associated declaration is: 7937- for type nodes, the declaration of the underlying type 7938- for CallExpr, the declaration of the callee 7939- for MemberExpr, the declaration of the referenced member 7940- for CXXConstructExpr, the declaration of the constructor 7941- for CXXNewExpr, the declaration of the operator new 7942- for ObjCIvarExpr, the declaration of the ivar 7943 7944For type nodes, hasDeclaration will generally match the declaration of the 7945sugared type. Given 7946 class X {}; 7947 typedef X Y; 7948 Y y; 7949in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7950typedefDecl. A common use case is to match the underlying, desugared type. 7951This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7952 varDecl(hasType(hasUnqualifiedDesugaredType( 7953 recordType(hasDeclaration(decl()))))) 7954In this matcher, the decl will match the CXXRecordDecl of class X. 7955 7956Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7957 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7958 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7959 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7960 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7961 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7962 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7963</pre></td></tr> 7964 7965 7966<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7967<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 7968pointee matches a given matcher. 7969 7970Given 7971 int *a; 7972 int const *b; 7973 float const *f; 7974pointerType(pointee(isConstQualified(), isInteger())) 7975 matches "int const *b" 7976 7977Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 7978 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 7979</pre></td></tr> 7980 7981 7982<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>></td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7983<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 7984 7985Given 7986 return a + b; 7987hasReturnValue(binaryOperator()) 7988 matches 'return a + b' 7989with binaryOperator() 7990 matching 'a + b' 7991</pre></td></tr> 7992 7993 7994<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7995<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 7996a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7997 7998Given 7999 { {}; 1+2; } 8000hasAnySubstatement(compoundStmt()) 8001 matches '{ {}; 1+2; }' 8002with compoundStmt() 8003 matching '{}' 8004</pre></td></tr> 8005 8006 8007<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 8008<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8009alignof. 8010</pre></td></tr> 8011 8012 8013<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr> 8014<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 8015 8016Given: 8017F& operator=(const F& o) { 8018 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8019 return *this; 8020} 8021returnStmt(forFunction(hasName("operator="))) 8022 matches 'return *this' 8023 but does not match 'return v > 0' 8024</pre></td></tr> 8025 8026 8027<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 8028<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8029sizeof. 8030</pre></td></tr> 8031 8032 8033<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 8034<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8035type that matches the provided matcher. 8036 8037Given 8038 template <typename T> 8039 double F(T t); 8040 int i; 8041 double j = F(i); 8042 8043substTemplateTypeParmType(hasReplacementType(type())) matches int 8044</pre></td></tr> 8045 8046 8047<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr> 8048<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8049statement. This matcher may produce multiple matches. 8050 8051Given 8052 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8053switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8054 matches four times, with "c" binding each of "case 1:", "case 2:", 8055"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8056"switch (1)", "switch (2)" and "switch (2)". 8057</pre></td></tr> 8058 8059 8060<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8061<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8062switch statement or conditional operator. 8063 8064Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8065 if (true) {} 8066</pre></td></tr> 8067 8068 8069<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8070<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8071 8072Given: 8073 void foo() { 8074 if (int i = foobar(); i > 0) {} 8075 switch (int i = foobar(); i) {} 8076 for (auto& a = get_range(); auto& x : a) {} 8077 } 8078 void bar() { 8079 if (foobar() > 0) {} 8080 switch (foobar()) {} 8081 for (auto& x : get_range()) {} 8082 } 8083ifStmt(hasInitStatement(anything())) 8084 matches the if statement in foo but not in bar. 8085switchStmt(hasInitStatement(anything())) 8086 matches the switch statement in foo but not in bar. 8087cxxForRangeStmt(hasInitStatement(anything())) 8088 matches the range for statement in foo but not in bar. 8089</pre></td></tr> 8090 8091 8092<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8093<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8094matches the given matcher. 8095 8096The associated declaration is: 8097- for type nodes, the declaration of the underlying type 8098- for CallExpr, the declaration of the callee 8099- for MemberExpr, the declaration of the referenced member 8100- for CXXConstructExpr, the declaration of the constructor 8101- for CXXNewExpr, the declaration of the operator new 8102- for ObjCIvarExpr, the declaration of the ivar 8103 8104For type nodes, hasDeclaration will generally match the declaration of the 8105sugared type. Given 8106 class X {}; 8107 typedef X Y; 8108 Y y; 8109in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8110typedefDecl. A common use case is to match the underlying, desugared type. 8111This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8112 varDecl(hasType(hasUnqualifiedDesugaredType( 8113 recordType(hasDeclaration(decl()))))) 8114In this matcher, the decl will match the CXXRecordDecl of class X. 8115 8116Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8117 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8118 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8119 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8120 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8121 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8122 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8123</pre></td></tr> 8124 8125 8126<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8127<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8128 8129Given 8130 struct B { int next; }; 8131 template<int(B::*next_ptr)> struct A {}; 8132 A<&B::next> a; 8133templateSpecializationType(hasAnyTemplateArgument( 8134 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8135 matches the specialization A<&B::next> with fieldDecl(...) matching 8136 B::next 8137</pre></td></tr> 8138 8139 8140<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8141<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 8142declaration. 8143 8144Given 8145 struct B { int next; }; 8146 template<int(B::*next_ptr)> struct A {}; 8147 A<&B::next> a; 8148classTemplateSpecializationDecl(hasAnyTemplateArgument( 8149 refersToDeclaration(fieldDecl(hasName("next"))))) 8150 matches the specialization A<&B::next> with fieldDecl(...) matching 8151 B::next 8152</pre></td></tr> 8153 8154 8155<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8156<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 8157 8158Given 8159 template<int T> struct C {}; 8160 C<42> c; 8161classTemplateSpecializationDecl( 8162 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 8163 matches the implicit instantiation of C in C<42>. 8164</pre></td></tr> 8165 8166 8167<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>> InnerMatcher</td></tr> 8168<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 8169 8170Given 8171 template<template <typename> class S> class X {}; 8172 template<typename T> class Y {}; 8173 X<Y> xi; 8174classTemplateSpecializationDecl(hasAnyTemplateArgument( 8175 refersToTemplate(templateName()))) 8176 matches the specialization X<Y> 8177</pre></td></tr> 8178 8179 8180<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8181<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 8182 8183Given 8184 struct X {}; 8185 template<typename T> struct A {}; 8186 A<X> a; 8187classTemplateSpecializationDecl(hasAnyTemplateArgument( 8188 refersToType(class(hasName("X"))))) 8189 matches the specialization A<X> 8190</pre></td></tr> 8191 8192 8193<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 8194<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8195functionDecl that have at least one TemplateArgument matching the given 8196InnerMatcher. 8197 8198Given 8199 template<typename T> class A {}; 8200 template<> class A<double> {}; 8201 A<int> a; 8202 8203 template<typename T> f() {}; 8204 void func() { f<int>(); }; 8205 8206classTemplateSpecializationDecl(hasAnyTemplateArgument( 8207 refersToType(asString("int")))) 8208 matches the specialization A<int> 8209 8210functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8211 matches the specialization f<int> 8212</pre></td></tr> 8213 8214 8215<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8216<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 8217matches the given matcher. 8218 8219The associated declaration is: 8220- for type nodes, the declaration of the underlying type 8221- for CallExpr, the declaration of the callee 8222- for MemberExpr, the declaration of the referenced member 8223- for CXXConstructExpr, the declaration of the constructor 8224- for CXXNewExpr, the declaration of the operator new 8225- for ObjCIvarExpr, the declaration of the ivar 8226 8227For type nodes, hasDeclaration will generally match the declaration of the 8228sugared type. Given 8229 class X {}; 8230 typedef X Y; 8231 Y y; 8232in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8233typedefDecl. A common use case is to match the underlying, desugared type. 8234This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8235 varDecl(hasType(hasUnqualifiedDesugaredType( 8236 recordType(hasDeclaration(decl()))))) 8237In this matcher, the decl will match the CXXRecordDecl of class X. 8238 8239Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8240 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8241 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8242 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8243 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8244 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8245 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8246</pre></td></tr> 8247 8248 8249<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 8250<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8251functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8252 8253Given 8254 template<typename T, typename U> class A {}; 8255 A<bool, int> b; 8256 A<int, bool> c; 8257 8258 template<typename T> void f() {} 8259 void func() { f<int>(); }; 8260classTemplateSpecializationDecl(hasTemplateArgument( 8261 1, refersToType(asString("int")))) 8262 matches the specialization A<bool, int> 8263 8264functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8265 matches the specialization f<int> 8266</pre></td></tr> 8267 8268 8269<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8270<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 8271matches the given matcher. 8272 8273The associated declaration is: 8274- for type nodes, the declaration of the underlying type 8275- for CallExpr, the declaration of the callee 8276- for MemberExpr, the declaration of the referenced member 8277- for CXXConstructExpr, the declaration of the constructor 8278- for CXXNewExpr, the declaration of the operator new 8279- for ObjCIvarExpr, the declaration of the ivar 8280 8281For type nodes, hasDeclaration will generally match the declaration of the 8282sugared type. Given 8283 class X {}; 8284 typedef X Y; 8285 Y y; 8286in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8287typedefDecl. A common use case is to match the underlying, desugared type. 8288This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8289 varDecl(hasType(hasUnqualifiedDesugaredType( 8290 recordType(hasDeclaration(decl()))))) 8291In this matcher, the decl will match the CXXRecordDecl of class X. 8292 8293Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8294 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8295 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8296 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8297 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8298 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8299 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8300</pre></td></tr> 8301 8302 8303<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8304<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 8305QualType-matcher matches. 8306</pre></td></tr> 8307 8308 8309<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8310<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 8311matcher. 8312 8313Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8314 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8315 and U (matcher = typedefDecl(hasType(asString("int"))) 8316 and friend class X (matcher = friendDecl(hasType("X")) 8317 class X {}; 8318 void y(X &x) { x; X z; } 8319 typedef int U; 8320 class Y { friend class X; }; 8321</pre></td></tr> 8322 8323 8324<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8325<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 8326matches the given matcher. 8327 8328The associated declaration is: 8329- for type nodes, the declaration of the underlying type 8330- for CallExpr, the declaration of the callee 8331- for MemberExpr, the declaration of the referenced member 8332- for CXXConstructExpr, the declaration of the constructor 8333- for CXXNewExpr, the declaration of the operator new 8334- for ObjCIvarExpr, the declaration of the ivar 8335 8336For type nodes, hasDeclaration will generally match the declaration of the 8337sugared type. Given 8338 class X {}; 8339 typedef X Y; 8340 Y y; 8341in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8342typedefDecl. A common use case is to match the underlying, desugared type. 8343This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8344 varDecl(hasType(hasUnqualifiedDesugaredType( 8345 recordType(hasDeclaration(decl()))))) 8346In this matcher, the decl will match the CXXRecordDecl of class X. 8347 8348Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8349 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8350 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8351 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8352 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8353 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8354 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8355</pre></td></tr> 8356 8357 8358<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>> InnerMatcher</td></tr> 8359<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 8360type of the matched node. 8361 8362For example, in: 8363 class A {}; 8364 using B = A; 8365The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 8366both B and A. 8367</pre></td></tr> 8368 8369 8370<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8371<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 8372 8373Given 8374 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 8375unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 8376 matches sizeof(a) and alignof(c) 8377</pre></td></tr> 8378 8379 8380<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8381<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 8382 8383Example matches true (matcher = hasUnaryOperand( 8384 cxxBoolLiteral(equals(true)))) 8385 !true 8386</pre></td></tr> 8387 8388 8389<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8390<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 8391given matcher. Implicit object expressions are included; that is, it matches 8392use of implicit `this`. 8393 8394Given 8395 struct X { 8396 int m; 8397 int f(X x) { x.m; return m; } 8398 }; 8399memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8400 matches `x.m`, but not `m`; however, 8401memberExpr(hasObjectExpression(hasType(pointsTo( 8402 cxxRecordDecl(hasName("X")))))) 8403 matches `m` (aka. `this->m`), but not `x.m`. 8404</pre></td></tr> 8405 8406 8407<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8408<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 8409matches the given matcher. 8410 8411The associated declaration is: 8412- for type nodes, the declaration of the underlying type 8413- for CallExpr, the declaration of the callee 8414- for MemberExpr, the declaration of the referenced member 8415- for CXXConstructExpr, the declaration of the constructor 8416- for CXXNewExpr, the declaration of the operator new 8417- for ObjCIvarExpr, the declaration of the ivar 8418 8419For type nodes, hasDeclaration will generally match the declaration of the 8420sugared type. Given 8421 class X {}; 8422 typedef X Y; 8423 Y y; 8424in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8425typedefDecl. A common use case is to match the underlying, desugared type. 8426This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8427 varDecl(hasType(hasUnqualifiedDesugaredType( 8428 recordType(hasDeclaration(decl()))))) 8429In this matcher, the decl will match the CXXRecordDecl of class X. 8430 8431Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8432 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8433 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8434 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8435 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8436 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8437 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8438</pre></td></tr> 8439 8440 8441<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 8442<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 8443 8444Given 8445 namespace X { void b(); } 8446 using X::b; 8447usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 8448 matches using X::b </pre></td></tr> 8449 8450 8451<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 8452<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 8453matched by the given matcher. 8454 8455Given 8456 namespace X { int a; void b(); } 8457 using X::a; 8458 using X::b; 8459usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 8460 matches using X::b but not using X::a </pre></td></tr> 8461 8462 8463<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8464<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8465declaration's type. 8466 8467In case of a value declaration (for example a variable declaration), 8468this resolves one layer of indirection. For example, in the value 8469declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8470X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8471declaration of x. 8472 8473Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8474 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8475 and friend class X (matcher = friendDecl(hasType("X")) 8476 class X {}; 8477 void y(X &x) { x; X z; } 8478 class Y { friend class X; }; 8479 8480Example matches class Derived 8481(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8482class Base {}; 8483class Derived : Base {}; 8484 8485Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 8486Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8487</pre></td></tr> 8488 8489 8490<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8491<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 8492matcher. 8493 8494Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8495 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8496 and U (matcher = typedefDecl(hasType(asString("int"))) 8497 and friend class X (matcher = friendDecl(hasType("X")) 8498 class X {}; 8499 void y(X &x) { x; X z; } 8500 typedef int U; 8501 class Y { friend class X; }; 8502</pre></td></tr> 8503 8504 8505<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8506<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 8507that matches the given matcher. 8508 8509Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8510 bool y() { return true; } 8511 bool x = y(); 8512</pre></td></tr> 8513 8514 8515<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8516<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 8517expression. 8518 8519Given 8520 void f(int b) { 8521 int a[b]; 8522 } 8523variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 8524 varDecl(hasName("b"))))))) 8525 matches "int a[b]" 8526</pre></td></tr> 8527 8528 8529<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8530<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 8531 8532 8533<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8534<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8535switch statement or conditional operator. 8536 8537Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8538 if (true) {} 8539</pre></td></tr> 8540 8541<!--END_TRAVERSAL_MATCHERS --> 8542</table> 8543 8544</div> 8545</body> 8546</html> 8547 8548 8549