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 502 503 504 505 506<tr> 507 <td>Rewritten binary operators 508<pre> 509binaryOperator( 510 hasOperatorName("<"), 511 hasRHS(integerLiteral(equals(0))) 512 ) 513</pre> 514given: 515<pre> 516#include <compare> 517 518class HasSpaceship { 519public: 520 int x; 521 bool operator==(const HasSpaceship&) const = default; 522 std::strong_ordering operator<=>(const HasSpaceship&) const = default; 523}; 524 525bool isLess(const HasSpaceship& a, const HasSpaceship& b) { 526 return a < b; 527} 528</pre> 529</td> 530<td> 5311 match found. 532</td> 533<td> 534No match found. 535</td> 536</tr> 537</table> 538 539<!-- ======================================================================= --> 540<h2 id="decl-matchers">Node Matchers</h2> 541<!-- ======================================================================= --> 542 543<p>Node matchers are at the core of matcher expressions - they specify the type 544of node that is expected. Every match expression starts with a node matcher, 545which can then be further refined with a narrowing or traversal matcher. All 546traversal matchers take node matchers as their arguments.</p> 547 548<p>For convenience, all node matchers take an arbitrary number of arguments 549and implicitly act as allOf matchers.</p> 550 551<p>Node matchers are the only matchers that support the bind("id") call to 552bind the matched node to the given string, to be later retrieved from the 553match callback.</p> 554 555<p>It is important to remember that the arguments to node matchers are 556predicates on the same node, just with additional information about the type. 557This is often useful to make matcher expression more readable by inlining bind 558calls into redundant node matchers inside another node matcher: 559<pre> 560// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 561// the same node. 562recordDecl(decl().bind("id"), hasName("::MyClass")) 563</pre> 564</p> 565 566<table> 567<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 568<!-- START_DECL_MATCHERS --> 569 570<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> 571<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 572 573Examples matches i(42). 574 class C { 575 C() : i(42) {} 576 int i; 577 }; 578</pre></td></tr> 579 580 581<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> 582<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 583 584Given 585 class C { 586 public: 587 int a; 588 }; 589accessSpecDecl() 590 matches 'public:' 591</pre></td></tr> 592 593 594<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>>...</td></tr> 595<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 596Example matches foo and bar 597(matcher = bindingDecl() 598 599 auto [foo, bar] = std::make_pair{42, 42}; 600</pre></td></tr> 601 602 603<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> 604<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 605 606Example matches the declaration of the nameless block printing an input 607integer. 608 609 myFunc(^(int p) { 610 printf("%d", p); 611 }) 612</pre></td></tr> 613 614 615<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> 616<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 617 618Example matches Z 619 template<class T> class Z {}; 620</pre></td></tr> 621 622 623<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> 624<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 625 626Given 627 template<class T1, class T2, int I> 628 class A {}; 629 630 template<class T, int I> 631 class A<T, T*, I> {}; 632 633 template<> 634 class A<int, int, 1> {}; 635classTemplatePartialSpecializationDecl() 636 matches the specialization A<T,T*,I> but not A<int,int,1> 637</pre></td></tr> 638 639 640<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> 641<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 642 643Given 644 template<typename T> class A {}; 645 template<> class A<double> {}; 646 A<int> a; 647classTemplateSpecializationDecl() 648 matches the specializations A<int> and A<double> 649</pre></td></tr> 650 651 652<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> 653<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 654 655Example matches Foo::Foo() and Foo::Foo(int) 656 class Foo { 657 public: 658 Foo(); 659 Foo(int); 660 int DoSomething(); 661 }; 662</pre></td></tr> 663 664 665<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> 666<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 667 668Example matches the operator. 669 class X { operator int() const; }; 670</pre></td></tr> 671 672 673<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> 674<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 675 676Example matches the deduction guide. 677 template<typename T> 678 class X { X(int) }; 679 X(int) -> X<int>; 680</pre></td></tr> 681 682 683<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> 684<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 685 686Example matches Foo::~Foo() 687 class Foo { 688 public: 689 virtual ~Foo(); 690 }; 691</pre></td></tr> 692 693 694<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> 695<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 696 697Example matches y 698 class X { void y(); }; 699</pre></td></tr> 700 701 702<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> 703<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 704 705Example matches X, Z 706 class X; 707 template<class T> class Z {}; 708</pre></td></tr> 709 710 711<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> 712<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 713 714Examples matches X, C, and the friend declaration inside C; 715 void X(); 716 class C { 717 friend X; 718 }; 719</pre></td></tr> 720 721 722<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> 723<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 724and non-type template parameter declarations). 725 726Given 727 class X { int y; }; 728declaratorDecl() 729 matches int y. 730</pre></td></tr> 731 732 733<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</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> 734<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 735 736Examples matches the declaration node with foo and bar, but not 737number. 738(matcher = declStmt(has(decompositionDecl()))) 739 740 int number = 42; 741 auto [foo, bar] = std::make_pair{42, 42}; 742</pre></td></tr> 743 744 745<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> 746<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 747 748Example matches A, B, C 749 enum X { 750 A, B, C 751 }; 752</pre></td></tr> 753 754 755<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> 756<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 757 758Example matches X 759 enum X { 760 A, B, C 761 }; 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('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 766<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 767 768Given 769 class X { int m; }; 770fieldDecl() 771 matches 'm'. 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('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 776<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 777 778Given 779 class X { friend void foo(); }; 780friendDecl() 781 matches 'friend void foo()'. 782</pre></td></tr> 783 784 785<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> 786<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 787 788Example matches f 789 void f(); 790</pre></td></tr> 791 792 793<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> 794<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 795 796Example matches f 797 template<class T> void f(T t) {} 798</pre></td></tr> 799 800 801<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> 802<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 803 804Given 805 struct X { struct { int a; }; }; 806indirectFieldDecl() 807 matches 'a'. 808</pre></td></tr> 809 810 811<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> 812<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 813 814Given 815 goto FOO; 816 FOO: bar(); 817labelDecl() 818 matches 'FOO:' 819</pre></td></tr> 820 821 822<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> 823<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 824 825Given 826 extern "C" {} 827linkageSpecDecl() 828 matches "extern "C" {}" 829</pre></td></tr> 830 831 832<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> 833<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 834 835Example matches X, S, the anonymous union type, i, and U; 836 typedef int X; 837 struct S { 838 union { 839 int i; 840 } U; 841 }; 842</pre></td></tr> 843 844 845<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> 846<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 847 848Given 849 namespace test {} 850 namespace alias = ::test; 851namespaceAliasDecl() 852 matches "namespace alias" but not "namespace test" 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('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 857<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 858 859Given 860 namespace {} 861 namespace test {} 862namespaceDecl() 863 matches "namespace {}" and "namespace test {}" 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('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 868<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 869 870Given 871 template <typename T, int N> struct C {}; 872nonTypeTemplateParmDecl() 873 matches 'N', but not 'T'. 874</pre></td></tr> 875 876 877<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> 878<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 879 880Example matches Foo (Additions) 881 @interface Foo (Additions) 882 @end 883</pre></td></tr> 884 885 886<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> 887<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 888 889Example matches Foo (Additions) 890 @implementation Foo (Additions) 891 @end 892</pre></td></tr> 893 894 895<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> 896<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 897 898Example matches Foo 899 @implementation Foo 900 @end 901</pre></td></tr> 902 903 904<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> 905<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 906 907Example matches Foo 908 @interface Foo 909 @end 910</pre></td></tr> 911 912 913<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> 914<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 915 916Example matches _enabled 917 @implementation Foo { 918 BOOL _enabled; 919 } 920 @end 921</pre></td></tr> 922 923 924<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> 925<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 926 927Example matches both declaration and definition of -[Foo method] 928 @interface Foo 929 - (void)method; 930 @end 931 932 @implementation Foo 933 - (void)method {} 934 @end 935</pre></td></tr> 936 937 938<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> 939<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 940 941Example matches enabled 942 @interface Foo 943 @property BOOL enabled; 944 @end 945</pre></td></tr> 946 947 948<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> 949<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 950 951Example matches FooDelegate 952 @protocol FooDelegate 953 @end 954</pre></td></tr> 955 956 957<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> 958<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 959 960Given 961 void f(int x); 962parmVarDecl() 963 matches int x. 964</pre></td></tr> 965 966 967<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> 968<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 969 970Example matches X, Z, U, and S 971 class X; 972 template<class T> class Z {}; 973 struct S {}; 974 union U {}; 975</pre></td></tr> 976 977 978<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> 979<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 980 981Example: 982 staticAssertExpr() 983matches 984 static_assert(sizeof(S) == sizeof(int)) 985in 986 struct S { 987 int x; 988 }; 989 static_assert(sizeof(S) == sizeof(int)); 990</pre></td></tr> 991 992 993<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> 994<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 995 996Example matches X, Z, U, S, E 997 class X; 998 template<class T> class Z {}; 999 struct S {}; 1000 union U {}; 1001 enum E { 1002 A, B, C 1003 }; 1004</pre></td></tr> 1005 1006 1007<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> 1008<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1009 1010Given 1011 template <template <typename> class Z, int N> struct C {}; 1012templateTypeParmDecl() 1013 matches 'Z', but not 'N'. 1014</pre></td></tr> 1015 1016 1017<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> 1018<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1019 1020Given 1021 template <typename T, int N> struct C {}; 1022templateTypeParmDecl() 1023 matches 'T', but not 'N'. 1024</pre></td></tr> 1025 1026 1027<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> 1028<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1029 1030Given 1031 int X; 1032 namespace NS { 1033 int Y; 1034 } // namespace NS 1035decl(hasDeclContext(translationUnitDecl())) 1036 matches "int X", but not "int Y". 1037</pre></td></tr> 1038 1039 1040<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> 1041<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1042 1043Given 1044 typedef int X; 1045 using Y = int; 1046typeAliasDecl() 1047 matches "using Y = int", but not "typedef int X" 1048</pre></td></tr> 1049 1050 1051<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> 1052<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1053 1054typeAliasTemplateDecl() matches 1055 template <typename T> 1056 using Y = X<T>; 1057</pre></td></tr> 1058 1059 1060<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> 1061<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1062 1063Given 1064 typedef int X; 1065 using Y = int; 1066typedefDecl() 1067 matches "typedef int X", but not "using Y = int" 1068</pre></td></tr> 1069 1070 1071<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> 1072<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1073 1074Given 1075 typedef int X; 1076 using Y = int; 1077typedefNameDecl() 1078 matches "typedef int X" and "using Y = int" 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('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 1083<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1084typename. 1085 1086Given 1087 template <typename T> 1088 struct Base { typedef T Foo; }; 1089 1090 template<typename T> 1091 struct S : private Base<T> { 1092 using typename Base<T>::Foo; 1093 }; 1094unresolvedUsingTypenameDecl() 1095 matches using Base<T>::Foo </pre></td></tr> 1096 1097 1098<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> 1099<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1100 1101Given 1102 template<typename X> 1103 class C : private X { 1104 using X::x; 1105 }; 1106unresolvedUsingValueDecl() 1107 matches using X::x </pre></td></tr> 1108 1109 1110<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> 1111<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1112 1113Given 1114 namespace X { int x; } 1115 using X::x; 1116usingDecl() 1117 matches using X::x </pre></td></tr> 1118 1119 1120<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> 1121<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1122 1123Given 1124 namespace X { int x; } 1125 using namespace X; 1126usingDirectiveDecl() 1127 matches using namespace X </pre></td></tr> 1128 1129 1130<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> 1131<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1132 1133Example matches A, B, C and F 1134 enum X { A, B, C }; 1135 void F(); 1136</pre></td></tr> 1137 1138 1139<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> 1140<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1141 1142Note: this does not match declarations of member variables, which are 1143"field" declarations in Clang parlance. 1144 1145Example matches a 1146 int a; 1147</pre></td></tr> 1148 1149 1150<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> 1151<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1152</pre></td></tr> 1153 1154 1155<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> 1156<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1157 1158Given 1159 namespace ns { 1160 struct A { static void f(); }; 1161 void A::f() {} 1162 void g() { A::f(); } 1163 } 1164 ns::A a; 1165nestedNameSpecifier() 1166 matches "ns::" and both "A::" 1167</pre></td></tr> 1168 1169 1170<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> 1171<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1172 1173Given 1174 1175 #pragma omp parallel default(none) 1176 #pragma omp parallel default(shared) 1177 #pragma omp parallel default(firstprivate) 1178 #pragma omp parallel 1179 1180``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1181``default(firstprivate)`` 1182</pre></td></tr> 1183 1184 1185<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> 1186<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1187</pre></td></tr> 1188 1189 1190<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> 1191<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1192 1193Given 1194 FOO: bar(); 1195 void *ptr = &&FOO; 1196 goto *bar; 1197addrLabelExpr() 1198 matches '&&FOO' 1199</pre></td></tr> 1200 1201 1202<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> 1203<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1204 1205Given 1206 int i = a[1]; 1207arraySubscriptExpr() 1208 matches "a[1]" 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('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 1213<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1214 1215 int i = 100; 1216 __asm("mov al, 2"); 1217asmStmt() 1218 matches '__asm("mov al, 2")' 1219</pre></td></tr> 1220 1221 1222<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> 1223<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1224Example matches __atomic_load_n(ptr, 1) 1225 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1226</pre></td></tr> 1227 1228 1229<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> 1230<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1231 1232Given 1233 @autoreleasepool { 1234 int x = 0; 1235 } 1236autoreleasePoolStmt(stmt()) matches the declaration of "x" 1237inside the autorelease pool. 1238</pre></td></tr> 1239 1240 1241<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> 1242<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1243 1244Example matches a ?: b 1245 (a ?: b) + 42; 1246</pre></td></tr> 1247 1248 1249<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> 1250<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1251 1252Example matches a || b 1253 !(a || b) 1254See also the binaryOperation() matcher for more-general matching. 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('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 1259<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1260 1261Example: matches "^{}": 1262 void f() { ^{}(); } 1263</pre></td></tr> 1264 1265 1266<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> 1267<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1268 1269Given 1270 while (true) { break; } 1271breakStmt() 1272 matches 'break' 1273</pre></td></tr> 1274 1275 1276<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> 1277<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1278 1279Example: Matches (int) 2.2f in 1280 int i = (int) 2.2f; 1281</pre></td></tr> 1282 1283 1284<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> 1285<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1286 1287Example matches x.y() and y() 1288 X x; 1289 x.y(); 1290 y(); 1291</pre></td></tr> 1292 1293 1294<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> 1295<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1296 1297Given 1298 switch(a) { case 42: break; default: break; } 1299caseStmt() 1300 matches 'case 42:'. 1301</pre></td></tr> 1302 1303 1304<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> 1305<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1306 1307Example: castExpr() matches each of the following: 1308 (int) 3; 1309 const_cast<Expr *>(SubExpr); 1310 char c = 0; 1311but does not match 1312 int i = (0); 1313 int k = 0; 1314</pre></td></tr> 1315 1316 1317<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> 1318<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1319 1320Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1321though. 1322 1323Example matches 'a', L'a' 1324 char ch = 'a'; 1325 wchar_t chw = L'a'; 1326</pre></td></tr> 1327 1328 1329<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> 1330<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 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('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 1335<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1336 1337Example match: {1}, (1, 2) 1338 int array[4] = {1}; 1339 vector int myvec = (vector int)(1, 2); 1340</pre></td></tr> 1341 1342 1343<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> 1344<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1345 1346Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1347 for (;;) {{}} 1348</pre></td></tr> 1349 1350 1351<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> 1352<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1353 1354Example matches a ? b : c 1355 (a ? b : c) + 42 1356</pre></td></tr> 1357 1358 1359<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> 1360<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1361 1362Example matches the constant in the case statement: 1363 (matcher = constantExpr()) 1364 switch (a) { 1365 case 37: break; 1366 } 1367</pre></td></tr> 1368 1369 1370<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> 1371<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1372 1373Given 1374 while (true) { continue; } 1375continueStmt() 1376 matches 'continue' 1377</pre></td></tr> 1378 1379 1380<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> 1381<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1382 1383Example matches, 1384 kernel<<<i,j>>>(); 1385</pre></td></tr> 1386 1387 1388<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> 1389<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1390 1391Example matches FunctionTakesString(GetStringByValue()) 1392 (matcher = cxxBindTemporaryExpr()) 1393 FunctionTakesString(GetStringByValue()); 1394 FunctionTakesStringByPointer(GetStringPointer()); 1395</pre></td></tr> 1396 1397 1398<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> 1399<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1400 1401Example matches true 1402 true 1403</pre></td></tr> 1404 1405 1406<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> 1407<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1408 1409 try {} catch(int i) {} 1410cxxCatchStmt() 1411 matches 'catch(int i)' 1412</pre></td></tr> 1413 1414 1415<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> 1416<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1417 1418Example: Matches const_cast<int*>(&r) in 1419 int n = 42; 1420 const int &r(n); 1421 int* p = const_cast<int*>(&r); 1422</pre></td></tr> 1423 1424 1425<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> 1426<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1427 1428Example matches string(ptr, n) and ptr within arguments of f 1429 (matcher = cxxConstructExpr()) 1430 void f(const string &a, const string &b); 1431 char *ptr; 1432 int n; 1433 f(string(ptr, n), ptr); 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('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 1438<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1439 1440Example matches the CXXDefaultArgExpr placeholder inserted for the 1441 default value of the second parameter in the call expression f(42) 1442 (matcher = cxxDefaultArgExpr()) 1443 void f(int x, int y = 0); 1444 f(42); 1445</pre></td></tr> 1446 1447 1448<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> 1449<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1450 1451Given 1452 delete X; 1453cxxDeleteExpr() 1454 matches 'delete X'. 1455</pre></td></tr> 1456 1457 1458<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> 1459<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1460resolved because the base expression or the member name was dependent. 1461 1462Given 1463 template <class T> void f() { T t; t.g(); } 1464cxxDependentScopeMemberExpr() 1465 matches t.g 1466</pre></td></tr> 1467 1468 1469<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> 1470<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1471 1472Example: 1473 cxxDynamicCastExpr() 1474matches 1475 dynamic_cast<D*>(&b); 1476in 1477 struct B { virtual ~B() {} }; struct D : B {}; 1478 B b; 1479 D* p = dynamic_cast<D*>(&b); 1480</pre></td></tr> 1481 1482 1483<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> 1484<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1485 1486cxxForRangeStmt() matches 'for (auto a : i)' 1487 int i[] = {1, 2, 3}; for (auto a : i); 1488 for(int j = 0; j < 5; ++j); 1489</pre></td></tr> 1490 1491 1492<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> 1493<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1494 1495Example: Matches Foo(bar); 1496 Foo f = bar; 1497 Foo g = (Foo) bar; 1498 Foo h = Foo(bar); 1499</pre></td></tr> 1500 1501 1502<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> 1503<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1504 1505Example matches x.y() 1506 X x; 1507 x.y(); 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('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1512<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1513 1514Given 1515 new X; 1516cxxNewExpr() 1517 matches 'new X'. 1518</pre></td></tr> 1519 1520 1521<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> 1522<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1523 1524Given 1525 bool a() noexcept; 1526 bool b() noexcept(true); 1527 bool c() noexcept(false); 1528 bool d() noexcept(noexcept(a())); 1529 bool e = noexcept(b()) || noexcept(c()); 1530cxxNoexceptExpr() 1531 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1532 doesn't match the noexcept specifier in the declarations a, b, c or d. 1533</pre></td></tr> 1534 1535 1536<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> 1537<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1538</pre></td></tr> 1539 1540 1541<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> 1542<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1543 1544Note that if an operator isn't overloaded, it won't match. Instead, use 1545binaryOperator matcher. 1546Currently it does not match operators such as new delete. 1547FIXME: figure out why these do not match? 1548 1549Example matches both operator<<((o << b), c) and operator<<(o, b) 1550 (matcher = cxxOperatorCallExpr()) 1551 ostream &operator<< (ostream &out, int i) { }; 1552 ostream &o; int b = 1, c = 1; 1553 o << b << c; 1554See also the binaryOperation() matcher for more-general matching of binary 1555uses of this AST node. 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('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1560<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1561 1562Either the source expression or the destination type can be matched 1563using has(), but hasDestinationType() is more specific and can be 1564more readable. 1565 1566Example matches reinterpret_cast<char*>(&p) in 1567 void* p = reinterpret_cast<char*>(&p); 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('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>>...</td></tr> 1572<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1573 1574Example matches use of "<": 1575 #include <compare> 1576 struct HasSpaceshipMem { 1577 int a; 1578 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1579 }; 1580 void compare() { 1581 HasSpaceshipMem hs1, hs2; 1582 if (hs1 < hs2) 1583 return; 1584 } 1585See also the binaryOperation() matcher for more-general matching 1586of this AST node. 1587</pre></td></tr> 1588 1589 1590<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> 1591<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1592 1593See also: hasDestinationType 1594See also: reinterpretCast 1595 1596Example: 1597 cxxStaticCastExpr() 1598matches 1599 static_cast<long>(8) 1600in 1601 long eight(static_cast<long>(8)); 1602</pre></td></tr> 1603 1604 1605<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> 1606<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1607 1608Given 1609 std::vector<int> a({ 1, 2, 3 }); 1610 std::vector<int> b = { 4, 5 }; 1611 int c[] = { 6, 7 }; 1612 std::pair<int, int> d = { 8, 9 }; 1613cxxStdInitializerListExpr() 1614 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 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('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1619<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1620 1621Example: Matches Foo(bar, bar) 1622 Foo h = Foo(bar, bar); 1623</pre></td></tr> 1624 1625 1626<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> 1627<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1628 1629Example matches the implicit this expression in "return i". 1630 (matcher = cxxThisExpr()) 1631struct foo { 1632 int i; 1633 int f() { return i; } 1634}; 1635</pre></td></tr> 1636 1637 1638<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> 1639<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1640 1641 try { throw 5; } catch(int i) {} 1642cxxThrowExpr() 1643 matches 'throw 5' 1644</pre></td></tr> 1645 1646 1647<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> 1648<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1649 1650 try {} catch(int i) {} 1651cxxTryStmt() 1652 matches 'try {}' 1653</pre></td></tr> 1654 1655 1656<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> 1657<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1658 1659Example matches T(t) in return statement of f 1660 (matcher = cxxUnresolvedConstructExpr()) 1661 template <typename T> 1662 void f(const T& t) { return T(t); } 1663</pre></td></tr> 1664 1665 1666<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> 1667<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1668 1669Example matches x in if (x) 1670 bool x; 1671 if (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('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1676<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1677 1678Given 1679 int a; 1680declStmt() 1681 matches 'int a'. 1682</pre></td></tr> 1683 1684 1685<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> 1686<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1687 1688Given 1689 switch(a) { case 42: break; default: break; } 1690defaultStmt() 1691 matches 'default:'. 1692</pre></td></tr> 1693 1694 1695<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> 1696<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1697 1698Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1699 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1700</pre></td></tr> 1701 1702 1703<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> 1704<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1705 1706Given 1707 do {} while (true); 1708doStmt() 1709 matches 'do {} while(true)' 1710</pre></td></tr> 1711 1712 1713<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> 1714<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1715 1716Matches any cast expression written in user code, whether it be a 1717C-style cast, a functional-style cast, or a keyword cast. 1718 1719Does not match implicit conversions. 1720 1721Note: the name "explicitCast" is chosen to match Clang's terminology, as 1722Clang uses the term "cast" to apply to implicit conversions as well as to 1723actual cast expressions. 1724 1725See also: hasDestinationType. 1726 1727Example: matches all five of the casts in 1728 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1729but does not match the implicit conversion in 1730 long ell = 42; 1731</pre></td></tr> 1732 1733 1734<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> 1735<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1736 1737Example matches x() 1738 void f() { x(); } 1739</pre></td></tr> 1740 1741 1742<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> 1743<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1744of the sub-expression's evaluation. 1745 1746Example matches std::string() 1747 const std::string str = std::string(); 1748</pre></td></tr> 1749 1750 1751<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> 1752<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1753</pre></td></tr> 1754 1755 1756<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> 1757<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 17581.0, 1.0f, 1.0L and 1e10. 1759 1760Does not match implicit conversions such as 1761 float a = 10; 1762</pre></td></tr> 1763 1764 1765<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> 1766<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1767 1768Example matches 'for (;;) {}' 1769 for (;;) {} 1770 int i[] = {1, 2, 3}; for (auto a : i); 1771</pre></td></tr> 1772 1773 1774<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>>...</td></tr> 1775<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1776</pre></td></tr> 1777 1778 1779<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> 1780<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1781</pre></td></tr> 1782 1783 1784<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> 1785<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1786 1787Given 1788 goto FOO; 1789 FOO: bar(); 1790gotoStmt() 1791 matches 'goto FOO' 1792</pre></td></tr> 1793 1794 1795<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> 1796<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1797 1798Example matches 'if (x) {}' 1799 if (x) {} 1800</pre></td></tr> 1801 1802 1803<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> 1804<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1805point literals e.g.: 1i, 1.0i 1806</pre></td></tr> 1807 1808 1809<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> 1810<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1811 1812This matches many different places, including function call return value 1813eliding, as well as any type conversions. 1814</pre></td></tr> 1815 1816 1817<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> 1818<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1819 1820Given 1821 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1822implicitValueInitExpr() 1823 matches "[0].y" (implicitly) 1824</pre></td></tr> 1825 1826 1827<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> 1828<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1829 1830Given 1831 int a[] = { 1, 2 }; 1832 struct B { int x, y; }; 1833 B b = { 5, 6 }; 1834initListExpr() 1835 matches "{ 1, 2 }" and "{ 5, 6 }" 1836</pre></td></tr> 1837 1838 1839<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> 1840<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 18411, 1L, 0x1 and 1U. 1842 1843Does not match character-encoded integers such as L'a'. 1844</pre></td></tr> 1845 1846 1847<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> 1848<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1849 1850Given 1851 goto FOO; 1852 FOO: bar(); 1853labelStmt() 1854 matches 'FOO:' 1855</pre></td></tr> 1856 1857 1858<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> 1859<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1860 1861Example matches [&](){return 5;} 1862 [&](){return 5;} 1863</pre></td></tr> 1864 1865 1866<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> 1867<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1868 1869Example: Given 1870 struct T {void func();}; 1871 T f(); 1872 void g(T); 1873materializeTemporaryExpr() matches 'f()' in these statements 1874 T u(f()); 1875 g(f()); 1876 f().func(); 1877but does not match 1878 f(); 1879</pre></td></tr> 1880 1881 1882<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> 1883<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1884 1885Given 1886 class Y { 1887 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1888 int a; static int b; 1889 }; 1890memberExpr() 1891 matches this->x, x, y.x, a, this->b 1892</pre></td></tr> 1893 1894 1895<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> 1896<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1897 1898 foo();; 1899nullStmt() 1900 matches the second ';' 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('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1905<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1906 1907Example matches @catch 1908 @try {} 1909 @catch (...) {} 1910</pre></td></tr> 1911 1912 1913<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> 1914<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1915 1916Example matches @finally 1917 @try {} 1918 @finally {} 1919</pre></td></tr> 1920 1921 1922<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> 1923<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1924 1925Example: matches "a" in "init" method: 1926@implementation A { 1927 NSString *a; 1928} 1929- (void) init { 1930 a = @"hello"; 1931} 1932</pre></td></tr> 1933 1934 1935<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> 1936<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1937 1938The innermost message send invokes the "alloc" class method on the 1939NSString class, while the outermost message send invokes the 1940"initWithString" instance method on the object returned from 1941NSString's "alloc". This matcher should match both message sends. 1942 [[NSString alloc] initWithString:@"Hello"] 1943</pre></td></tr> 1944 1945 1946<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> 1947<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1948 1949Example matches @throw obj; 1950</pre></td></tr> 1951 1952 1953<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> 1954<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1955 1956Example matches @try 1957 @try {} 1958 @catch (...) {} 1959</pre></td></tr> 1960 1961 1962<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> 1963<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 1964 1965Given 1966 1967 #pragma omp parallel 1968 #pragma omp parallel default(none) 1969 #pragma omp taskyield 1970 1971``ompExecutableDirective()`` matches ``omp parallel``, 1972``omp parallel default(none)`` and ``omp taskyield``. 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('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1977<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1978to reference another expressions and can be met 1979in BinaryConditionalOperators, for example. 1980 1981Example matches 'a' 1982 (a ?: c) + 42; 1983</pre></td></tr> 1984 1985 1986<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> 1987<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1988 1989Example matches (foo() + 1) 1990 int foo() { return 1; } 1991 int a = (foo() + 1); 1992</pre></td></tr> 1993 1994 1995<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> 1996<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1997ParenListExprs don't have a predefined type and are used for late parsing. 1998In the final AST, they can be met in template declarations. 1999 2000Given 2001 template<typename T> class X { 2002 void f() { 2003 X x(*this); 2004 int a = 0, b = 1; int i = (a, b); 2005 } 2006 }; 2007parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2008has a predefined type and is a ParenExpr, not a ParenListExpr. 2009</pre></td></tr> 2010 2011 2012<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> 2013<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2014 2015Example: Matches __func__ 2016 printf("%s", __func__); 2017</pre></td></tr> 2018 2019 2020<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> 2021<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2022 2023Given 2024 return 1; 2025returnStmt() 2026 matches 'return 1' 2027</pre></td></tr> 2028 2029 2030<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> 2031<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2032 2033Given 2034 { ++a; } 2035stmt() 2036 matches both the compound statement '{ ++a; }' and '++a'. 2037</pre></td></tr> 2038 2039 2040<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> 2041<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2042 2043Example match: ({ int X = 4; X; }) 2044 int C = ({ int X = 4; X; }); 2045</pre></td></tr> 2046 2047 2048<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> 2049<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2050 2051Example matches "abcd", L"abcd" 2052 char *s = "abcd"; 2053 wchar_t *ws = L"abcd"; 2054</pre></td></tr> 2055 2056 2057<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> 2058<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2059 2060Given 2061 template <int N> 2062 struct A { static const int n = N; }; 2063 struct B : public A<42> {}; 2064substNonTypeTemplateParmExpr() 2065 matches "N" in the right-hand side of "static const int n = N;" 2066</pre></td></tr> 2067 2068 2069<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> 2070<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2071 2072Given 2073 switch(a) { case 42: break; default: break; } 2074switchCase() 2075 matches 'case 42:' and 'default:'. 2076</pre></td></tr> 2077 2078 2079<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> 2080<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2081 2082Given 2083 switch(a) { case 42: break; default: break; } 2084switchStmt() 2085 matches 'switch(a)'. 2086</pre></td></tr> 2087 2088 2089<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> 2090<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2091 2092Given 2093 Foo x = bar; 2094 int y = sizeof(x) + alignof(x); 2095unaryExprOrTypeTraitExpr() 2096 matches sizeof(x) and alignof(x) 2097</pre></td></tr> 2098 2099 2100<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> 2101<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2102 2103Example matches !a 2104 !a || b 2105</pre></td></tr> 2106 2107 2108<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> 2109<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2110but could not be resolved to a specific declaration. 2111 2112Given 2113 template<typename T> 2114 T foo() { T a; return a; } 2115 template<typename T> 2116 void bar() { 2117 foo<T>(); 2118 } 2119unresolvedLookupExpr() 2120 matches foo<T>() </pre></td></tr> 2121 2122 2123<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> 2124<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2125 2126Given 2127 struct X { 2128 template <class T> void f(); 2129 void g(); 2130 }; 2131 template <class T> void h() { X x; x.f<T>(); x.g(); } 2132unresolvedMemberExpr() 2133 matches x.f<T> 2134</pre></td></tr> 2135 2136 2137<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> 2138<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2139 2140Example match: "foo"_suffix 2141</pre></td></tr> 2142 2143 2144<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> 2145<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2146 2147Given 2148 while (true) {} 2149whileStmt() 2150 matches 'while (true) {}'. 2151</pre></td></tr> 2152 2153 2154<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> 2155<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2156 2157Given 2158 template <typename T> struct C {}; 2159 C<int> c; 2160templateArgumentLoc() 2161 matches 'int' in C<int>. 2162</pre></td></tr> 2163 2164 2165<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> 2166<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2167 2168Given 2169 template <typename T> struct C {}; 2170 C<int> c; 2171templateArgument() 2172 matches 'int' in C<int>. 2173</pre></td></tr> 2174 2175 2176<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> 2177<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2178 2179Given 2180 template <typename T> class X { }; 2181 X<int> xi; 2182templateName() 2183 matches 'X' in X<int>. 2184</pre></td></tr> 2185 2186 2187<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> 2188<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2189</pre></td></tr> 2190 2191 2192<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> 2193<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2194 2195Given 2196 int a[] = { 2, 3 }; 2197 int b[4]; 2198 void f() { int c[a[0]]; } 2199arrayType() 2200 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2201</pre></td></tr> 2202 2203 2204<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> 2205<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2206 2207Given 2208 _Atomic(int) i; 2209atomicType() 2210 matches "_Atomic(int) i" 2211</pre></td></tr> 2212 2213 2214<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> 2215<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2216 2217Given: 2218 auto n = 4; 2219 int v[] = { 2, 3 } 2220 for (auto i : v) { } 2221autoType() 2222 matches "auto n" and "auto i" 2223</pre></td></tr> 2224 2225 2226<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> 2227<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2228"void (^)(int)". 2229 2230The pointee is always required to be a FunctionType. 2231</pre></td></tr> 2232 2233 2234<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> 2235<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2236 2237Given 2238 struct A {}; 2239 A a; 2240 int b; 2241 float c; 2242 bool d; 2243builtinType() 2244 matches "int b", "float c" and "bool d" 2245</pre></td></tr> 2246 2247 2248<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> 2249<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2250 2251Given 2252 _Complex float f; 2253complexType() 2254 matches "_Complex float f" 2255</pre></td></tr> 2256 2257 2258<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> 2259<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2260 2261Given 2262 void() { 2263 int a[2]; 2264 int b[] = { 2, 3 }; 2265 int c[b[0]]; 2266 } 2267constantArrayType() 2268 matches "int a[2]" 2269</pre></td></tr> 2270 2271 2272<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> 2273<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2274Example matches i[] in declaration of f. 2275 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2276Example matches i[1]. 2277 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2278 void f(int i[]) { 2279 i[1] = 0; 2280 } 2281</pre></td></tr> 2282 2283 2284<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> 2285<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2286 2287Given: 2288 short i = 1; 2289 int j = 42; 2290 decltype(i + j) result = i + j; 2291decltypeType() 2292 matches "decltype(i + j)" 2293</pre></td></tr> 2294 2295 2296<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> 2297<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2298template types. 2299 2300Given 2301 template <typename T> 2302 class C { public: C(T); }; 2303 2304 C c(123); 2305deducedTemplateSpecializationType() matches the type in the declaration 2306of the variable c. 2307</pre></td></tr> 2308 2309 2310<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> 2311<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2312 2313Given 2314 template<typename T, int Size> 2315 class array { 2316 T data[Size]; 2317 }; 2318dependentSizedArrayType 2319 matches "T data[Size]" 2320</pre></td></tr> 2321 2322 2323<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> 2324<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2325qualified name. 2326 2327Given 2328 namespace N { 2329 namespace M { 2330 class D {}; 2331 } 2332 } 2333 class C {}; 2334 2335 class C c; 2336 N::M::D d; 2337 2338elaboratedType() matches the type of the variable declarations of both 2339c and d. 2340</pre></td></tr> 2341 2342 2343<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> 2344<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2345 2346Given 2347 enum C { Green }; 2348 enum class S { Red }; 2349 2350 C c; 2351 S s; 2352 2353enumType() matches the type of the variable declarations of both c and 2354s. 2355</pre></td></tr> 2356 2357 2358<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> 2359<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2360 2361Given 2362 int (*f)(int); 2363 void g(); 2364functionProtoType() 2365 matches "int (*f)(int)" and the type of "g" in C++ mode. 2366 In C mode, "g" is not matched because it does not contain a prototype. 2367</pre></td></tr> 2368 2369 2370<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> 2371<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2372 2373Given 2374 int (*f)(int); 2375 void g(); 2376functionType() 2377 matches "int (*f)(int)" and the type of "g". 2378</pre></td></tr> 2379 2380 2381<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> 2382<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2383 2384Given 2385 int a[] = { 2, 3 }; 2386 int b[42]; 2387 void f(int c[]) { int d[a[0]]; }; 2388incompleteArrayType() 2389 matches "int a[]" and "int c[]" 2390</pre></td></tr> 2391 2392 2393<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> 2394<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2395 2396Example matches S s, but not S<T> s. 2397 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2398 template <typename T> struct S { 2399 void f(S s); 2400 void g(S<T> s); 2401 }; 2402</pre></td></tr> 2403 2404 2405<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> 2406<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2407 2408Given: 2409 int *a; 2410 int &b = *a; 2411 int &&c = 1; 2412 auto &d = b; 2413 auto &&e = c; 2414 auto &&f = 2; 2415 int g = 5; 2416 2417lValueReferenceType() matches the types of b, d, and e. e is 2418matched since the type is deduced as int& by reference collapsing rules. 2419</pre></td></tr> 2420 2421 2422<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> 2423<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2424Given 2425 struct A { int i; } 2426 A::* ptr = A::i; 2427memberPointerType() 2428 matches "A::* ptr" 2429</pre></td></tr> 2430 2431 2432<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> 2433<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2434a pointer type, despite being syntactically similar. 2435 2436Given 2437 int *a; 2438 2439 @interface Foo 2440 @end 2441 Foo *f; 2442pointerType() 2443 matches "Foo *f", but does not match "int *a". 2444</pre></td></tr> 2445 2446 2447<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> 2448<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2449 2450Given 2451 int (*ptr_to_array)[4]; 2452 int *array_of_ptrs[4]; 2453 2454varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2455array_of_ptrs. 2456</pre></td></tr> 2457 2458 2459<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> 2460<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2461types. 2462 2463Given 2464 int *a; 2465 int &b = *a; 2466 int c = 5; 2467 2468 @interface Foo 2469 @end 2470 Foo *f; 2471pointerType() 2472 matches "int *a", but does not match "Foo *f". 2473</pre></td></tr> 2474 2475 2476<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> 2477<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2478 2479Given: 2480 int *a; 2481 int &b = *a; 2482 int &&c = 1; 2483 auto &d = b; 2484 auto &&e = c; 2485 auto &&f = 2; 2486 int g = 5; 2487 2488rValueReferenceType() matches the types of c and f. e is not 2489matched as it is deduced to int& by reference collapsing rules. 2490</pre></td></tr> 2491 2492 2493<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> 2494<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2495 2496Given 2497 class C {}; 2498 struct S {}; 2499 2500 C c; 2501 S s; 2502 2503recordType() matches the type of the variable declarations of both c 2504and s. 2505</pre></td></tr> 2506 2507 2508<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> 2509<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2510 2511Given 2512 int *a; 2513 int &b = *a; 2514 int &&c = 1; 2515 auto &d = b; 2516 auto &&e = c; 2517 auto &&f = 2; 2518 int g = 5; 2519 2520referenceType() matches the types of b, c, d, e, and f. 2521</pre></td></tr> 2522 2523 2524<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> 2525<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2526template type parameter. 2527 2528Given 2529 template <typename T> 2530 void F(T t) { 2531 int i = 1 + t; 2532 } 2533 2534substTemplateTypeParmType() matches the type of 't' but not '1' 2535</pre></td></tr> 2536 2537 2538<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> 2539<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2540 2541Given 2542 enum E {}; 2543 class C {}; 2544 2545 E e; 2546 C c; 2547 2548tagType() matches the type of the variable declarations of both e 2549and c. 2550</pre></td></tr> 2551 2552 2553<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> 2554<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2555 2556Given 2557 template <typename T> 2558 class C { }; 2559 2560 template class C<int>; // A 2561 C<char> var; // B 2562 2563templateSpecializationType() matches the type of the explicit 2564instantiation in A and the type of the variable declaration in B. 2565</pre></td></tr> 2566 2567 2568<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> 2569<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2570 2571Example matches T, but not int. 2572 (matcher = templateTypeParmType()) 2573 template <typename T> void f(int i); 2574</pre></td></tr> 2575 2576 2577<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> 2578<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2579</pre></td></tr> 2580 2581 2582<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> 2583<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2584 2585Given 2586 typedef int X; 2587typedefType() 2588 matches "typedef int X" 2589</pre></td></tr> 2590 2591 2592<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> 2593<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2594 2595Given: 2596 typedef __underlying_type(T) type; 2597unaryTransformType() 2598 matches "__underlying_type(T)" 2599</pre></td></tr> 2600 2601 2602<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> 2603<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2604integer-constant-expression. 2605 2606Given 2607 void f() { 2608 int a[] = { 2, 3 } 2609 int b[42]; 2610 int c[a[0]]; 2611 } 2612variableArrayType() 2613 matches "int c[a[0]]" 2614</pre></td></tr> 2615 2616<!--END_DECL_MATCHERS --> 2617</table> 2618 2619<!-- ======================================================================= --> 2620<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2621<!-- ======================================================================= --> 2622 2623<p>Narrowing matchers match certain attributes on the current node, thus 2624narrowing down the set of nodes of the current type to match on.</p> 2625 2626<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2627which allow users to create more powerful match expressions.</p> 2628 2629<table> 2630<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2631<!-- START_NARROWING_MATCHERS --> 2632 2633<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2634<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2635 2636Usable as: Any Matcher 2637</pre></td></tr> 2638 2639 2640<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2641<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2642 2643Usable as: Any Matcher 2644</pre></td></tr> 2645 2646 2647<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2648<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2649 2650Useful when another matcher requires a child matcher, but there's no 2651additional constraint. This will often be used with an explicit conversion 2652to an internal::Matcher<> type such as TypeMatcher. 2653 2654Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2655"int* p" and "void f()" in 2656 int* p; 2657 void f(); 2658 2659Usable as: Any Matcher 2660</pre></td></tr> 2661 2662 2663<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2664<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2665 2666Given 2667 if (true); 2668 for (; true; ); 2669with the matcher 2670 mapAnyOf(ifStmt, forStmt).with( 2671 hasCondition(cxxBoolLiteralExpr(equals(true))) 2672 ).bind("trueCond") 2673matches the if and the for. It is equivalent to: 2674 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2675 anyOf( 2676 ifStmt(trueCond).bind("trueCond"), 2677 forStmt(trueCond).bind("trueCond") 2678 ); 2679 2680The with() chain-call accepts zero or more matchers which are combined 2681as-if with allOf() in each of the node matchers. 2682Usable as: Any Matcher 2683</pre></td></tr> 2684 2685 2686<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2687<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2688 2689Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2690 class X {}; 2691 class Y {}; 2692 2693Usable as: Any Matcher 2694</pre></td></tr> 2695 2696 2697<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> 2698<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2699specified names. 2700 2701 hasAnyOperatorName("+", "-") 2702 Is equivalent to 2703 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2704</pre></td></tr> 2705 2706 2707<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> 2708<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2709unary). 2710 2711Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2712 !(a || b) 2713</pre></td></tr> 2714 2715 2716<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> 2717<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2718 2719Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2720 if (a == b) 2721 a += b; 2722 2723Example 2: matches s1 = s2 2724 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2725 struct S { S& operator=(const S&); }; 2726 void x() { S s1, s2; s1 = s2; } 2727</pre></td></tr> 2728 2729 2730<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> 2731<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2732 2733Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2734 if (a == b) 2735 a += b; 2736 2737Example 2: matches s1 < s2 2738 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2739 struct S { bool operator<(const S& other); }; 2740 void x(S s1, S s2) { bool b1 = s1 < s2; } 2741</pre></td></tr> 2742 2743 2744<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> 2745<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2746inheritance. 2747 2748Examples: 2749 class C { 2750 public: int a; 2751 protected: int b; 2752 private: int c; // fieldDecl(isPrivate()) matches 'c' 2753 }; 2754 2755 struct Base {}; 2756 struct Derived1 : private Base {}; // matches 'Base' 2757 class Derived2 : Base {}; // matches 'Base' 2758</pre></td></tr> 2759 2760 2761<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> 2762<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2763protected inheritance. 2764 2765Examples: 2766 class C { 2767 public: int a; 2768 protected: int b; // fieldDecl(isProtected()) matches 'b' 2769 private: int c; 2770 }; 2771 2772 class Base {}; 2773 class Derived : protected Base {}; // matches 'Base' 2774</pre></td></tr> 2775 2776 2777<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> 2778<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2779inheritance. 2780 2781Examples: 2782 class C { 2783 public: int a; // fieldDecl(isPublic()) matches 'a' 2784 protected: int b; 2785 private: int c; 2786 }; 2787 2788 class Base {}; 2789 class Derived1 : public Base {}; // matches 'Base' 2790 struct Derived2 : Base {}; // matches 'Base' 2791</pre></td></tr> 2792 2793 2794<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> 2795<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2796virtual inheritance. 2797 2798Example: 2799 class A { 2800 public: 2801 virtual void x(); // matches x 2802 }; 2803 2804Example: 2805 class Base {}; 2806 class DirectlyDerived : virtual Base {}; // matches Base 2807 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2808 2809Usable 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>> 2810</pre></td></tr> 2811 2812 2813<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> 2814<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2815 2816 2817<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> 2818<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2819 2820Given 2821 f('false, 3.14, 42); 2822characterLiteral(equals(0)) 2823 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2824 match false 2825floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2826 match 3.14 2827integerLiteral(equals(42)) 2828 matches 42 2829 2830Note that you cannot directly match a negative numeric literal because the 2831minus sign is not part of the literal: It is a unary operator whose operand 2832is the positive numeric literal. Instead, you must use a unaryOperator() 2833matcher to match the minus sign: 2834 2835unaryOperator(hasOperatorName("-"), 2836 hasUnaryOperand(integerLiteral(equals(13)))) 2837 2838Usable 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>>, 2839 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>> 2840</pre></td></tr> 2841 2842 2843<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> 2844<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2845 2846 2847<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> 2848<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2849 2850 2851<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> 2852<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2853 2854Given 2855 try { 2856 // ... 2857 } catch (int) { 2858 // ... 2859 } catch (...) { 2860 // ... 2861 } 2862cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2863</pre></td></tr> 2864 2865 2866<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> 2867<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2868a specific number of arguments (including absent default arguments). 2869 2870Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2871 void f(int x, int y); 2872 f(0, 0); 2873</pre></td></tr> 2874 2875 2876<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> 2877<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2878</pre></td></tr> 2879 2880 2881<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> 2882<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2883zero initialization. 2884 2885Given 2886void foo() { 2887 struct point { double x; double y; }; 2888 point pt[2] = { { 1.0, 2.0 } }; 2889} 2890initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2891will match the implicit array filler for pt[1]. 2892</pre></td></tr> 2893 2894 2895<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> 2896<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2897 2898Given 2899 struct S { 2900 S(); // #1 2901 S(const S &); // #2 2902 S(S &&); // #3 2903 }; 2904cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2905</pre></td></tr> 2906 2907 2908<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> 2909<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2910 2911Given 2912 struct S { 2913 S(); // #1 2914 S(const S &); // #2 2915 S(S &&); // #3 2916 }; 2917cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2918</pre></td></tr> 2919 2920 2921<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> 2922<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2923 2924Given 2925 struct S { 2926 S(); // #1 2927 S(int) {} // #2 2928 S(S &&) : S() {} // #3 2929 }; 2930 S::S() : S(0) {} // #4 2931cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2932#1 or #2. 2933</pre></td></tr> 2934 2935 2936<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> 2937<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2938that have an explicit specifier if this explicit specifier is resolved to 2939true. 2940 2941Given 2942 template<bool b> 2943 struct S { 2944 S(int); // #1 2945 explicit S(double); // #2 2946 operator int(); // #3 2947 explicit operator bool(); // #4 2948 explicit(false) S(bool) // # 7 2949 explicit(true) S(char) // # 8 2950 explicit(b) S(S) // # 9 2951 }; 2952 S(int) -> S<true> // #5 2953 explicit S(double) -> S<false> // #6 2954cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2955cxxConversionDecl(isExplicit()) will match #4, but not #3. 2956cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2957</pre></td></tr> 2958 2959 2960<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> 2961<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2962 2963Given 2964 struct S { 2965 S(); // #1 2966 S(const S &); // #2 2967 S(S &&); // #3 2968 }; 2969cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2970</pre></td></tr> 2971 2972 2973<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> 2974<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 2975that have an explicit specifier if this explicit specifier is resolved to 2976true. 2977 2978Given 2979 template<bool b> 2980 struct S { 2981 S(int); // #1 2982 explicit S(double); // #2 2983 operator int(); // #3 2984 explicit operator bool(); // #4 2985 explicit(false) S(bool) // # 7 2986 explicit(true) S(char) // # 8 2987 explicit(b) S(S) // # 9 2988 }; 2989 S(int) -> S<true> // #5 2990 explicit S(double) -> S<false> // #6 2991cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2992cxxConversionDecl(isExplicit()) will match #4, but not #3. 2993cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2994</pre></td></tr> 2995 2996 2997<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> 2998<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2999opposed to a member. 3000 3001Given 3002 struct B {}; 3003 struct D : B { 3004 int I; 3005 D(int i) : I(i) {} 3006 }; 3007 struct E : B { 3008 E() : B() {} 3009 }; 3010cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3011 will match E(), but not match D(int). 3012</pre></td></tr> 3013 3014 3015<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> 3016<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3017opposed to a base. 3018 3019Given 3020 struct B {}; 3021 struct D : B { 3022 int I; 3023 D(int i) : I(i) {} 3024 }; 3025 struct E : B { 3026 E() : B() {} 3027 }; 3028cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3029 will match D(int), but not match E(). 3030</pre></td></tr> 3031 3032 3033<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> 3034<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3035code (as opposed to implicitly added by the compiler). 3036 3037Given 3038 struct Foo { 3039 Foo() { } 3040 Foo(int) : foo_("A") { } 3041 string foo_; 3042 }; 3043cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3044 will match Foo(int), but not Foo() 3045</pre></td></tr> 3046 3047 3048<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> 3049<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3050that have an explicit specifier if this explicit specifier is resolved to 3051true. 3052 3053Given 3054 template<bool b> 3055 struct S { 3056 S(int); // #1 3057 explicit S(double); // #2 3058 operator int(); // #3 3059 explicit operator bool(); // #4 3060 explicit(false) S(bool) // # 7 3061 explicit(true) S(char) // # 8 3062 explicit(b) S(S) // # 9 3063 }; 3064 S(int) -> S<true> // #5 3065 explicit S(double) -> S<false> // #6 3066cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3067cxxConversionDecl(isExplicit()) will match #4, but not #3. 3068cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3069</pre></td></tr> 3070 3071 3072<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> 3073<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3074 3075In template declarations, dependent members are not resolved and so can 3076not be matched to particular named declarations. 3077 3078This matcher allows to match on the known name of members. 3079 3080Given 3081 template <typename T> 3082 struct S { 3083 void mem(); 3084 }; 3085 template <typename T> 3086 void x() { 3087 S<T> s; 3088 s.mem(); 3089 } 3090cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3091</pre></td></tr> 3092 3093 3094<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> 3095<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3096to '.'. 3097 3098Member calls on the implicit this pointer match as called with '->'. 3099 3100Given 3101 class Y { 3102 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3103 template <class T> void f() { this->f<T>(); f<T>(); } 3104 int a; 3105 static int b; 3106 }; 3107 template <class T> 3108 class Z { 3109 void x() { this->m; } 3110 }; 3111memberExpr(isArrow()) 3112 matches this->x, x, y.x, a, this->b 3113cxxDependentScopeMemberExpr(isArrow()) 3114 matches this->m 3115unresolvedMemberExpr(isArrow()) 3116 matches this->f<T>, f<T> 3117</pre></td></tr> 3118 3119 3120<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> 3121<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3122node 3123 3124In template declarations, dependent members are not resolved and so can 3125not be matched to particular named declarations. 3126 3127This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3128and CXXMethodDecl nodes. 3129 3130Given 3131 template <typename T> 3132 struct S { 3133 void mem(); 3134 }; 3135 template <typename T> 3136 void x() { 3137 S<T> s; 3138 s.mem(); 3139 } 3140The matcher 3141@code 3142cxxDependentScopeMemberExpr( 3143 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3144 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3145 cxxMethodDecl(hasName("mem")).bind("templMem") 3146 ))))) 3147 )))), 3148 memberHasSameNameAsBoundNode("templMem") 3149 ) 3150@endcode 3151first matches and binds the @c mem member of the @c S template, then 3152compares its name to the usage in @c s.mem() in the @c x function template 3153</pre></td></tr> 3154 3155 3156<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> 3157<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3158 3159Given 3160struct A { 3161 void foo() const; 3162 void bar(); 3163}; 3164 3165cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3166</pre></td></tr> 3167 3168 3169<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> 3170<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3171operator. 3172 3173Given 3174struct A { 3175 A &operator=(const A &); 3176 A &operator=(A &&); 3177}; 3178 3179cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3180the second one. 3181</pre></td></tr> 3182 3183 3184<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> 3185<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3186 3187Given: 3188 class A final {}; 3189 3190 struct B { 3191 virtual void f(); 3192 }; 3193 3194 struct C : B { 3195 void f() final; 3196 }; 3197matches A and C::f, but not B, C, or B::f 3198</pre></td></tr> 3199 3200 3201<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> 3202<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3203operator. 3204 3205Given 3206struct A { 3207 A &operator=(const A &); 3208 A &operator=(A &&); 3209}; 3210 3211cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3212the first one. 3213</pre></td></tr> 3214 3215 3216<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> 3217<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3218 3219Given 3220 class A { 3221 public: 3222 virtual void x(); 3223 }; 3224 class B : public A { 3225 public: 3226 virtual void x(); 3227 }; 3228 matches B::x 3229</pre></td></tr> 3230 3231 3232<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> 3233<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3234 3235Given 3236 class A { 3237 public: 3238 virtual void x() = 0; 3239 }; 3240 matches A::x 3241</pre></td></tr> 3242 3243 3244<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> 3245<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3246 3247Given 3248 struct S { 3249 S(); // #1 3250 S(const S &) = default; // #2 3251 S(S &&) = delete; // #3 3252 }; 3253cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3254</pre></td></tr> 3255 3256 3257<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> 3258<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3259virtual inheritance. 3260 3261Example: 3262 class A { 3263 public: 3264 virtual void x(); // matches x 3265 }; 3266 3267Example: 3268 class Base {}; 3269 class DirectlyDerived : virtual Base {}; // matches Base 3270 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3271 3272Usable 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>> 3273</pre></td></tr> 3274 3275 3276<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> 3277<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3278 3279Given 3280 class A { 3281 public: 3282 virtual void x(); 3283 }; 3284 class B : public A { 3285 public: 3286 void x(); 3287 }; 3288 matches A::x but not B::x 3289</pre></td></tr> 3290 3291 3292<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> 3293<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3294 3295Given: 3296 MyClass *p1 = new MyClass[10]; 3297cxxNewExpr(isArray()) 3298 matches the expression 'new MyClass[10]'. 3299</pre></td></tr> 3300 3301 3302<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3303<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3304specified names. 3305 3306 hasAnyOperatorName("+", "-") 3307 Is equivalent to 3308 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3309</pre></td></tr> 3310 3311 3312<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> 3313<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3314 3315Matches overloaded operator names specified in strings without the 3316"operator" prefix: e.g. "<<". 3317 3318 hasAnyOverloadedOperatorName("+", "-") 3319Is equivalent to 3320 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3321</pre></td></tr> 3322 3323 3324<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3325<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3326unary). 3327 3328Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3329 !(a || b) 3330</pre></td></tr> 3331 3332 3333<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> 3334<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3335 3336Matches overloaded operator names specified in strings without the 3337"operator" prefix: e.g. "<<". 3338 3339Given: 3340 class A { int operator*(); }; 3341 const A &operator<<(const A &a, const A &b); 3342 A a; 3343 a << a; // <-- This matches 3344 3345cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3346specified line and 3347cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3348matches the declaration of A. 3349 3350Usable 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>> 3351</pre></td></tr> 3352 3353 3354<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> 3355<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3356 3357Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3358 if (a == b) 3359 a += b; 3360 3361Example 2: matches s1 = s2 3362 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3363 struct S { S& operator=(const S&); }; 3364 void x() { S s1, s2; s1 = s2; } 3365</pre></td></tr> 3366 3367 3368<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> 3369<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3370 3371Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3372 if (a == b) 3373 a += b; 3374 3375Example 2: matches s1 < s2 3376 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3377 struct S { bool operator<(const S& other); }; 3378 void x(S s1, S s2) { bool b1 = s1 < s2; } 3379</pre></td></tr> 3380 3381 3382<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> 3383<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3384 3385Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3386class x {}; 3387class y; 3388</pre></td></tr> 3389 3390 3391<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> 3392<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3393</pre></td></tr> 3394 3395 3396<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> 3397<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3398</pre></td></tr> 3399 3400 3401<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> 3402<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3403static member variable template instantiations. 3404 3405Given 3406 template<typename T> void A(T t) { } 3407 template<> void A(int N) { } 3408functionDecl(isExplicitTemplateSpecialization()) 3409 matches the specialization A<int>(). 3410 3411Usable 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>> 3412</pre></td></tr> 3413 3414 3415<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> 3416<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3417 3418Given: 3419 class A final {}; 3420 3421 struct B { 3422 virtual void f(); 3423 }; 3424 3425 struct C : B { 3426 void f() final; 3427 }; 3428matches A and C::f, but not B, C, or B::f 3429</pre></td></tr> 3430 3431 3432<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> 3433<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3434 3435Given: 3436 auto x = []{}; 3437 3438cxxRecordDecl(isLambda()) matches the implicit class declaration of 3439decltype(x) 3440</pre></td></tr> 3441 3442 3443<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> 3444<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3445isSameOrDerivedFrom(hasName(...)). 3446</pre></td></tr> 3447 3448 3449<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> 3450<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3451member variable template instantiations. 3452 3453Given 3454 template <typename T> class X {}; class A {}; X<A> x; 3455or 3456 template <typename T> class X {}; class A {}; template class X<A>; 3457or 3458 template <typename T> class X {}; class A {}; extern template class X<A>; 3459cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3460 matches the template instantiation of X<A>. 3461 3462But given 3463 template <typename T> class X {}; class A {}; 3464 template <> class X<A> {}; X<A> x; 3465cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3466 does not match, as X<A> is an explicit template specialization. 3467 3468Usable 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>> 3469</pre></td></tr> 3470 3471 3472<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3473<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3474specified names. 3475 3476 hasAnyOperatorName("+", "-") 3477 Is equivalent to 3478 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3479</pre></td></tr> 3480 3481 3482<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3483<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3484unary). 3485 3486Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3487 !(a || b) 3488</pre></td></tr> 3489 3490 3491<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr> 3492<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3493 3494Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3495 if (a == b) 3496 a += b; 3497 3498Example 2: matches s1 = s2 3499 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3500 struct S { S& operator=(const S&); }; 3501 void x() { S s1, s2; s1 = s2; } 3502</pre></td></tr> 3503 3504 3505<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr> 3506<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3507 3508Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3509 if (a == b) 3510 a += b; 3511 3512Example 2: matches s1 < s2 3513 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3514 struct S { bool operator<(const S& other); }; 3515 void x(S s1, S s2) { bool b1 = s1 < s2; } 3516</pre></td></tr> 3517 3518 3519<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> 3520<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3521a specific number of arguments (including absent default arguments). 3522 3523Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3524 void f(int x, int y); 3525 f(0, 0); 3526</pre></td></tr> 3527 3528 3529<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> 3530<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3531a specific number of arguments (including absent default arguments). 3532 3533Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3534 void f(int x, int y); 3535 f(0, 0); 3536</pre></td></tr> 3537 3538 3539<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> 3540<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3541 3542Example matches y(x) but not y(42) or NS::y(x). 3543 namespace NS { 3544 struct X {}; 3545 void y(X); 3546 } 3547 3548 void y(...); 3549 3550 void test() { 3551 NS::X x; 3552 y(x); // Matches 3553 NS::y(x); // Doesn't match 3554 y(42); // Doesn't match 3555 using NS::y; 3556 y(x); // Found by both unqualified lookup and ADL, doesn't match 3557 } 3558</pre></td></tr> 3559 3560 3561<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> 3562<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3563 3564Example: matches the implicit cast around 0 3565(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3566 int *p = 0; 3567 3568If the matcher is use from clang-query, CastKind parameter 3569should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3570</pre></td></tr> 3571 3572 3573<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> 3574<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3575 3576 3577<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> 3578<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3579 3580Given 3581 f('false, 3.14, 42); 3582characterLiteral(equals(0)) 3583 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3584 match false 3585floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3586 match 3.14 3587integerLiteral(equals(42)) 3588 matches 42 3589 3590Note that you cannot directly match a negative numeric literal because the 3591minus sign is not part of the literal: It is a unary operator whose operand 3592is the positive numeric literal. Instead, you must use a unaryOperator() 3593matcher to match the minus sign: 3594 3595unaryOperator(hasOperatorName("-"), 3596 hasUnaryOperand(integerLiteral(equals(13)))) 3597 3598Usable 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>>, 3599 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>> 3600</pre></td></tr> 3601 3602 3603<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> 3604<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3605 3606 3607<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> 3608<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3609 3610 3611<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> 3612<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3613 3614Given 3615 template<typename T> struct C {}; 3616 C<int> c; 3617classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3618 matches C<int>. 3619</pre></td></tr> 3620 3621 3622<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> 3623<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3624child statements. 3625 3626Example: Given 3627 { for (;;) {} } 3628compoundStmt(statementCountIs(0))) 3629 matches '{}' 3630 but does not match the outer compound statement. 3631</pre></td></tr> 3632 3633 3634<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> 3635<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3636 3637Given 3638 int a[42]; 3639 int b[2 * 21]; 3640 int c[41], d[43]; 3641 char *s = "abcd"; 3642 wchar_t *ws = L"abcd"; 3643 char *w = "a"; 3644constantArrayType(hasSize(42)) 3645 matches "int a[42]" and "int b[2 * 21]" 3646stringLiteral(hasSize(4)) 3647 matches "abcd", L"abcd" 3648</pre></td></tr> 3649 3650 3651<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> 3652<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3653declarations. 3654 3655Example: Given 3656 int a, b; 3657 int c; 3658 int d = 2, e; 3659declCountIs(2) 3660 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3661</pre></td></tr> 3662 3663 3664<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> 3665<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3666 3667Matches a node if it equals the node previously bound to ID. 3668 3669Given 3670 class X { int a; int b; }; 3671cxxRecordDecl( 3672 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3673 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3674 matches the class X, as a and b have the same type. 3675 3676Note that when multiple matches are involved via forEach* matchers, 3677equalsBoundNodes acts as a filter. 3678For example: 3679compoundStmt( 3680 forEachDescendant(varDecl().bind("d")), 3681 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3682will trigger a match for each combination of variable declaration 3683and reference to that variable declaration within a compound statement. 3684</pre></td></tr> 3685 3686 3687<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> 3688<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3689 3690Decl has pointer identity in the AST. 3691</pre></td></tr> 3692 3693 3694<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> 3695<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3696 3697Given 3698 __attribute__((device)) void f() { ... } 3699decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3700f. If the matcher is used from clang-query, attr::Kind parameter should be 3701passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3702</pre></td></tr> 3703 3704 3705<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> 3706<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3707Does not match if only part of the statement is expanded from that macro or 3708if different parts of the the statement are expanded from different 3709appearances of the macro. 3710</pre></td></tr> 3711 3712 3713<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> 3714<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3715partially matching a given regex. 3716 3717Example matches Y but not X 3718 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3719 #include "ASTMatcher.h" 3720 class X {}; 3721ASTMatcher.h: 3722 class Y {}; 3723 3724Usable 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>> 3725 3726If the matcher is used in clang-query, RegexFlags parameter 3727should be passed as a quoted string. e.g: "NoFlags". 3728Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3729</pre></td></tr> 3730 3731 3732<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> 3733<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3734 3735Example matches X but not Y 3736 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3737 #include <Y.h> 3738 class X {}; 3739Y.h: 3740 class Y {}; 3741 3742Usable 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>> 3743</pre></td></tr> 3744 3745 3746<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> 3747<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3748 3749Example matches Y but not X 3750 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3751 #include <SystemHeader.h> 3752 class X {}; 3753SystemHeader.h: 3754 class Y {}; 3755 3756Usable 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>> 3757</pre></td></tr> 3758 3759 3760<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> 3761<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3762by the compiler (eg. implicit default/copy constructors). 3763</pre></td></tr> 3764 3765 3766<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> 3767<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3768 3769Given 3770 class vector {}; 3771 namespace foo { 3772 class vector {}; 3773 namespace std { 3774 class vector {}; 3775 } 3776 } 3777 namespace std { 3778 inline namespace __1 { 3779 class vector {}; // #1 3780 namespace experimental { 3781 class vector {}; 3782 } 3783 } 3784 } 3785cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3786</pre></td></tr> 3787 3788 3789<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> 3790<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3791template instantiations. 3792 3793Given 3794 template<typename T> void A(T t) { T i; } 3795 A(0); 3796 A(0U); 3797functionDecl(isInstantiated()) 3798 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3799</pre></td></tr> 3800 3801 3802<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> 3803<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3804inheritance. 3805 3806Examples: 3807 class C { 3808 public: int a; 3809 protected: int b; 3810 private: int c; // fieldDecl(isPrivate()) matches 'c' 3811 }; 3812 3813 struct Base {}; 3814 struct Derived1 : private Base {}; // matches 'Base' 3815 class Derived2 : Base {}; // matches 'Base' 3816</pre></td></tr> 3817 3818 3819<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> 3820<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3821protected inheritance. 3822 3823Examples: 3824 class C { 3825 public: int a; 3826 protected: int b; // fieldDecl(isProtected()) matches 'b' 3827 private: int c; 3828 }; 3829 3830 class Base {}; 3831 class Derived : protected Base {}; // matches 'Base' 3832</pre></td></tr> 3833 3834 3835<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> 3836<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3837inheritance. 3838 3839Examples: 3840 class C { 3841 public: int a; // fieldDecl(isPublic()) matches 'a' 3842 protected: int b; 3843 private: int c; 3844 }; 3845 3846 class Base {}; 3847 class Derived1 : public Base {}; // matches 'Base' 3848 struct Derived2 : Base {}; // matches 'Base' 3849</pre></td></tr> 3850 3851 3852<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> 3853<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3854a specific number of designators. 3855 3856Example: Given 3857 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3858 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3859designatorCountIs(2) 3860 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3861 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3862</pre></td></tr> 3863 3864 3865<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> 3866<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3867 3868Example matches Y (matcher = enumDecl(isScoped())) 3869enum X {}; 3870enum class Y {}; 3871</pre></td></tr> 3872 3873 3874<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> 3875<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3876neither type- nor value-dependent. 3877 3878In the following example, the expression sizeof(sizeof(T() + T())) 3879is instantiation-dependent (since it involves a template parameter T), 3880but is neither type- nor value-dependent, since the type of the inner 3881sizeof is known (std::size_t) and therefore the size of the outer 3882sizeof is known. 3883 template<typename T> 3884 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3885expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3886</pre></td></tr> 3887 3888 3889<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> 3890<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3891is not yet instantiated. 3892 3893For example, the expressions "x" and "x + y" are type-dependent in 3894the following code, but "y" is not type-dependent: 3895 template<typename T> 3896 void add(T x, int y) { 3897 x + y; 3898 } 3899expr(isTypeDependent()) matches x + y 3900</pre></td></tr> 3901 3902 3903<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> 3904<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3905non-type template parameter. 3906 3907For example, the array bound of "Chars" in the following example is 3908value-dependent. 3909 template<int Size> int f() { return Size; } 3910expr(isValueDependent()) matches return Size 3911</pre></td></tr> 3912 3913 3914<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> 3915<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3916GNU's __null, C++11's nullptr, or C's NULL macro. 3917 3918Given: 3919 void *v1 = NULL; 3920 void *v2 = nullptr; 3921 void *v3 = __null; // GNU extension 3922 char *cp = (char *)0; 3923 int *ip = 0; 3924 int i = 0; 3925expr(nullPointerConstant()) 3926 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3927 initializer for i. 3928</pre></td></tr> 3929 3930 3931<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> 3932<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3933bit width. 3934 3935Given 3936 class C { 3937 int a : 2; 3938 int b : 4; 3939 int c : 2; 3940 }; 3941fieldDecl(hasBitWidth(2)) 3942 matches 'int a;' and 'int c;' but not 'int b;'. 3943</pre></td></tr> 3944 3945 3946<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> 3947<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3948 3949Given 3950 class C { 3951 int a : 2; 3952 int b; 3953 }; 3954fieldDecl(isBitField()) 3955 matches 'int a;' but not 'int b;'. 3956</pre></td></tr> 3957 3958 3959<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> 3960<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3961 3962Given 3963 f('false, 3.14, 42); 3964characterLiteral(equals(0)) 3965 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3966 match false 3967floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3968 match 3.14 3969integerLiteral(equals(42)) 3970 matches 42 3971 3972Note that you cannot directly match a negative numeric literal because the 3973minus sign is not part of the literal: It is a unary operator whose operand 3974is the positive numeric literal. Instead, you must use a unaryOperator() 3975matcher to match the minus sign: 3976 3977unaryOperator(hasOperatorName("-"), 3978 hasUnaryOperand(integerLiteral(equals(13)))) 3979 3980Usable 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>>, 3981 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>> 3982</pre></td></tr> 3983 3984 3985<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> 3986<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3987 3988 3989<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> 3990<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3991 3992Matches overloaded operator names specified in strings without the 3993"operator" prefix: e.g. "<<". 3994 3995 hasAnyOverloadedOperatorName("+", "-") 3996Is equivalent to 3997 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3998</pre></td></tr> 3999 4000 4001<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> 4002<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4003 4004Given: 4005 void f(); 4006 void g() noexcept; 4007 void h() noexcept(true); 4008 void i() noexcept(false); 4009 void j() throw(); 4010 void k() throw(int); 4011 void l() throw(...); 4012functionDecl(hasDynamicExceptionSpec()) and 4013 functionProtoType(hasDynamicExceptionSpec()) 4014 match the declarations of j, k, and l, but not f, g, h, or i. 4015</pre></td></tr> 4016 4017 4018<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> 4019<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4020 4021Matches overloaded operator names specified in strings without the 4022"operator" prefix: e.g. "<<". 4023 4024Given: 4025 class A { int operator*(); }; 4026 const A &operator<<(const A &a, const A &b); 4027 A a; 4028 a << a; // <-- This matches 4029 4030cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4031specified line and 4032cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4033matches the declaration of A. 4034 4035Usable 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>> 4036</pre></td></tr> 4037 4038 4039<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> 4040<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4041 4042Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4043int X() {} 4044auto Y() -> int {} 4045</pre></td></tr> 4046 4047 4048<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> 4049<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4050 and if constexpr. 4051 4052Given: 4053 constexpr int foo = 42; 4054 constexpr int bar(); 4055 void baz() { if constexpr(1 > 0) {} } 4056varDecl(isConstexpr()) 4057 matches the declaration of foo. 4058functionDecl(isConstexpr()) 4059 matches the declaration of bar. 4060ifStmt(isConstexpr()) 4061 matches the if statement in baz. 4062</pre></td></tr> 4063 4064 4065<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> 4066<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4067 4068Given: 4069 class A { ~A(); }; 4070 class B { ~B() = default; }; 4071functionDecl(isDefaulted()) 4072 matches the declaration of ~B, but not ~A. 4073</pre></td></tr> 4074 4075 4076<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> 4077<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4078 4079Example matches A, va, fa 4080 class A {}; 4081 class B; // Doesn't match, as it has no body. 4082 int va; 4083 extern int vb; // Doesn't match, as it doesn't define the variable. 4084 void fa() {} 4085 void fb(); // Doesn't match, as it has no body. 4086 @interface X 4087 - (void)ma; // Doesn't match, interface is declaration. 4088 @end 4089 @implementation X 4090 - (void)ma {} 4091 @end 4092 4093Usable 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>>, 4094 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4095</pre></td></tr> 4096 4097 4098<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> 4099<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4100 4101Given: 4102 void Func(); 4103 void DeletedFunc() = delete; 4104functionDecl(isDeleted()) 4105 matches the declaration of DeletedFunc, but not Func. 4106</pre></td></tr> 4107 4108 4109<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> 4110<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4111static member variable template instantiations. 4112 4113Given 4114 template<typename T> void A(T t) { } 4115 template<> void A(int N) { } 4116functionDecl(isExplicitTemplateSpecialization()) 4117 matches the specialization A<int>(). 4118 4119Usable 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>> 4120</pre></td></tr> 4121 4122 4123<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> 4124<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4125 4126Given: 4127 extern "C" void f() {} 4128 extern "C" { void g() {} } 4129 void h() {} 4130 extern "C" int x = 1; 4131 extern "C" int y = 2; 4132 int z = 3; 4133functionDecl(isExternC()) 4134 matches the declaration of f and g, but not the declaration of h. 4135varDecl(isExternC()) 4136 matches the declaration of x and y, but not the declaration of z. 4137</pre></td></tr> 4138 4139 4140<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> 4141<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4142the inline keyword. 4143 4144Given 4145 inline void f(); 4146 void g(); 4147 namespace n { 4148 inline namespace m {} 4149 } 4150functionDecl(isInline()) will match ::f(). 4151namespaceDecl(isInline()) will match n::m. 4152</pre></td></tr> 4153 4154 4155<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> 4156<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4157into an executable program. 4158</pre></td></tr> 4159 4160 4161<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> 4162<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4163 4164Given 4165 void nope(); 4166 [[noreturn]] void a(); 4167 __attribute__((noreturn)) void b(); 4168 struct c { [[noreturn]] c(); }; 4169functionDecl(isNoReturn()) 4170 matches all of those except 4171 void nope(); 4172</pre></td></tr> 4173 4174 4175<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> 4176<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4177 4178Given: 4179 void f(); 4180 void g() noexcept; 4181 void h() throw(); 4182 void i() throw(int); 4183 void j() noexcept(false); 4184functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4185 match the declarations of g, and h, but not f, i or j. 4186</pre></td></tr> 4187 4188 4189<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> 4190<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4191class specifier ("static" keyword) written in the source. 4192 4193Given: 4194 static void f() {} 4195 static int i = 0; 4196 extern int j; 4197 int k; 4198functionDecl(isStaticStorageClass()) 4199 matches the function declaration f. 4200varDecl(isStaticStorageClass()) 4201 matches the variable declaration i. 4202</pre></td></tr> 4203 4204 4205<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> 4206<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4207member variable template instantiations. 4208 4209Given 4210 template <typename T> class X {}; class A {}; X<A> x; 4211or 4212 template <typename T> class X {}; class A {}; template class X<A>; 4213or 4214 template <typename T> class X {}; class A {}; extern template class X<A>; 4215cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4216 matches the template instantiation of X<A>. 4217 4218But given 4219 template <typename T> class X {}; class A {}; 4220 template <> class X<A> {}; X<A> x; 4221cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4222 does not match, as X<A> is an explicit template specialization. 4223 4224Usable 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>> 4225</pre></td></tr> 4226 4227 4228<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> 4229<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4230 4231Example matches f, but not g or h. The function i will not match, even when 4232compiled in C mode. 4233 void f(...); 4234 void g(int); 4235 template <typename... Ts> void h(Ts...); 4236 void i(); 4237</pre></td></tr> 4238 4239 4240<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> 4241<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4242 4243Given: 4244 void foo() __attribute__((__weakref__("__foo"))); 4245 void bar(); 4246functionDecl(isWeak()) 4247 matches the weak declaration "foo", but not "bar". 4248</pre></td></tr> 4249 4250 4251<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> 4252<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4253specific parameter count. 4254 4255Given 4256 void f(int i) {} 4257 void g(int i, int j) {} 4258 void h(int i, int j); 4259 void j(int i); 4260 void k(int x, int y, int z, ...); 4261functionDecl(parameterCountIs(2)) 4262 matches g and h 4263functionProtoType(parameterCountIs(2)) 4264 matches g and h 4265functionProtoType(parameterCountIs(3)) 4266 matches k 4267</pre></td></tr> 4268 4269 4270<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> 4271<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4272 4273Given: 4274 void f(); 4275 void g() noexcept; 4276 void h() noexcept(true); 4277 void i() noexcept(false); 4278 void j() throw(); 4279 void k() throw(int); 4280 void l() throw(...); 4281functionDecl(hasDynamicExceptionSpec()) and 4282 functionProtoType(hasDynamicExceptionSpec()) 4283 match the declarations of j, k, and l, but not f, g, h, or i. 4284</pre></td></tr> 4285 4286 4287<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> 4288<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4289 4290Given: 4291 void f(); 4292 void g() noexcept; 4293 void h() throw(); 4294 void i() throw(int); 4295 void j() noexcept(false); 4296functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4297 match the declarations of g, and h, but not f, i or j. 4298</pre></td></tr> 4299 4300 4301<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> 4302<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4303specific parameter count. 4304 4305Given 4306 void f(int i) {} 4307 void g(int i, int j) {} 4308 void h(int i, int j); 4309 void j(int i); 4310 void k(int x, int y, int z, ...); 4311functionDecl(parameterCountIs(2)) 4312 matches g and h 4313functionProtoType(parameterCountIs(2)) 4314 matches g and h 4315functionProtoType(parameterCountIs(3)) 4316 matches k 4317</pre></td></tr> 4318 4319 4320<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> 4321<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4322 and if constexpr. 4323 4324Given: 4325 constexpr int foo = 42; 4326 constexpr int bar(); 4327 void baz() { if constexpr(1 > 0) {} } 4328varDecl(isConstexpr()) 4329 matches the declaration of foo. 4330functionDecl(isConstexpr()) 4331 matches the declaration of bar. 4332ifStmt(isConstexpr()) 4333 matches the if statement in baz. 4334</pre></td></tr> 4335 4336 4337<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> 4338<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4339 4340 4341<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> 4342<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4343 4344Given 4345 f('false, 3.14, 42); 4346characterLiteral(equals(0)) 4347 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4348 match false 4349floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4350 match 3.14 4351integerLiteral(equals(42)) 4352 matches 42 4353 4354Note that you cannot directly match a negative numeric literal because the 4355minus sign is not part of the literal: It is a unary operator whose operand 4356is the positive numeric literal. Instead, you must use a unaryOperator() 4357matcher to match the minus sign: 4358 4359unaryOperator(hasOperatorName("-"), 4360 hasUnaryOperand(integerLiteral(equals(13)))) 4361 4362Usable 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>>, 4363 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>> 4364</pre></td></tr> 4365 4366 4367<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> 4368<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4369 4370 4371<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> 4372<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4373 4374 4375<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> 4376<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4377to '.'. 4378 4379Member calls on the implicit this pointer match as called with '->'. 4380 4381Given 4382 class Y { 4383 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4384 template <class T> void f() { this->f<T>(); f<T>(); } 4385 int a; 4386 static int b; 4387 }; 4388 template <class T> 4389 class Z { 4390 void x() { this->m; } 4391 }; 4392memberExpr(isArrow()) 4393 matches this->x, x, y.x, a, this->b 4394cxxDependentScopeMemberExpr(isArrow()) 4395 matches this->m 4396unresolvedMemberExpr(isArrow()) 4397 matches this->f<T>, f<T> 4398</pre></td></tr> 4399 4400 4401<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> 4402<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4403 4404This matcher is only provided as a performance optimization of hasName. 4405 hasAnyName(a, b, c) 4406 is equivalent to, but faster than 4407 anyOf(hasName(a), hasName(b), hasName(c)) 4408</pre></td></tr> 4409 4410 4411<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> 4412<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4413 4414Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4415void f() { 4416 int x; 4417 static int y; 4418} 4419int z; 4420 4421Example matches f() because it has external formal linkage despite being 4422unique to the translation unit as though it has internal likage 4423(matcher = functionDecl(hasExternalFormalLinkage())) 4424 4425namespace { 4426void f() {} 4427} 4428</pre></td></tr> 4429 4430 4431<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> 4432<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4433 4434Supports specifying enclosing namespaces or classes by prefixing the name 4435with '<enclosing>::'. 4436Does not match typedefs of an underlying type with the given name. 4437 4438Example matches X (Name == "X") 4439 class X; 4440 4441Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4442 namespace a { namespace b { class X; } } 4443</pre></td></tr> 4444 4445 4446<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> 4447<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4448a substring matched by the given RegExp. 4449 4450Supports specifying enclosing namespaces or classes by 4451prefixing the name with '<enclosing>::'. Does not match typedefs 4452of an underlying type with the given name. 4453 4454Example matches X (regexp == "::X") 4455 class X; 4456 4457Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4458 namespace foo { namespace bar { class X; } } 4459 4460If the matcher is used in clang-query, RegexFlags parameter 4461should be passed as a quoted string. e.g: "NoFlags". 4462Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4463</pre></td></tr> 4464 4465 4466<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> 4467<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4468 4469Given 4470 namespace n { 4471 namespace {} // #1 4472 } 4473namespaceDecl(isAnonymous()) will match #1 but not ::n. 4474</pre></td></tr> 4475 4476 4477<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> 4478<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4479the inline keyword. 4480 4481Given 4482 inline void f(); 4483 void g(); 4484 namespace n { 4485 inline namespace m {} 4486 } 4487functionDecl(isInline()) will match ::f(). 4488namespaceDecl(isInline()) will match n::m. 4489</pre></td></tr> 4490 4491 4492<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> 4493<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4494specified. 4495 4496Given 4497 4498 #pragma omp parallel 4499 #pragma omp parallel default(none) 4500 #pragma omp parallel default(shared) 4501 #pragma omp parallel default(firstprivate) 4502 4503``ompDefaultClause(isFirstPrivateKind())`` matches only 4504``default(firstprivate)``. 4505</pre></td></tr> 4506 4507 4508<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> 4509<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4510 4511Given 4512 4513 #pragma omp parallel 4514 #pragma omp parallel default(none) 4515 #pragma omp parallel default(shared) 4516 #pragma omp parallel default(firstprivate) 4517 4518``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4519</pre></td></tr> 4520 4521 4522<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> 4523<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4524 4525Given 4526 4527 #pragma omp parallel 4528 #pragma omp parallel default(none) 4529 #pragma omp parallel default(shared) 4530 #pragma omp parallel default(firstprivate) 4531 4532``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4533</pre></td></tr> 4534 4535 4536<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> 4537<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4538clause kind. 4539 4540Given 4541 4542 #pragma omp parallel 4543 #pragma omp parallel for 4544 #pragma omp for 4545 4546`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4547``omp parallel`` and ``omp parallel for``. 4548 4549If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4550should be passed as a quoted string. e.g., 4551``isAllowedToContainClauseKind("OMPC_default").`` 4552</pre></td></tr> 4553 4554 4555<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> 4556<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4557i.e., directives that can't have a structured block. 4558 4559Given 4560 4561 #pragma omp parallel 4562 {} 4563 #pragma omp taskyield 4564 4565``ompExecutableDirective(isStandaloneDirective()))`` matches 4566``omp taskyield``. 4567</pre></td></tr> 4568 4569 4570<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> 4571<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4572</pre></td></tr> 4573 4574 4575<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> 4576<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4577</pre></td></tr> 4578 4579 4580<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> 4581<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4582isSameOrDerivedFrom(hasName(...)). 4583</pre></td></tr> 4584 4585 4586<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> 4587<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4588a specific number of arguments (including absent default arguments). 4589 4590Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4591 void f(int x, int y); 4592 f(0, 0); 4593</pre></td></tr> 4594 4595 4596<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> 4597<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4598Selector.getAsString() 4599 4600 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4601 matches both of the expressions below: 4602 [myObj methodA:argA]; 4603 [myObj methodB:argB]; 4604</pre></td></tr> 4605 4606 4607<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> 4608<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4609 4610objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4611message expression in 4612 4613 UIWebView *webView = ...; 4614 CGRect bodyFrame = webView.frame; 4615 bodyFrame.size.height = self.bodyContentHeight; 4616 webView.frame = bodyFrame; 4617 // ^---- matches here 4618</pre></td></tr> 4619 4620 4621<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> 4622<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4623 4624Matches only when the selector of the objCMessageExpr is NULL. This may 4625represent an error condition in the tree! 4626</pre></td></tr> 4627 4628 4629<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> 4630<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4631 4632 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4633 matches the outer message expr in the code below, but NOT the message 4634 invocation for self.bodyView. 4635 [self.bodyView loadHTMLString:html baseURL:NULL]; 4636</pre></td></tr> 4637 4638 4639<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> 4640<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4641 4642 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4643 matches self.bodyView in the code below, but NOT the outer message 4644 invocation of "loadHTMLString:baseURL:". 4645 [self.bodyView loadHTMLString:html baseURL:NULL]; 4646</pre></td></tr> 4647 4648 4649<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> 4650<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4651 4652Example 4653matcher = objcMessageExpr(isClassMessage()) 4654matches 4655 [NSString stringWithFormat:@"format"]; 4656but not 4657 NSString *x = @"hello"; 4658 [x containsString:@"h"]; 4659</pre></td></tr> 4660 4661 4662<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> 4663<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4664 4665Example 4666matcher = objcMessageExpr(isInstanceMessage()) 4667matches 4668 NSString *x = @"hello"; 4669 [x containsString:@"h"]; 4670but not 4671 [NSString stringWithFormat:@"format"]; 4672</pre></td></tr> 4673 4674 4675<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> 4676<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4677a substring matched by the given RegExp. 4678 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4679 invocation for self.bodyView. 4680 [self.bodyView loadHTMLString:html baseURL:NULL]; 4681 4682If the matcher is used in clang-query, RegexFlags parameter 4683should be passed as a quoted string. e.g: "NoFlags". 4684Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4685</pre></td></tr> 4686 4687 4688<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> 4689<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4690 4691 matcher = objCMessageExpr(numSelectorArgs(0)); 4692 matches self.bodyView in the code below 4693 4694 matcher = objCMessageExpr(numSelectorArgs(2)); 4695 matches the invocation of "loadHTMLString:baseURL:" but not that 4696 of self.bodyView 4697 [self.bodyView loadHTMLString:html baseURL:NULL]; 4698</pre></td></tr> 4699 4700 4701<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> 4702<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4703 4704Example 4705matcher = objcMethodDecl(isClassMethod()) 4706matches 4707@interface I + (void)foo; @end 4708but not 4709@interface I - (void)bar; @end 4710</pre></td></tr> 4711 4712 4713<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> 4714<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4715 4716Example matches A, va, fa 4717 class A {}; 4718 class B; // Doesn't match, as it has no body. 4719 int va; 4720 extern int vb; // Doesn't match, as it doesn't define the variable. 4721 void fa() {} 4722 void fb(); // Doesn't match, as it has no body. 4723 @interface X 4724 - (void)ma; // Doesn't match, interface is declaration. 4725 @end 4726 @implementation X 4727 - (void)ma {} 4728 @end 4729 4730Usable 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>>, 4731 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4732</pre></td></tr> 4733 4734 4735<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> 4736<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4737 4738Example 4739matcher = objcMethodDecl(isInstanceMethod()) 4740matches 4741@interface I - (void)bar; @end 4742but not 4743@interface I + (void)foo; @end 4744</pre></td></tr> 4745 4746 4747<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> 4748<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4749 4750Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4751void x(int val) {} 4752void y(int val = 0) {} 4753 4754Deprecated. Use hasInitializer() instead to be able to 4755match on the contents of the default argument. For example: 4756 4757void x(int val = 7) {} 4758void y(int val = 42) {} 4759parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4760 matches the parameter of y 4761 4762A matcher such as 4763 parmVarDecl(hasInitializer(anything())) 4764is equivalent to parmVarDecl(hasDefaultArgument()). 4765</pre></td></tr> 4766 4767 4768<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> 4769<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4770list. The parameter list could be that of either a block, function, or 4771objc-method. 4772 4773 4774Given 4775 4776void f(int a, int b, int c) { 4777} 4778 4779``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4780 4781``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4782</pre></td></tr> 4783 4784 4785<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> 4786<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4787 4788Given 4789 class Y { public: void x(); }; 4790 void z() { Y* y; y->x(); } 4791cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4792 matches y->x() 4793</pre></td></tr> 4794 4795 4796<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> 4797<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4798 4799Matches a node if it equals the node previously bound to ID. 4800 4801Given 4802 class X { int a; int b; }; 4803cxxRecordDecl( 4804 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4805 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4806 matches the class X, as a and b have the same type. 4807 4808Note that when multiple matches are involved via forEach* matchers, 4809equalsBoundNodes acts as a filter. 4810For example: 4811compoundStmt( 4812 forEachDescendant(varDecl().bind("d")), 4813 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4814will trigger a match for each combination of variable declaration 4815and reference to that variable declaration within a compound statement. 4816</pre></td></tr> 4817 4818 4819<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> 4820<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4821the node, not hidden within a typedef. 4822 4823Given 4824 typedef const int const_int; 4825 const_int i; 4826 int *const j; 4827 int *volatile k; 4828 int m; 4829varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4830i is const-qualified but the qualifier is not local. 4831</pre></td></tr> 4832 4833 4834<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> 4835<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4836 4837Given 4838 void a(char); 4839 void b(wchar_t); 4840 void c(double); 4841functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4842matches "a(char)", "b(wchar_t)", but not "c(double)". 4843</pre></td></tr> 4844 4845 4846<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> 4847<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4848the Objective-C object pointer type, which is different despite being 4849syntactically similar. 4850 4851Given 4852 int *i = nullptr; 4853 4854 @interface Foo 4855 @end 4856 Foo *f; 4857 4858 int j; 4859varDecl(hasType(isAnyPointer())) 4860 matches "int *i" and "Foo *f", but not "int j". 4861</pre></td></tr> 4862 4863 4864<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> 4865<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4866include "top-level" const. 4867 4868Given 4869 void a(int); 4870 void b(int const); 4871 void c(const int); 4872 void d(const int*); 4873 void e(int const) {}; 4874functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4875 matches "void b(int const)", "void c(const int)" and 4876 "void e(int const) {}". It does not match d as there 4877 is no top-level const on the parameter type "const int *". 4878</pre></td></tr> 4879 4880 4881<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> 4882<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4883 4884Given 4885 void a(int); 4886 void b(long); 4887 void c(double); 4888functionDecl(hasAnyParameter(hasType(isInteger()))) 4889matches "a(int)", "b(long)", but not "c(double)". 4890</pre></td></tr> 4891 4892 4893<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> 4894<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4895 4896Given 4897 void a(int); 4898 void b(unsigned long); 4899 void c(double); 4900functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4901matches "a(int)", but not "b(unsigned long)" and "c(double)". 4902</pre></td></tr> 4903 4904 4905<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> 4906<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4907 4908Given 4909 void a(int); 4910 void b(unsigned long); 4911 void c(double); 4912functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4913matches "b(unsigned long)", but not "a(int)" and "c(double)". 4914</pre></td></tr> 4915 4916 4917<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> 4918<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4919include "top-level" volatile. 4920 4921Given 4922 void a(int); 4923 void b(int volatile); 4924 void c(volatile int); 4925 void d(volatile int*); 4926 void e(int volatile) {}; 4927functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4928 matches "void b(int volatile)", "void c(volatile int)" and 4929 "void e(int volatile) {}". It does not match d as there 4930 is no top-level volatile on the parameter type "volatile int *". 4931</pre></td></tr> 4932 4933 4934<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> 4935<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4936 4937Matches a node if it equals the node previously bound to ID. 4938 4939Given 4940 class X { int a; int b; }; 4941cxxRecordDecl( 4942 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4943 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4944 matches the class X, as a and b have the same type. 4945 4946Note that when multiple matches are involved via forEach* matchers, 4947equalsBoundNodes acts as a filter. 4948For example: 4949compoundStmt( 4950 forEachDescendant(varDecl().bind("d")), 4951 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4952will trigger a match for each combination of variable declaration 4953and reference to that variable declaration within a compound statement. 4954</pre></td></tr> 4955 4956 4957<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> 4958<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4959 4960Stmt has pointer identity in the AST. 4961</pre></td></tr> 4962 4963 4964<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> 4965<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 4966Does not match if only part of the statement is expanded from that macro or 4967if different parts of the the statement are expanded from different 4968appearances of the macro. 4969</pre></td></tr> 4970 4971 4972<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> 4973<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4974partially matching a given regex. 4975 4976Example matches Y but not X 4977 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4978 #include "ASTMatcher.h" 4979 class X {}; 4980ASTMatcher.h: 4981 class Y {}; 4982 4983Usable 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>> 4984 4985If the matcher is used in clang-query, RegexFlags parameter 4986should be passed as a quoted string. e.g: "NoFlags". 4987Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4988</pre></td></tr> 4989 4990 4991<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> 4992<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4993 4994Example matches X but not Y 4995 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4996 #include <Y.h> 4997 class X {}; 4998Y.h: 4999 class Y {}; 5000 5001Usable 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>> 5002</pre></td></tr> 5003 5004 5005<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> 5006<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5007 5008Example matches Y but not X 5009 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5010 #include <SystemHeader.h> 5011 class X {}; 5012SystemHeader.h: 5013 class Y {}; 5014 5015Usable 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>> 5016</pre></td></tr> 5017 5018 5019<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> 5020<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5021 5022Given 5023 int j; 5024 template<typename T> void A(T t) { T i; j += 42;} 5025 A(0); 5026 A(0U); 5027declStmt(isInTemplateInstantiation()) 5028 matches 'int i;' and 'unsigned i'. 5029unless(stmt(isInTemplateInstantiation())) 5030 will NOT match j += 42; as it's shared between the template definition and 5031 instantiation. 5032</pre></td></tr> 5033 5034 5035<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> 5036<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5037 5038Given 5039 int a[42]; 5040 int b[2 * 21]; 5041 int c[41], d[43]; 5042 char *s = "abcd"; 5043 wchar_t *ws = L"abcd"; 5044 char *w = "a"; 5045constantArrayType(hasSize(42)) 5046 matches "int a[42]" and "int b[2 * 21]" 5047stringLiteral(hasSize(4)) 5048 matches "abcd", L"abcd" 5049</pre></td></tr> 5050 5051 5052<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> 5053<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5054 5055Example matches C, but not S, U or E. 5056 struct S {}; 5057 class C {}; 5058 union U {}; 5059 enum E {}; 5060</pre></td></tr> 5061 5062 5063<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> 5064<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5065 5066Example matches A, va, fa 5067 class A {}; 5068 class B; // Doesn't match, as it has no body. 5069 int va; 5070 extern int vb; // Doesn't match, as it doesn't define the variable. 5071 void fa() {} 5072 void fb(); // Doesn't match, as it has no body. 5073 @interface X 5074 - (void)ma; // Doesn't match, interface is declaration. 5075 @end 5076 @implementation X 5077 - (void)ma {} 5078 @end 5079 5080Usable 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>>, 5081 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5082</pre></td></tr> 5083 5084 5085<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> 5086<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5087 5088Example matches E, but not C, S or U. 5089 struct S {}; 5090 class C {}; 5091 union U {}; 5092 enum E {}; 5093</pre></td></tr> 5094 5095 5096<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> 5097<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5098 5099Example matches S, but not C, U or E. 5100 struct S {}; 5101 class C {}; 5102 union U {}; 5103 enum E {}; 5104</pre></td></tr> 5105 5106 5107<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> 5108<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5109 5110Example matches U, but not C, S or E. 5111 struct S {}; 5112 class C {}; 5113 union U {}; 5114 enum E {}; 5115</pre></td></tr> 5116 5117 5118<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> 5119<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5120 5121Note that 'Value' is a string as the template argument's value is 5122an arbitrary precision integer. 'Value' must be euqal to the canonical 5123representation of that integral value in base 10. 5124 5125Given 5126 template<int T> struct C {}; 5127 C<42> c; 5128classTemplateSpecializationDecl( 5129 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5130 matches the implicit instantiation of C in C<42>. 5131</pre></td></tr> 5132 5133 5134<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> 5135<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5136 5137Given 5138 template<int T> struct C {}; 5139 C<42> c; 5140classTemplateSpecializationDecl( 5141 hasAnyTemplateArgument(isIntegral())) 5142 matches the implicit instantiation of C in C<42> 5143 with isIntegral() matching 42. 5144</pre></td></tr> 5145 5146 5147<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> 5148<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5149 5150Given 5151 template<typename T> struct C {}; 5152 C<int> c; 5153classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5154 matches C<int>. 5155</pre></td></tr> 5156 5157 5158<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> 5159<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5160Does not match if only part of the statement is expanded from that macro or 5161if different parts of the the statement are expanded from different 5162appearances of the macro. 5163</pre></td></tr> 5164 5165 5166<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> 5167<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5168partially matching a given regex. 5169 5170Example matches Y but not X 5171 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5172 #include "ASTMatcher.h" 5173 class X {}; 5174ASTMatcher.h: 5175 class Y {}; 5176 5177Usable 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>> 5178 5179If the matcher is used in clang-query, RegexFlags parameter 5180should be passed as a quoted string. e.g: "NoFlags". 5181Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5182</pre></td></tr> 5183 5184 5185<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> 5186<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5187 5188Example matches X but not Y 5189 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5190 #include <Y.h> 5191 class X {}; 5192Y.h: 5193 class Y {}; 5194 5195Usable 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>> 5196</pre></td></tr> 5197 5198 5199<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> 5200<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5201 5202Example matches Y but not X 5203 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5204 #include <SystemHeader.h> 5205 class X {}; 5206SystemHeader.h: 5207 class Y {}; 5208 5209Usable 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>> 5210</pre></td></tr> 5211 5212 5213<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> 5214<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5215 5216Given 5217 struct S { bool func(); }; 5218functionDecl(returns(booleanType())) 5219 matches "bool func();" 5220</pre></td></tr> 5221 5222 5223<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> 5224<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5225 5226Matches a node if it equals the node previously bound to ID. 5227 5228Given 5229 class X { int a; int b; }; 5230cxxRecordDecl( 5231 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5232 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5233 matches the class X, as a and b have the same type. 5234 5235Note that when multiple matches are involved via forEach* matchers, 5236equalsBoundNodes acts as a filter. 5237For example: 5238compoundStmt( 5239 forEachDescendant(varDecl().bind("d")), 5240 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5241will trigger a match for each combination of variable declaration 5242and reference to that variable declaration within a compound statement. 5243</pre></td></tr> 5244 5245 5246<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> 5247<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5248 5249Type has pointer identity in the AST. 5250</pre></td></tr> 5251 5252 5253<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> 5254<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5255 5256Given 5257 int i; 5258 float f; 5259realFloatingPointType() 5260 matches "float f" but not "int i" 5261</pre></td></tr> 5262 5263 5264<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> 5265<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5266 5267Given 5268 struct S { void func(); }; 5269functionDecl(returns(voidType())) 5270 matches "void func();" 5271</pre></td></tr> 5272 5273 5274<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> 5275<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5276 5277Given 5278 int x; 5279 int s = sizeof(x) + alignof(x) 5280unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5281 matches sizeof(x) 5282 5283If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5284should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5285</pre></td></tr> 5286 5287 5288<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 5289<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5290specified names. 5291 5292 hasAnyOperatorName("+", "-") 5293 Is equivalent to 5294 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5295</pre></td></tr> 5296 5297 5298<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 5299<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5300unary). 5301 5302Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5303 !(a || b) 5304</pre></td></tr> 5305 5306 5307<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> 5308<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5309to '.'. 5310 5311Member calls on the implicit this pointer match as called with '->'. 5312 5313Given 5314 class Y { 5315 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5316 template <class T> void f() { this->f<T>(); f<T>(); } 5317 int a; 5318 static int b; 5319 }; 5320 template <class T> 5321 class Z { 5322 void x() { this->m; } 5323 }; 5324memberExpr(isArrow()) 5325 matches this->x, x, y.x, a, this->b 5326cxxDependentScopeMemberExpr(isArrow()) 5327 matches this->m 5328unresolvedMemberExpr(isArrow()) 5329 matches this->f<T>, f<T> 5330</pre></td></tr> 5331 5332 5333<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> 5334<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5335 5336Example matches x, but not y, z, or a. 5337(matcher = varDecl(hasAutomaticStorageDuration()) 5338void f() { 5339 int x; 5340 static int y; 5341 thread_local int z; 5342} 5343int a; 5344</pre></td></tr> 5345 5346 5347<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> 5348<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5349 5350Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5351void f() { 5352 int x; 5353 static int y; 5354} 5355int z; 5356</pre></td></tr> 5357 5358 5359<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> 5360<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5361non-static local variable. 5362 5363Example matches x (matcher = varDecl(hasLocalStorage()) 5364void f() { 5365 int x; 5366 static int y; 5367} 5368int z; 5369</pre></td></tr> 5370 5371 5372<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> 5373<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5374It includes the variable declared at namespace scope and those declared 5375with "static" and "extern" storage class specifiers. 5376 5377void f() { 5378 int x; 5379 static int y; 5380 thread_local int z; 5381} 5382int a; 5383static int b; 5384extern int c; 5385varDecl(hasStaticStorageDuration()) 5386 matches the function declaration y, a, b and c. 5387</pre></td></tr> 5388 5389 5390<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> 5391<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5392 5393Example matches z, but not x, z, or a. 5394(matcher = varDecl(hasThreadStorageDuration()) 5395void f() { 5396 int x; 5397 static int y; 5398 thread_local int z; 5399} 5400int a; 5401</pre></td></tr> 5402 5403 5404<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> 5405<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5406 and if constexpr. 5407 5408Given: 5409 constexpr int foo = 42; 5410 constexpr int bar(); 5411 void baz() { if constexpr(1 > 0) {} } 5412varDecl(isConstexpr()) 5413 matches the declaration of foo. 5414functionDecl(isConstexpr()) 5415 matches the declaration of bar. 5416ifStmt(isConstexpr()) 5417 matches the if statement in baz. 5418</pre></td></tr> 5419 5420 5421<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> 5422<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5423 5424Example matches A, va, fa 5425 class A {}; 5426 class B; // Doesn't match, as it has no body. 5427 int va; 5428 extern int vb; // Doesn't match, as it doesn't define the variable. 5429 void fa() {} 5430 void fb(); // Doesn't match, as it has no body. 5431 @interface X 5432 - (void)ma; // Doesn't match, interface is declaration. 5433 @end 5434 @implementation X 5435 - (void)ma {} 5436 @end 5437 5438Usable 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>>, 5439 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5440</pre></td></tr> 5441 5442 5443<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> 5444<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5445a C++ catch block, or an Objective-C statement. 5446 5447Example matches x (matcher = varDecl(isExceptionVariable()) 5448void f(int y) { 5449 try { 5450 } catch (int x) { 5451 } 5452} 5453</pre></td></tr> 5454 5455 5456<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> 5457<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5458static member variable template instantiations. 5459 5460Given 5461 template<typename T> void A(T t) { } 5462 template<> void A(int N) { } 5463functionDecl(isExplicitTemplateSpecialization()) 5464 matches the specialization A<int>(). 5465 5466Usable 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>> 5467</pre></td></tr> 5468 5469 5470<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> 5471<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5472 5473Given: 5474 extern "C" void f() {} 5475 extern "C" { void g() {} } 5476 void h() {} 5477 extern "C" int x = 1; 5478 extern "C" int y = 2; 5479 int z = 3; 5480functionDecl(isExternC()) 5481 matches the declaration of f and g, but not the declaration of h. 5482varDecl(isExternC()) 5483 matches the declaration of x and y, but not the declaration of z. 5484</pre></td></tr> 5485 5486 5487<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> 5488<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5489 5490Example matches y (matcher = varDecl(isStaticLocal())) 5491void f() { 5492 int x; 5493 static int y; 5494} 5495static int z; 5496</pre></td></tr> 5497 5498 5499<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> 5500<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5501class specifier ("static" keyword) written in the source. 5502 5503Given: 5504 static void f() {} 5505 static int i = 0; 5506 extern int j; 5507 int k; 5508functionDecl(isStaticStorageClass()) 5509 matches the function declaration f. 5510varDecl(isStaticStorageClass()) 5511 matches the variable declaration i. 5512</pre></td></tr> 5513 5514 5515<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> 5516<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5517member variable template instantiations. 5518 5519Given 5520 template <typename T> class X {}; class A {}; X<A> x; 5521or 5522 template <typename T> class X {}; class A {}; template class X<A>; 5523or 5524 template <typename T> class X {}; class A {}; extern template class X<A>; 5525cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5526 matches the template instantiation of X<A>. 5527 5528But given 5529 template <typename T> class X {}; class A {}; 5530 template <> class X<A> {}; X<A> x; 5531cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5532 does not match, as X<A> is an explicit template specialization. 5533 5534Usable 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>> 5535</pre></td></tr> 5536 5537<!--END_NARROWING_MATCHERS --> 5538</table> 5539 5540<!-- ======================================================================= --> 5541<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5542<!-- ======================================================================= --> 5543 5544<p>Traversal matchers specify the relationship to other nodes that are 5545reachable from the current node.</p> 5546 5547<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5548forEachDescendant) which work on all nodes and allow users to write more generic 5549match expressions.</p> 5550 5551<table> 5552<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5553<!-- START_TRAVERSAL_MATCHERS --> 5554 5555<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5556<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5557 5558The code 5559 var1 != var2; 5560might be represented in the clang AST as a binaryOperator, a 5561cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5562 5563* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5564 least one is a class type (cxxOperatorCallExpr) 5565* whether the code appears in a template declaration, if at least one of the 5566 vars is a dependent-type (binaryOperator) 5567* whether the code relies on a rewritten binary operator, such as a 5568spaceship operator or an inverted equality operator 5569(cxxRewrittenBinaryOperator) 5570 5571This matcher elides details in places where the matchers for the nodes are 5572compatible. 5573 5574Given 5575 binaryOperation( 5576 hasOperatorName("!="), 5577 hasLHS(expr().bind("lhs")), 5578 hasRHS(expr().bind("rhs")) 5579 ) 5580matches each use of "!=" in: 5581 struct S{ 5582 bool operator!=(const S&) const; 5583 }; 5584 5585 void foo() 5586 { 5587 1 != 2; 5588 S() != S(); 5589 } 5590 5591 template<typename T> 5592 void templ() 5593 { 5594 1 != 2; 5595 T() != S(); 5596 } 5597 struct HasOpEq 5598 { 5599 bool operator==(const HasOpEq &) const; 5600 }; 5601 5602 void inverse() 5603 { 5604 HasOpEq s1; 5605 HasOpEq s2; 5606 if (s1 != s2) 5607 return; 5608 } 5609 5610 struct HasSpaceship 5611 { 5612 bool operator<=>(const HasOpEq &) const; 5613 }; 5614 5615 void use_spaceship() 5616 { 5617 HasSpaceship s1; 5618 HasSpaceship s2; 5619 if (s1 != s2) 5620 return; 5621 } 5622</pre></td></tr> 5623 5624 5625<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5626<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5627 5628Unlike anyOf, eachOf will generate a match result for each 5629matching submatcher. 5630 5631For example, in: 5632 class A { int a; int b; }; 5633The matcher: 5634 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5635 has(fieldDecl(hasName("b")).bind("v")))) 5636will generate two results binding "v", the first of which binds 5637the field declaration of a, the second the field declaration of 5638b. 5639 5640Usable as: Any Matcher 5641</pre></td></tr> 5642 5643 5644<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5645<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5646 5647Generates results for each match. 5648 5649For example, in: 5650 class A { class B {}; class C {}; }; 5651The matcher: 5652 cxxRecordDecl(hasName("::A"), 5653 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5654will generate results for A, B and C. 5655 5656Usable as: Any Matcher 5657</pre></td></tr> 5658 5659 5660<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5661<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5662provided matcher. 5663 5664Example matches X, A, A::X, B, B::C, B::C::X 5665 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5666 class X {}; 5667 class A { class X {}; }; // Matches A, because A::X is a class of name 5668 // X inside A. 5669 class B { class C { class X {}; }; }; 5670 5671DescendantT must be an AST base type. 5672 5673As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5674each result that matches instead of only on the first one. 5675 5676Note: Recursively combined ForEachDescendant can cause many matches: 5677 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5678 forEachDescendant(cxxRecordDecl()) 5679 ))) 5680will match 10 times (plus injected class name matches) on: 5681 class A { class B { class C { class D { class E {}; }; }; }; }; 5682 5683Usable as: Any Matcher 5684</pre></td></tr> 5685 5686 5687<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5688<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5689provided matcher. 5690 5691Example matches X, Y, Y::X, Z::Y, Z::Y::X 5692 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5693 class X {}; 5694 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5695 // inside Y. 5696 class Z { class Y { class X {}; }; }; // Does not match Z. 5697 5698ChildT must be an AST base type. 5699 5700As opposed to 'has', 'forEach' will cause a match for each result that 5701matches instead of only on the first one. 5702 5703Usable as: Any Matcher 5704</pre></td></tr> 5705 5706 5707<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5708<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5709matcher. 5710 5711Given 5712void f() { if (true) { int x = 42; } } 5713void g() { for (;;) { int x = 43; } } 5714expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5715 5716Usable as: Any Matcher 5717</pre></td></tr> 5718 5719 5720<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5721<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5722provided matcher. 5723 5724Example matches X, Y, Z 5725 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5726 class X {}; // Matches X, because X::X is a class of name X inside X. 5727 class Y { class X {}; }; 5728 class Z { class Y { class X {}; }; }; 5729 5730DescendantT must be an AST base type. 5731 5732Usable as: Any Matcher 5733</pre></td></tr> 5734 5735 5736<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5737<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5738provided matcher. 5739 5740Example matches X, Y 5741 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5742 class X {}; // Matches X, because X::X is a class of name X inside X. 5743 class Y { class X {}; }; 5744 class Z { class Y { class X {}; }; }; // Does not match Z. 5745 5746ChildT must be an AST base type. 5747 5748Usable as: Any Matcher 5749Note that has is direct matcher, so it also matches things like implicit 5750casts and paren casts. If you are matching with expr then you should 5751probably consider using ignoringParenImpCasts like: 5752has(ignoringParenImpCasts(expr())). 5753</pre></td></tr> 5754 5755 5756<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5757<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5758matcher. 5759 5760Given 5761void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5762compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5763 5764Usable as: Any Matcher 5765</pre></td></tr> 5766 5767 5768<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5769<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 5770 5771Because CallExpr and CXXConstructExpr do not share a common 5772base class with API accessing arguments etc, AST Matchers for code 5773which should match both are typically duplicated. This matcher 5774removes the need for duplication. 5775 5776Given code 5777struct ConstructorTakesInt 5778{ 5779 ConstructorTakesInt(int i) {} 5780}; 5781 5782void callTakesInt(int i) 5783{ 5784} 5785 5786void doCall() 5787{ 5788 callTakesInt(42); 5789} 5790 5791void doConstruct() 5792{ 5793 ConstructorTakesInt cti(42); 5794} 5795 5796The matcher 5797invocation(hasArgument(0, integerLiteral(equals(42)))) 5798matches the expression in both doCall and doConstruct 5799</pre></td></tr> 5800 5801 5802<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5803<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5804 5805However, optionally will retain any bindings generated by the submatcher. 5806Useful when additional information which may or may not present about a main 5807matching node is desired. 5808 5809For example, in: 5810 class Foo { 5811 int bar; 5812 } 5813The matcher: 5814 cxxRecordDecl( 5815 optionally(has( 5816 fieldDecl(hasName("bar")).bind("var") 5817 ))).bind("record") 5818will produce a result binding for both "record" and "var". 5819The matcher will produce a "record" binding for even if there is no data 5820member named "bar" in that class. 5821 5822Usable as: Any Matcher 5823</pre></td></tr> 5824 5825 5826<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5827<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5828 5829Given 5830 void foo() 5831 { 5832 int i = 3.0; 5833 } 5834The matcher 5835 traverse(TK_IgnoreUnlessSpelledInSource, 5836 varDecl(hasInitializer(floatLiteral().bind("init"))) 5837 ) 5838matches the variable declaration with "init" bound to the "3.0". 5839</pre></td></tr> 5840 5841 5842<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> 5843<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5844switch statement or conditional operator. 5845 5846Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5847 if (true) {} 5848</pre></td></tr> 5849 5850 5851<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> 5852<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5853(binary or ternary). 5854 5855Example matches b 5856 condition ? a : b 5857 condition ?: b 5858</pre></td></tr> 5859 5860 5861<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> 5862<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5863 5864Example 1 (conditional ternary operator): matches a 5865 condition ? a : b 5866 5867Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5868 condition ?: b 5869</pre></td></tr> 5870 5871 5872<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> 5873<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5874matches the given matcher. 5875 5876The associated declaration is: 5877- for type nodes, the declaration of the underlying type 5878- for CallExpr, the declaration of the callee 5879- for MemberExpr, the declaration of the referenced member 5880- for CXXConstructExpr, the declaration of the constructor 5881- for CXXNewExpr, the declaration of the operator new 5882- for ObjCIvarExpr, the declaration of the ivar 5883 5884For type nodes, hasDeclaration will generally match the declaration of the 5885sugared type. Given 5886 class X {}; 5887 typedef X Y; 5888 Y y; 5889in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5890typedefDecl. A common use case is to match the underlying, desugared type. 5891This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5892 varDecl(hasType(hasUnqualifiedDesugaredType( 5893 recordType(hasDeclaration(decl()))))) 5894In this matcher, the decl will match the CXXRecordDecl of class X. 5895 5896Usable 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>>, 5897 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>>, 5898 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>>, 5899 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>>, 5900 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>>, 5901 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>>, 5902 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5903</pre></td></tr> 5904 5905 5906<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> 5907<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5908 5909Given 5910 int i[5]; 5911 void f() { i[1] = 42; } 5912arraySubscriptExpression(hasBase(implicitCastExpr( 5913 hasSourceExpression(declRefExpr())))) 5914 matches i[1] with the declRefExpr() matching i 5915</pre></td></tr> 5916 5917 5918<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> 5919<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5920 5921Given 5922 int i[5]; 5923 void f() { i[1] = 42; } 5924arraySubscriptExpression(hasIndex(integerLiteral())) 5925 matches i[1] with the integerLiteral() matching 1 5926</pre></td></tr> 5927 5928 5929<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5930<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 5931 5932Example matches a (matcher = binaryOperator(hasLHS())) 5933 a || b 5934</pre></td></tr> 5935 5936 5937<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5938<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 5939 5940Example matches b (matcher = binaryOperator(hasRHS())) 5941 a || b 5942</pre></td></tr> 5943 5944 5945<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> 5946<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5947type. 5948 5949Given 5950 struct A {}; 5951 A a[7]; 5952 int b[7]; 5953arrayType(hasElementType(builtinType())) 5954 matches "int b[7]" 5955 5956Usable 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>> 5957</pre></td></tr> 5958 5959 5960<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> 5961<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5962 5963Given 5964 _Atomic(int) i; 5965 _Atomic(float) f; 5966atomicType(hasValueType(isInteger())) 5967 matches "_Atomic(int) i" 5968 5969Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5970</pre></td></tr> 5971 5972 5973<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> 5974<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5975 5976Note: There is no TypeLoc for the deduced type and thus no 5977getDeducedLoc() matcher. 5978 5979Given 5980 auto a = 1; 5981 auto b = 2.0; 5982autoType(hasDeducedType(isInteger())) 5983 matches "auto a" 5984 5985Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5986</pre></td></tr> 5987 5988 5989<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> 5990<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5991binary operator matches. 5992</pre></td></tr> 5993 5994 5995<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> 5996<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5997 5998Example matches a (matcher = binaryOperator(hasLHS())) 5999 a || b 6000</pre></td></tr> 6001 6002 6003<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> 6004<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6005 6006Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6007 integerLiteral(equals(2))) 6008 1 + 2 // Match 6009 2 + 1 // Match 6010 1 + 1 // No match 6011 2 + 2 // No match 6012</pre></td></tr> 6013 6014 6015<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> 6016<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6017 6018Example matches b (matcher = binaryOperator(hasRHS())) 6019 a || b 6020</pre></td></tr> 6021 6022 6023<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>></td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 6024<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6025 6026For example, in: 6027void foo() 6028{ 6029 int arr[3]; 6030 auto &[f, s, t] = arr; 6031 6032 f = 42; 6033} 6034The matcher: 6035 bindingDecl(hasName("f"), 6036 forDecomposition(decompositionDecl()) 6037matches 'f' in 'auto &[f, s, t]'. 6038</pre></td></tr> 6039 6040 6041<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> 6042<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6043block. 6044 6045Does not match the 'this' parameter of a method. 6046 6047Given 6048 class X { void f(int x, int y, int z) {} }; 6049cxxMethodDecl(hasAnyParameter(hasName("y"))) 6050 matches f(int x, int y, int z) {} 6051with hasAnyParameter(...) 6052 matching int y 6053 6054For ObjectiveC, given 6055 @interface I - (void) f:(int) y; @end 6056 6057the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6058matches the declaration of method f with hasParameter 6059matching y. 6060 6061For blocks, given 6062 b = ^(int y) { printf("%d", y) }; 6063 6064the matcher blockDecl(hasAnyParameter(hasName("y"))) 6065matches the declaration of the block b with hasParameter 6066matching y. 6067</pre></td></tr> 6068 6069 6070<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> 6071<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6072declaration or a block. 6073 6074Given 6075 class X { void f(int x) {} }; 6076cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6077 matches f(int x) {} 6078with hasParameter(...) 6079 matching int x 6080 6081For ObjectiveC, given 6082 @interface I - (void) f:(int) y; @end 6083 6084the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6085matches the declaration of method f with hasParameter 6086matching y. 6087</pre></td></tr> 6088 6089 6090<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> 6091<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6092pointee matches a given matcher. 6093 6094Given 6095 int *a; 6096 int const *b; 6097 float const *f; 6098pointerType(pointee(isConstQualified(), isInteger())) 6099 matches "int const *b" 6100 6101Usable 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>>, 6102 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>> 6103</pre></td></tr> 6104 6105 6106<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> 6107<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 6108declaration's type. 6109 6110In case of a value declaration (for example a variable declaration), 6111this resolves one layer of indirection. For example, in the value 6112declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6113X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6114declaration of x. 6115 6116Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6117 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6118 and friend class X (matcher = friendDecl(hasType("X")) 6119 class X {}; 6120 void y(X &x) { x; X z; } 6121 class Y { friend class X; }; 6122 6123Example matches class Derived 6124(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6125class Base {}; 6126class Derived : Base {}; 6127 6128Usable 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>>, 6129Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6130</pre></td></tr> 6131 6132 6133<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> 6134<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6135 6136Given 6137 void f(int i); 6138 int y; 6139 f(y); 6140callExpr( 6141 forEachArgumentWithParam( 6142 declRefExpr(to(varDecl(hasName("y")))), 6143 parmVarDecl(hasType(isInteger())) 6144)) 6145 matches f(y); 6146with declRefExpr(...) 6147 matching int y 6148and parmVarDecl(...) 6149 matching int i 6150</pre></td></tr> 6151 6152 6153<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> 6154<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6155CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6156it works on calls through function pointers as well. 6157 6158The difference is, that function pointers do not provide access to a 6159ParmVarDecl, but only the QualType for each argument. 6160 6161Given 6162 void f(int i); 6163 int y; 6164 f(y); 6165 void (*f_ptr)(int) = f; 6166 f_ptr(y); 6167callExpr( 6168 forEachArgumentWithParamType( 6169 declRefExpr(to(varDecl(hasName("y")))), 6170 qualType(isInteger()).bind("type) 6171)) 6172 matches f(y) and f_ptr(y) 6173with declRefExpr(...) 6174 matching int y 6175and qualType(...) 6176 matching int 6177</pre></td></tr> 6178 6179 6180<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> 6181<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6182expression, or an ObjC-message-send expression. 6183 6184Given 6185 void x(int, int, int) { int y; x(1, y, 42); } 6186callExpr(hasAnyArgument(declRefExpr())) 6187 matches x(1, y, 42) 6188with hasAnyArgument(...) 6189 matching y 6190 6191For ObjectiveC, given 6192 @interface I - (void) f:(int) y; @end 6193 void foo(I *i) { [i f:12]; } 6194objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6195 matches [i f:12] 6196</pre></td></tr> 6197 6198 6199<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> 6200<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6201call expression. 6202 6203Example matches y in x(y) 6204 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6205 void x(int) { int y; x(y); } 6206</pre></td></tr> 6207 6208 6209<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> 6210<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6211matches the given matcher. 6212 6213The associated declaration is: 6214- for type nodes, the declaration of the underlying type 6215- for CallExpr, the declaration of the callee 6216- for MemberExpr, the declaration of the referenced member 6217- for CXXConstructExpr, the declaration of the constructor 6218- for CXXNewExpr, the declaration of the operator new 6219- for ObjCIvarExpr, the declaration of the ivar 6220 6221For type nodes, hasDeclaration will generally match the declaration of the 6222sugared type. Given 6223 class X {}; 6224 typedef X Y; 6225 Y y; 6226in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6227typedefDecl. A common use case is to match the underlying, desugared type. 6228This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6229 varDecl(hasType(hasUnqualifiedDesugaredType( 6230 recordType(hasDeclaration(decl()))))) 6231In this matcher, the decl will match the CXXRecordDecl of class X. 6232 6233Usable 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>>, 6234 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>>, 6235 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>>, 6236 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>>, 6237 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>>, 6238 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>>, 6239 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6240</pre></td></tr> 6241 6242 6243<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> 6244<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6245 6246Given 6247 class A { A() : i(42), j(42) {} int i; int j; }; 6248cxxConstructorDecl(forEachConstructorInitializer( 6249 forField(decl().bind("x")) 6250)) 6251 will trigger two matches, binding for 'i' and 'j' respectively. 6252</pre></td></tr> 6253 6254 6255<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> 6256<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6257 6258Given 6259 struct Foo { 6260 Foo() : foo_(1) { } 6261 int foo_; 6262 }; 6263cxxRecordDecl(has(cxxConstructorDecl( 6264 hasAnyConstructorInitializer(anything()) 6265))) 6266 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6267</pre></td></tr> 6268 6269 6270<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> 6271<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6272 6273Given 6274 struct Foo { 6275 Foo() : foo_(1) { } 6276 int foo_; 6277 }; 6278cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6279 forField(hasName("foo_")))))) 6280 matches Foo 6281with forField matching foo_ 6282</pre></td></tr> 6283 6284 6285<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> 6286<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6287 6288Given 6289 struct Foo { 6290 Foo() : foo_(1) { } 6291 int foo_; 6292 }; 6293cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6294 withInitializer(integerLiteral(equals(1))))))) 6295 matches Foo 6296with withInitializer matching (1) 6297</pre></td></tr> 6298 6299 6300<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> 6301<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6302given matcher. Implicit object expressions are included; that is, it matches 6303use of implicit `this`. 6304 6305Given 6306 struct X { 6307 int m; 6308 int f(X x) { x.m; return m; } 6309 }; 6310memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6311 matches `x.m`, but not `m`; however, 6312memberExpr(hasObjectExpression(hasType(pointsTo( 6313 cxxRecordDecl(hasName("X")))))) 6314 matches `m` (aka. `this->m`), but not `x.m`. 6315</pre></td></tr> 6316 6317 6318<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> 6319<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6320 6321 6322<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> 6323<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6324 6325Given: 6326 void foo() { 6327 if (int i = foobar(); i > 0) {} 6328 switch (int i = foobar(); i) {} 6329 for (auto& a = get_range(); auto& x : a) {} 6330 } 6331 void bar() { 6332 if (foobar() > 0) {} 6333 switch (foobar()) {} 6334 for (auto& x : get_range()) {} 6335 } 6336ifStmt(hasInitStatement(anything())) 6337 matches the if statement in foo but not in bar. 6338switchStmt(hasInitStatement(anything())) 6339 matches the switch statement in foo but not in bar. 6340cxxForRangeStmt(hasInitStatement(anything())) 6341 matches the range for statement in foo but not in bar. 6342</pre></td></tr> 6343 6344 6345<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> 6346<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6347 6348Example: 6349 forStmt(hasLoopVariable(anything())) 6350matches 'int x' in 6351 for (int x : a) { } 6352</pre></td></tr> 6353 6354 6355<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> 6356<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6357 6358Example: 6359 forStmt(hasRangeInit(anything())) 6360matches 'a' in 6361 for (int x : a) { } 6362</pre></td></tr> 6363 6364 6365<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> 6366<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6367`on`, matches the argument directly without stripping away anything. 6368 6369Given 6370 class Y { public: void m(); }; 6371 Y g(); 6372 class X : public Y { void g(); }; 6373 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6374cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6375 cxxRecordDecl(hasName("Y"))))) 6376 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6377cxxMemberCallExpr(on(callExpr())) 6378 does not match `(g()).m()`, because the parens are not ignored. 6379 6380FIXME: Overload to allow directly matching types? 6381</pre></td></tr> 6382 6383 6384<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> 6385<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6386stripping off any parentheses or implicit casts. 6387 6388Given 6389 class Y { public: void m(); }; 6390 Y g(); 6391 class X : public Y {}; 6392 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6393cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6394 matches `y.m()` and `(g()).m()`. 6395cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6396 matches `x.m()`. 6397cxxMemberCallExpr(on(callExpr())) 6398 matches `(g()).m()`. 6399 6400FIXME: Overload to allow directly matching types? 6401</pre></td></tr> 6402 6403 6404<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> 6405<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6406</pre></td></tr> 6407 6408 6409<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> 6410<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6411matches the InnerMatcher, or is a pointer to a type that matches the 6412InnerMatcher. 6413 6414Given 6415 class Y { public: void m(); }; 6416 class X : public Y { void g(); }; 6417 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6418cxxMemberCallExpr(thisPointerType(hasDeclaration( 6419 cxxRecordDecl(hasName("Y"))))) 6420 matches `y.m()`, `p->m()` and `x.m()`. 6421cxxMemberCallExpr(thisPointerType(hasDeclaration( 6422 cxxRecordDecl(hasName("X"))))) 6423 matches `x.g()`. 6424</pre></td></tr> 6425 6426 6427<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> 6428<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6429produce multiple matches. 6430 6431Given 6432 class A { virtual void f(); }; 6433 class B : public A { void f(); }; 6434 class C : public B { void f(); }; 6435cxxMethodDecl(ofClass(hasName("C")), 6436 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6437 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6438 that B::f is not overridden by C::f). 6439 6440The check can produce multiple matches in case of multiple inheritance, e.g. 6441 class A1 { virtual void f(); }; 6442 class A2 { virtual void f(); }; 6443 class C : public A1, public A2 { void f(); }; 6444cxxMethodDecl(ofClass(hasName("C")), 6445 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6446 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6447 once with "b" binding "A2::f" and "d" binding "C::f". 6448</pre></td></tr> 6449 6450 6451<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> 6452<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6453belongs to. 6454 6455FIXME: Generalize this for other kinds of declarations. 6456FIXME: What other kind of declarations would we need to generalize 6457this to? 6458 6459Example matches A() in the last line 6460 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6461 ofClass(hasName("A")))))) 6462 class A { 6463 public: 6464 A(); 6465 }; 6466 A a = A(); 6467</pre></td></tr> 6468 6469 6470<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> 6471<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6472 6473Given: 6474 MyClass *p1 = new (Storage) MyClass(); 6475cxxNewExpr(hasAnyPlacementArg(anything())) 6476 matches the expression 'new (Storage, 16) MyClass()'. 6477</pre></td></tr> 6478 6479 6480<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> 6481<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6482 6483Given: 6484 MyClass *p1 = new MyClass[10]; 6485cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6486 matches the expression 'new MyClass[10]'. 6487</pre></td></tr> 6488 6489 6490<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> 6491<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6492matches the given matcher. 6493 6494The associated declaration is: 6495- for type nodes, the declaration of the underlying type 6496- for CallExpr, the declaration of the callee 6497- for MemberExpr, the declaration of the referenced member 6498- for CXXConstructExpr, the declaration of the constructor 6499- for CXXNewExpr, the declaration of the operator new 6500- for ObjCIvarExpr, the declaration of the ivar 6501 6502For type nodes, hasDeclaration will generally match the declaration of the 6503sugared type. Given 6504 class X {}; 6505 typedef X Y; 6506 Y y; 6507in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6508typedefDecl. A common use case is to match the underlying, desugared type. 6509This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6510 varDecl(hasType(hasUnqualifiedDesugaredType( 6511 recordType(hasDeclaration(decl()))))) 6512In this matcher, the decl will match the CXXRecordDecl of class X. 6513 6514Usable 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>>, 6515 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>>, 6516 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>>, 6517 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>>, 6518 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>>, 6519 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>>, 6520 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6521</pre></td></tr> 6522 6523 6524<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> 6525<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6526 6527Given: 6528 MyClass *p1 = new (Storage, 16) MyClass(); 6529cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6530 matches the expression 'new (Storage, 16) MyClass()'. 6531</pre></td></tr> 6532 6533 6534<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6535<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6536binary operator matches. 6537</pre></td></tr> 6538 6539 6540<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</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> 6541<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6542 6543Example matches a (matcher = binaryOperator(hasLHS())) 6544 a || b 6545</pre></td></tr> 6546 6547 6548<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperands1')"><a name="hasOperands1Anchor">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> 6549<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6550 6551Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6552 integerLiteral(equals(2))) 6553 1 + 2 // Match 6554 2 + 1 // Match 6555 1 + 1 // No match 6556 2 + 2 // No match 6557</pre></td></tr> 6558 6559 6560<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</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> 6561<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6562 6563Example matches b (matcher = binaryOperator(hasRHS())) 6564 a || b 6565</pre></td></tr> 6566 6567 6568<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasUnaryOperand1')"><a name="hasUnaryOperand1Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6569<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6570 6571Example matches true (matcher = hasUnaryOperand( 6572 cxxBoolLiteral(equals(true)))) 6573 !true 6574</pre></td></tr> 6575 6576 6577<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> 6578<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6579 6580Example: 6581matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6582 class Foo; 6583 class Bar : Foo {}; 6584 class Baz : Bar {}; 6585 class SpecialBase; 6586 class Proxy : SpecialBase {}; // matches Proxy 6587 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6588 6589FIXME: Refactor this and isDerivedFrom to reuse implementation. 6590</pre></td></tr> 6591 6592 6593<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> 6594<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6595 6596Example: 6597matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6598 class Foo; 6599 class Bar : Foo {}; 6600 class Baz : Bar {}; 6601 class SpecialBase; 6602 class Proxy : SpecialBase {}; // matches Proxy 6603 class IndirectlyDerived : Proxy {}; // doesn't match 6604</pre></td></tr> 6605 6606 6607<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> 6608<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6609 6610Given: 6611 class A { void func(); }; 6612 class B { void member(); }; 6613 6614cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6615A but not B. 6616</pre></td></tr> 6617 6618 6619<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> 6620<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6621matching Base, or Objective-C classes that directly or indirectly 6622subclass a class matching Base. 6623 6624Note that a class is not considered to be derived from itself. 6625 6626Example matches Y, Z, C (Base == hasName("X")) 6627 class X; 6628 class Y : public X {}; // directly derived 6629 class Z : public Y {}; // indirectly derived 6630 typedef X A; 6631 typedef A B; 6632 class C : public B {}; // derived from a typedef of X 6633 6634In the following example, Bar matches isDerivedFrom(hasName("X")): 6635 class Foo; 6636 typedef Foo X; 6637 class Bar : public Foo {}; // derived from a type that X is a typedef of 6638 6639In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6640 @interface NSObject @end 6641 @interface Bar : NSObject @end 6642 6643Usable 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>> 6644</pre></td></tr> 6645 6646 6647<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> 6648<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6649matching Base. 6650 6651Note that a class is not considered to be derived from itself. 6652 6653Example matches Y, C (Base == hasName("X")) 6654 class X; 6655 class Y : public X {}; // directly derived 6656 class Z : public Y {}; // indirectly derived 6657 typedef X A; 6658 typedef A B; 6659 class C : public B {}; // derived from a typedef of X 6660 6661In the following example, Bar matches isDerivedFrom(hasName("X")): 6662 class Foo; 6663 typedef Foo X; 6664 class Bar : public Foo {}; // derived from a type that X is a typedef of 6665</pre></td></tr> 6666 6667 6668<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> 6669<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6670match Base. 6671</pre></td></tr> 6672 6673 6674<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand2')"><a name="hasEitherOperand2Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6675<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 6676binary operator matches. 6677</pre></td></tr> 6678 6679 6680<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS2')"><a name="hasLHS2Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6681<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 6682 6683Example matches a (matcher = binaryOperator(hasLHS())) 6684 a || b 6685</pre></td></tr> 6686 6687 6688<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands2')"><a name="hasOperands2Anchor">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> 6689<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 6690 6691Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6692 integerLiteral(equals(2))) 6693 1 + 2 // Match 6694 2 + 1 // Match 6695 1 + 1 // No match 6696 2 + 2 // No match 6697</pre></td></tr> 6698 6699 6700<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS2')"><a name="hasRHS2Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6701<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 6702 6703Example matches b (matcher = binaryOperator(hasRHS())) 6704 a || b 6705</pre></td></tr> 6706 6707 6708<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> 6709<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6710expression, or an ObjC-message-send expression. 6711 6712Given 6713 void x(int, int, int) { int y; x(1, y, 42); } 6714callExpr(hasAnyArgument(declRefExpr())) 6715 matches x(1, y, 42) 6716with hasAnyArgument(...) 6717 matching y 6718 6719For ObjectiveC, given 6720 @interface I - (void) f:(int) y; @end 6721 void foo(I *i) { [i f:12]; } 6722objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6723 matches [i f:12] 6724</pre></td></tr> 6725 6726 6727<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> 6728<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6729call expression. 6730 6731Example matches y in x(y) 6732 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6733 void x(int) { int y; x(y); } 6734</pre></td></tr> 6735 6736 6737<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> 6738<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 6739given matcher. 6740 6741Example matches y.x() (matcher = callExpr(callee( 6742 cxxMethodDecl(hasName("x"))))) 6743 class Y { public: void x(); }; 6744 void z() { Y y; y.x(); } 6745</pre></td></tr> 6746 6747 6748<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> 6749<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 6750 6751Given 6752 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 6753 void f() { f(); } 6754callExpr(callee(expr())) 6755 matches this->x(), x(), y.x(), f() 6756with callee(...) 6757 matching this->x, x, y.x, f respectively 6758 6759Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 6760because this introduces ambiguous overloads with calls to Callee taking a 6761internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 6762implemented in terms of implicit casts. 6763</pre></td></tr> 6764 6765 6766<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> 6767<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 6768 6769Given 6770 void f(int i); 6771 int y; 6772 f(y); 6773callExpr( 6774 forEachArgumentWithParam( 6775 declRefExpr(to(varDecl(hasName("y")))), 6776 parmVarDecl(hasType(isInteger())) 6777)) 6778 matches f(y); 6779with declRefExpr(...) 6780 matching int y 6781and parmVarDecl(...) 6782 matching int i 6783</pre></td></tr> 6784 6785 6786<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> 6787<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 6788CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6789it works on calls through function pointers as well. 6790 6791The difference is, that function pointers do not provide access to a 6792ParmVarDecl, but only the QualType for each argument. 6793 6794Given 6795 void f(int i); 6796 int y; 6797 f(y); 6798 void (*f_ptr)(int) = f; 6799 f_ptr(y); 6800callExpr( 6801 forEachArgumentWithParamType( 6802 declRefExpr(to(varDecl(hasName("y")))), 6803 qualType(isInteger()).bind("type) 6804)) 6805 matches f(y) and f_ptr(y) 6806with declRefExpr(...) 6807 matching int y 6808and qualType(...) 6809 matching int 6810</pre></td></tr> 6811 6812 6813<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> 6814<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 6815expression, or an ObjC-message-send expression. 6816 6817Given 6818 void x(int, int, int) { int y; x(1, y, 42); } 6819callExpr(hasAnyArgument(declRefExpr())) 6820 matches x(1, y, 42) 6821with hasAnyArgument(...) 6822 matching y 6823 6824For ObjectiveC, given 6825 @interface I - (void) f:(int) y; @end 6826 void foo(I *i) { [i f:12]; } 6827objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6828 matches [i f:12] 6829</pre></td></tr> 6830 6831 6832<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> 6833<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 6834call expression. 6835 6836Example matches y in x(y) 6837 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6838 void x(int) { int y; x(y); } 6839</pre></td></tr> 6840 6841 6842<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> 6843<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 6844matches the given matcher. 6845 6846The associated declaration is: 6847- for type nodes, the declaration of the underlying type 6848- for CallExpr, the declaration of the callee 6849- for MemberExpr, the declaration of the referenced member 6850- for CXXConstructExpr, the declaration of the constructor 6851- for CXXNewExpr, the declaration of the operator new 6852- for ObjCIvarExpr, the declaration of the ivar 6853 6854For type nodes, hasDeclaration will generally match the declaration of the 6855sugared type. Given 6856 class X {}; 6857 typedef X Y; 6858 Y y; 6859in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6860typedefDecl. A common use case is to match the underlying, desugared type. 6861This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6862 varDecl(hasType(hasUnqualifiedDesugaredType( 6863 recordType(hasDeclaration(decl()))))) 6864In this matcher, the decl will match the CXXRecordDecl of class X. 6865 6866Usable 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>>, 6867 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>>, 6868 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>>, 6869 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>>, 6870 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>>, 6871 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>>, 6872 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6873</pre></td></tr> 6874 6875 6876<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> 6877<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 6878extension, matches the constant given in the statement. 6879 6880Given 6881 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 6882caseStmt(hasCaseConstant(integerLiteral())) 6883 matches "case 1:" 6884</pre></td></tr> 6885 6886 6887<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> 6888<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 6889or opaque value's source expression matches the given matcher. 6890 6891Example 1: matches "a string" 6892(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6893class URL { URL(string); }; 6894URL url = "a string"; 6895 6896Example 2: matches 'b' (matcher = 6897opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6898int a = b ?: 1; 6899</pre></td></tr> 6900 6901 6902<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> 6903<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6904functionDecl that have at least one TemplateArgument matching the given 6905InnerMatcher. 6906 6907Given 6908 template<typename T> class A {}; 6909 template<> class A<double> {}; 6910 A<int> a; 6911 6912 template<typename T> f() {}; 6913 void func() { f<int>(); }; 6914 6915classTemplateSpecializationDecl(hasAnyTemplateArgument( 6916 refersToType(asString("int")))) 6917 matches the specialization A<int> 6918 6919functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6920 matches the specialization f<int> 6921</pre></td></tr> 6922 6923 6924<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> 6925<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6926 6927Given 6928 template<typename T> class A {}; #1 6929 template<> class A<int> {}; #2 6930classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 6931 matches '#2' with classTemplateDecl() matching the class template 6932 declaration of 'A' at #1. 6933</pre></td></tr> 6934 6935 6936<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> 6937<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6938functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6939 6940Given 6941 template<typename T, typename U> class A {}; 6942 A<bool, int> b; 6943 A<int, bool> c; 6944 6945 template<typename T> void f() {} 6946 void func() { f<int>(); }; 6947classTemplateSpecializationDecl(hasTemplateArgument( 6948 1, refersToType(asString("int")))) 6949 matches the specialization A<bool, int> 6950 6951functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6952 matches the specialization f<int> 6953</pre></td></tr> 6954 6955 6956<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> 6957<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 6958type. 6959 6960Given 6961 struct A {}; 6962 A a[7]; 6963 int b[7]; 6964arrayType(hasElementType(builtinType())) 6965 matches "int b[7]" 6966 6967Usable 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>> 6968</pre></td></tr> 6969 6970 6971<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> 6972<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 6973a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6974 6975Given 6976 { {}; 1+2; } 6977hasAnySubstatement(compoundStmt()) 6978 matches '{ {}; 1+2; }' 6979with compoundStmt() 6980 matching '{}' 6981</pre></td></tr> 6982 6983 6984<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> 6985<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 6986</pre></td></tr> 6987 6988 6989<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> 6990<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6991matches the given matcher. 6992 6993The associated declaration is: 6994- for type nodes, the declaration of the underlying type 6995- for CallExpr, the declaration of the callee 6996- for MemberExpr, the declaration of the referenced member 6997- for CXXConstructExpr, the declaration of the constructor 6998- for CXXNewExpr, the declaration of the operator new 6999- for ObjCIvarExpr, the declaration of the ivar 7000 7001For type nodes, hasDeclaration will generally match the declaration of the 7002sugared type. Given 7003 class X {}; 7004 typedef X Y; 7005 Y y; 7006in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7007typedefDecl. A common use case is to match the underlying, desugared type. 7008This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7009 varDecl(hasType(hasUnqualifiedDesugaredType( 7010 recordType(hasDeclaration(decl()))))) 7011In this matcher, the decl will match the CXXRecordDecl of class X. 7012 7013Usable 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>>, 7014 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>>, 7015 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>>, 7016 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>>, 7017 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>>, 7018 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>>, 7019 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7020</pre></td></tr> 7021 7022 7023<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> 7024<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 7025specific using shadow declaration. 7026 7027Given 7028 namespace a { void f() {} } 7029 using a::f; 7030 void g() { 7031 f(); // Matches this .. 7032 a::f(); // .. but not this. 7033 } 7034declRefExpr(throughUsingDecl(anything())) 7035 matches f() 7036</pre></td></tr> 7037 7038 7039<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> 7040<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7041specified matcher. 7042 7043Example matches x in if(x) 7044 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7045 bool x; 7046 if (x) {} 7047</pre></td></tr> 7048 7049 7050<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> 7051<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7052 7053Note that this does not work for global declarations because the AST 7054breaks up multiple-declaration DeclStmt's into multiple single-declaration 7055DeclStmt's. 7056Example: Given non-global declarations 7057 int a, b = 0; 7058 int c; 7059 int d = 2, e; 7060declStmt(containsDeclaration( 7061 0, varDecl(hasInitializer(anything())))) 7062 matches only 'int d = 2, e;', and 7063declStmt(containsDeclaration(1, varDecl())) 7064 matches 'int a, b = 0' as well as 'int d = 2, e;' 7065 but 'int c;' is not matched. 7066</pre></td></tr> 7067 7068 7069<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> 7070<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7071 7072Given 7073 int a, b; 7074 int c; 7075declStmt(hasSingleDecl(anything())) 7076 matches 'int c;' but not 'int a, b;'. 7077</pre></td></tr> 7078 7079 7080<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> 7081<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 7082the inner matcher. 7083 7084Given 7085 int x; 7086declaratorDecl(hasTypeLoc(loc(asString("int")))) 7087 matches int x 7088</pre></td></tr> 7089 7090 7091<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> 7092<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7093Decl, matches InnerMatcher. 7094 7095Given 7096 namespace N { 7097 namespace M { 7098 class D {}; 7099 } 7100 } 7101 7102cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7103declaration of class D. 7104</pre></td></tr> 7105 7106 7107<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> 7108<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7109 7110Given 7111 decltype(1) a = 1; 7112 decltype(2.0) b = 2.0; 7113decltypeType(hasUnderlyingType(isInteger())) 7114 matches the type of "a" 7115 7116Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7117</pre></td></tr> 7118 7119 7120<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasAnyBinding0')"><a name="hasAnyBinding0Anchor">hasAnyBinding</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr> 7121<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7122 7123For example, in: 7124void foo() 7125{ 7126 int arr[3]; 7127 auto &[f, s, t] = arr; 7128 7129 f = 42; 7130} 7131The matcher: 7132 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7133matches the decomposition decl with 'f' bound to "fBinding". 7134</pre></td></tr> 7135 7136 7137<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasBinding0')"><a name="hasBinding0Anchor">hasBinding</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr> 7138<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7139 7140For example, in: 7141void foo() 7142{ 7143 int arr[3]; 7144 auto &[f, s, t] = arr; 7145 7146 f = 42; 7147} 7148The matcher: 7149 decompositionDecl(hasBinding(0, bindingDecl(hasName("f").bind("fBinding")))) 7150matches the decomposition decl with 'f' bound to "fBinding". 7151</pre></td></tr> 7152 7153 7154<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> 7155<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7156 7157 7158<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> 7159<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7160switch statement or conditional operator. 7161 7162Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7163 if (true) {} 7164</pre></td></tr> 7165 7166 7167<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> 7168<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7169matches InnerMatcher if the qualifier exists. 7170 7171Given 7172 namespace N { 7173 namespace M { 7174 class D {}; 7175 } 7176 } 7177 N::M::D d; 7178 7179elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7180matches the type of the variable declaration of d. 7181</pre></td></tr> 7182 7183 7184<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> 7185<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7186 7187Given 7188 namespace N { 7189 namespace M { 7190 class D {}; 7191 } 7192 } 7193 N::M::D d; 7194 7195elaboratedType(namesType(recordType( 7196hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7197declaration of d. 7198</pre></td></tr> 7199 7200 7201<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> 7202<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7203matches the given matcher. 7204 7205The associated declaration is: 7206- for type nodes, the declaration of the underlying type 7207- for CallExpr, the declaration of the callee 7208- for MemberExpr, the declaration of the referenced member 7209- for CXXConstructExpr, the declaration of the constructor 7210- for CXXNewExpr, the declaration of the operator new 7211- for ObjCIvarExpr, the declaration of the ivar 7212 7213For type nodes, hasDeclaration will generally match the declaration of the 7214sugared type. Given 7215 class X {}; 7216 typedef X Y; 7217 Y y; 7218in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7219typedefDecl. A common use case is to match the underlying, desugared type. 7220This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7221 varDecl(hasType(hasUnqualifiedDesugaredType( 7222 recordType(hasDeclaration(decl()))))) 7223In this matcher, the decl will match the CXXRecordDecl of class X. 7224 7225Usable 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>>, 7226 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>>, 7227 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>>, 7228 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>>, 7229 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>>, 7230 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>>, 7231 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7232</pre></td></tr> 7233 7234 7235<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> 7236<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7237 7238(Note: Clang's AST refers to other conversions as "casts" too, and calls 7239actual casts "explicit" casts.) 7240</pre></td></tr> 7241 7242 7243<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> 7244<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 7245declaration's type. 7246 7247In case of a value declaration (for example a variable declaration), 7248this resolves one layer of indirection. For example, in the value 7249declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7250X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7251declaration of x. 7252 7253Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7254 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7255 and friend class X (matcher = friendDecl(hasType("X")) 7256 class X {}; 7257 void y(X &x) { x; X z; } 7258 class Y { friend class X; }; 7259 7260Example matches class Derived 7261(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7262class Base {}; 7263class Derived : Base {}; 7264 7265Usable 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>>, 7266Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7267</pre></td></tr> 7268 7269 7270<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> 7271<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7272matcher. 7273 7274Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7275 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7276 and U (matcher = typedefDecl(hasType(asString("int"))) 7277 and friend class X (matcher = friendDecl(hasType("X")) 7278 class X {}; 7279 void y(X &x) { x; X z; } 7280 typedef int U; 7281 class Y { friend class X; }; 7282</pre></td></tr> 7283 7284 7285<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> 7286<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7287elidable constructor and other corresponding bookkeeping nodes. 7288 7289In C++17, elidable copy constructors are no longer being generated in the 7290AST as it is not permitted by the standard. They are, however, part of the 7291AST in C++14 and earlier. So, a matcher must abstract over these differences 7292to work in all language modes. This matcher skips elidable constructor-call 7293AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7294various implicit nodes inside the constructor calls, all of which will not 7295appear in the C++17 AST. 7296 7297Given 7298 7299struct H {}; 7300H G(); 7301void f() { 7302 H D = G(); 7303} 7304 7305``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7306matches ``H D = G()`` in C++11 through C++17 (and beyond). 7307</pre></td></tr> 7308 7309 7310<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> 7311<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7312are stripped off. 7313 7314Parentheses and explicit casts are not discarded. 7315Given 7316 int arr[5]; 7317 int a = 0; 7318 char b = 0; 7319 const int c = a; 7320 int *d = arr; 7321 long e = (long) 0l; 7322The matchers 7323 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7324 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7325would match the declarations for a, b, c, and d, but not e. 7326While 7327 varDecl(hasInitializer(integerLiteral())) 7328 varDecl(hasInitializer(declRefExpr())) 7329only match the declarations for b, c, and d. 7330</pre></td></tr> 7331 7332 7333<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> 7334<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7335nodes are stripped off. 7336 7337Parentheses and explicit casts are not discarded. 7338Given 7339 class C {}; 7340 C a = C(); 7341 C b; 7342 C c = b; 7343The matchers 7344 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7345would match the declarations for a, b, and c. 7346While 7347 varDecl(hasInitializer(cxxConstructExpr())) 7348only match the declarations for b and c. 7349</pre></td></tr> 7350 7351 7352<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> 7353<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7354casts are stripped off. 7355 7356Implicit and non-C Style casts are also discarded. 7357Given 7358 int a = 0; 7359 char b = (0); 7360 void* c = reinterpret_cast<char*>(0); 7361 char d = char(0); 7362The matcher 7363 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7364would match the declarations for a, b, c, and d. 7365while 7366 varDecl(hasInitializer(integerLiteral())) 7367only match the declaration for a. 7368</pre></td></tr> 7369 7370 7371<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> 7372<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7373parentheses are stripped off. 7374 7375Explicit casts are not discarded. 7376Given 7377 int arr[5]; 7378 int a = 0; 7379 char b = (0); 7380 const int c = a; 7381 int *d = (arr); 7382 long e = ((long) 0l); 7383The matchers 7384 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7385 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7386would match the declarations for a, b, c, and d, but not e. 7387while 7388 varDecl(hasInitializer(integerLiteral())) 7389 varDecl(hasInitializer(declRefExpr())) 7390would only match the declaration for a. 7391</pre></td></tr> 7392 7393 7394<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> 7395<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7396 7397Given 7398 const char* str = ("my-string"); 7399The matcher 7400 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7401would match the implicit cast resulting from the assignment. 7402</pre></td></tr> 7403 7404 7405<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> 7406<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7407 7408Given 7409 class C { 7410 int a = 2; 7411 int b = 3; 7412 int c; 7413 }; 7414fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7415 matches 'int a;' but not 'int b;'. 7416fieldDecl(hasInClassInitializer(anything())) 7417 matches 'int a;' and 'int b;' but not 'int c;'. 7418</pre></td></tr> 7419 7420 7421<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> 7422<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7423 7424 7425<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> 7426<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7427switch statement or conditional operator. 7428 7429Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7430 if (true) {} 7431</pre></td></tr> 7432 7433 7434<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> 7435<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7436 7437Example: 7438 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7439matches '++x' in 7440 for (x; x < N; ++x) { } 7441</pre></td></tr> 7442 7443 7444<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> 7445<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7446 7447Example: 7448 forStmt(hasLoopInit(declStmt())) 7449matches 'int x = 0' in 7450 for (int x = 0; x < N; ++x) { } 7451</pre></td></tr> 7452 7453 7454<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> 7455<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7456declaration's type. 7457 7458In case of a value declaration (for example a variable declaration), 7459this resolves one layer of indirection. For example, in the value 7460declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7461X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7462declaration of x. 7463 7464Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7465 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7466 and friend class X (matcher = friendDecl(hasType("X")) 7467 class X {}; 7468 void y(X &x) { x; X z; } 7469 class Y { friend class X; }; 7470 7471Example matches class Derived 7472(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7473class Base {}; 7474class Derived : Base {}; 7475 7476Usable 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>>, 7477Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7478</pre></td></tr> 7479 7480 7481<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> 7482<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7483matcher. 7484 7485Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7486 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7487 and U (matcher = typedefDecl(hasType(asString("int"))) 7488 and friend class X (matcher = friendDecl(hasType("X")) 7489 class X {}; 7490 void y(X &x) { x; X z; } 7491 typedef int U; 7492 class Y { friend class X; }; 7493</pre></td></tr> 7494 7495 7496<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> 7497<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7498Note that this matcher matches all the declarations of a function whose 7499body is present in the AST. 7500 7501Given 7502 void f(); 7503 void f() {} 7504 void g(); 7505hasAnyBody(functionDecl()) 7506 matches both 'void f();' 7507 and 'void f() {}' 7508with compoundStmt() 7509 matching '{}' 7510 but does not match 'void g();' 7511</pre></td></tr> 7512 7513 7514<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> 7515<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7516block. 7517 7518Does not match the 'this' parameter of a method. 7519 7520Given 7521 class X { void f(int x, int y, int z) {} }; 7522cxxMethodDecl(hasAnyParameter(hasName("y"))) 7523 matches f(int x, int y, int z) {} 7524with hasAnyParameter(...) 7525 matching int y 7526 7527For ObjectiveC, given 7528 @interface I - (void) f:(int) y; @end 7529 7530the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7531matches the declaration of method f with hasParameter 7532matching y. 7533 7534For blocks, given 7535 b = ^(int y) { printf("%d", y) }; 7536 7537the matcher blockDecl(hasAnyParameter(hasName("y"))) 7538matches the declaration of the block b with hasParameter 7539matching y. 7540</pre></td></tr> 7541 7542 7543<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> 7544<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7545functionDecl that have at least one TemplateArgument matching the given 7546InnerMatcher. 7547 7548Given 7549 template<typename T> class A {}; 7550 template<> class A<double> {}; 7551 A<int> a; 7552 7553 template<typename T> f() {}; 7554 void func() { f<int>(); }; 7555 7556classTemplateSpecializationDecl(hasAnyTemplateArgument( 7557 refersToType(asString("int")))) 7558 matches the specialization A<int> 7559 7560functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7561 matches the specialization f<int> 7562</pre></td></tr> 7563 7564 7565<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> 7566<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7567 7568 7569<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> 7570<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7571declaration. 7572 7573Given 7574 template<bool b> 7575 struct S { 7576 S(int); // #1 7577 explicit S(double); // #2 7578 operator int(); // #3 7579 explicit operator bool(); // #4 7580 explicit(false) S(bool) // # 7 7581 explicit(true) S(char) // # 8 7582 explicit(b) S(S) // # 9 7583 }; 7584 S(int) -> S<true> // #5 7585 explicit S(double) -> S<false> // #6 7586cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7587cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7588cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7589</pre></td></tr> 7590 7591 7592<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> 7593<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7594declaration or a block. 7595 7596Given 7597 class X { void f(int x) {} }; 7598cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7599 matches f(int x) {} 7600with hasParameter(...) 7601 matching int x 7602 7603For ObjectiveC, given 7604 @interface I - (void) f:(int) y; @end 7605 7606the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7607matches the declaration of method f with hasParameter 7608matching y. 7609</pre></td></tr> 7610 7611 7612<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> 7613<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7614functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7615 7616Given 7617 template<typename T, typename U> class A {}; 7618 A<bool, int> b; 7619 A<int, bool> c; 7620 7621 template<typename T> void f() {} 7622 void func() { f<int>(); }; 7623classTemplateSpecializationDecl(hasTemplateArgument( 7624 1, refersToType(asString("int")))) 7625 matches the specialization A<bool, int> 7626 7627functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7628 matches the specialization f<int> 7629</pre></td></tr> 7630 7631 7632<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> 7633<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 7634 7635Given: 7636 class X { int f() { return 1; } }; 7637cxxMethodDecl(returns(asString("int"))) 7638 matches int f() { return 1; } 7639</pre></td></tr> 7640 7641 7642<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> 7643<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 7644switch statement or conditional operator. 7645 7646Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7647 if (true) {} 7648</pre></td></tr> 7649 7650 7651<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> 7652<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 7653 7654Given 7655 if (A* a = GetAPointer()) {} 7656hasConditionVariableStatement(...) 7657 matches 'A* a = GetAPointer()'. 7658</pre></td></tr> 7659 7660 7661<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> 7662<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 7663 7664Examples matches the if statement 7665 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 7666 if (false) false; else true; 7667</pre></td></tr> 7668 7669 7670<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> 7671<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 7672 7673Given: 7674 void foo() { 7675 if (int i = foobar(); i > 0) {} 7676 switch (int i = foobar(); i) {} 7677 for (auto& a = get_range(); auto& x : a) {} 7678 } 7679 void bar() { 7680 if (foobar() > 0) {} 7681 switch (foobar()) {} 7682 for (auto& x : get_range()) {} 7683 } 7684ifStmt(hasInitStatement(anything())) 7685 matches the if statement in foo but not in bar. 7686switchStmt(hasInitStatement(anything())) 7687 matches the switch statement in foo but not in bar. 7688cxxForRangeStmt(hasInitStatement(anything())) 7689 matches the range for statement in foo but not in bar. 7690</pre></td></tr> 7691 7692 7693<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> 7694<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 7695 7696Examples matches the if statement 7697 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 7698 if (false) true; else false; 7699</pre></td></tr> 7700 7701 7702<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> 7703<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 7704matcher. 7705 7706FIXME: Unit test this matcher 7707</pre></td></tr> 7708 7709 7710<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> 7711<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 7712 7713Example matches y. 7714 (matcher = initListExpr(hasInit(0, expr()))) 7715 int x{y}. 7716</pre></td></tr> 7717 7718 7719<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> 7720<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 7721(if expression have it). 7722</pre></td></tr> 7723 7724 7725<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> 7726<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 7727matches the given matcher. 7728 7729The associated declaration is: 7730- for type nodes, the declaration of the underlying type 7731- for CallExpr, the declaration of the callee 7732- for MemberExpr, the declaration of the referenced member 7733- for CXXConstructExpr, the declaration of the constructor 7734- for CXXNewExpr, the declaration of the operator new 7735- for ObjCIvarExpr, the declaration of the ivar 7736 7737For type nodes, hasDeclaration will generally match the declaration of the 7738sugared type. Given 7739 class X {}; 7740 typedef X Y; 7741 Y y; 7742in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7743typedefDecl. A common use case is to match the underlying, desugared type. 7744This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7745 varDecl(hasType(hasUnqualifiedDesugaredType( 7746 recordType(hasDeclaration(decl()))))) 7747In this matcher, the decl will match the CXXRecordDecl of class X. 7748 7749Usable 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>>, 7750 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>>, 7751 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>>, 7752 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>>, 7753 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>>, 7754 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>>, 7755 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7756</pre></td></tr> 7757 7758 7759<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> 7760<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 7761matches the given matcher. 7762 7763The associated declaration is: 7764- for type nodes, the declaration of the underlying type 7765- for CallExpr, the declaration of the callee 7766- for MemberExpr, the declaration of the referenced member 7767- for CXXConstructExpr, the declaration of the constructor 7768- for CXXNewExpr, the declaration of the operator new 7769- for ObjCIvarExpr, the declaration of the ivar 7770 7771For type nodes, hasDeclaration will generally match the declaration of the 7772sugared type. Given 7773 class X {}; 7774 typedef X Y; 7775 Y y; 7776in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7777typedefDecl. A common use case is to match the underlying, desugared type. 7778This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7779 varDecl(hasType(hasUnqualifiedDesugaredType( 7780 recordType(hasDeclaration(decl()))))) 7781In this matcher, the decl will match the CXXRecordDecl of class X. 7782 7783Usable 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>>, 7784 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>>, 7785 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>>, 7786 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>>, 7787 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>>, 7788 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>>, 7789 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7790</pre></td></tr> 7791 7792 7793<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> 7794<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 7795 7796Given 7797 struct foo { 7798 void bar() { 7799 auto f = [this](){}; 7800 } 7801 } 7802lambdaExpr(hasAnyCapture(cxxThisExpr())) 7803 matches [this](){}; 7804</pre></td></tr> 7805 7806 7807<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> 7808<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 7809 7810Given 7811 void foo() { 7812 int x; 7813 auto f = [x](){}; 7814 } 7815lambdaExpr(hasAnyCapture(anything())) 7816 matches [x](){}; 7817</pre></td></tr> 7818 7819 7820<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> 7821<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 7822matches the given matcher. 7823 7824The associated declaration is: 7825- for type nodes, the declaration of the underlying type 7826- for CallExpr, the declaration of the callee 7827- for MemberExpr, the declaration of the referenced member 7828- for CXXConstructExpr, the declaration of the constructor 7829- for CXXNewExpr, the declaration of the operator new 7830- for ObjCIvarExpr, the declaration of the ivar 7831 7832For type nodes, hasDeclaration will generally match the declaration of the 7833sugared type. Given 7834 class X {}; 7835 typedef X Y; 7836 Y y; 7837in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7838typedefDecl. A common use case is to match the underlying, desugared type. 7839This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7840 varDecl(hasType(hasUnqualifiedDesugaredType( 7841 recordType(hasDeclaration(decl()))))) 7842In this matcher, the decl will match the CXXRecordDecl of class X. 7843 7844Usable 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>>, 7845 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>>, 7846 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>>, 7847 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>>, 7848 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>>, 7849 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>>, 7850 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7851</pre></td></tr> 7852 7853 7854<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> 7855<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 7856given matcher. Implicit object expressions are included; that is, it matches 7857use of implicit `this`. 7858 7859Given 7860 struct X { 7861 int m; 7862 int f(X x) { x.m; return m; } 7863 }; 7864memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7865 matches `x.m`, but not `m`; however, 7866memberExpr(hasObjectExpression(hasType(pointsTo( 7867 cxxRecordDecl(hasName("X")))))) 7868 matches `m` (aka. `this->m`), but not `x.m`. 7869</pre></td></tr> 7870 7871 7872<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> 7873<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 7874given matcher. 7875 7876Given 7877 struct { int first, second; } first, second; 7878 int i(second.first); 7879 int j(first.second); 7880memberExpr(member(hasName("first"))) 7881 matches second.first 7882 but not first.second (because the member name there is "second"). 7883</pre></td></tr> 7884 7885 7886<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> 7887<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 7888pointee matches a given matcher. 7889 7890Given 7891 int *a; 7892 int const *b; 7893 float const *f; 7894pointerType(pointee(isConstQualified(), isInteger())) 7895 matches "int const *b" 7896 7897Usable 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>>, 7898 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>> 7899</pre></td></tr> 7900 7901 7902<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> 7903<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7904matcher. 7905 7906Given 7907 namespace N { template<class T> void f(T t); } 7908 template <class T> void g() { using N::f; f(T()); } 7909unresolvedLookupExpr(hasAnyDeclaration( 7910 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7911 matches the use of f in g() . 7912</pre></td></tr> 7913 7914 7915<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> 7916<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 7917 7918Given 7919 struct A { struct B { struct C {}; }; }; 7920 A::B::C c; 7921nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 7922 matches "A::" 7923</pre></td></tr> 7924 7925 7926<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> 7927<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7928NestedNameSpecifier-matcher matches. 7929</pre></td></tr> 7930 7931 7932<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> 7933<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7934given TypeLoc. 7935 7936Given 7937 struct A { struct B { struct C {}; }; }; 7938 A::B::C c; 7939nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7940 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7941 matches "A::" 7942</pre></td></tr> 7943 7944 7945<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> 7946<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7947 7948Given 7949 struct A { struct B { struct C {}; }; }; 7950 A::B::C c; 7951nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7952 matches "A::" 7953</pre></td></tr> 7954 7955 7956<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> 7957<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7958given namespace matcher. 7959 7960Given 7961 namespace ns { struct A {}; } 7962 ns::A a; 7963nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7964 matches "ns::" 7965</pre></td></tr> 7966 7967 7968<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> 7969<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7970given QualType matcher without qualifiers. 7971 7972Given 7973 struct A { struct B { struct C {}; }; }; 7974 A::B::C c; 7975nestedNameSpecifier(specifiesType( 7976 hasDeclaration(cxxRecordDecl(hasName("A"))) 7977)) 7978 matches "A::" 7979</pre></td></tr> 7980 7981 7982<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> 7983<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7984 7985Given 7986 7987 #pragma omp parallel 7988 #pragma omp parallel default(none) 7989 7990``ompExecutableDirective(hasAnyClause(anything()))`` matches 7991``omp parallel default(none)``. 7992</pre></td></tr> 7993 7994 7995<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> 7996<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 7997 7998Prerequisite: the executable directive must not be standalone directive. 7999If it is, it will never match. 8000 8001Given 8002 8003 #pragma omp parallel 8004 ; 8005 #pragma omp parallel 8006 {} 8007 8008``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8009</pre></td></tr> 8010 8011 8012<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> 8013<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8014matching Base, or Objective-C classes that directly or indirectly 8015subclass a class matching Base. 8016 8017Note that a class is not considered to be derived from itself. 8018 8019Example matches Y, Z, C (Base == hasName("X")) 8020 class X; 8021 class Y : public X {}; // directly derived 8022 class Z : public Y {}; // indirectly derived 8023 typedef X A; 8024 typedef A B; 8025 class C : public B {}; // derived from a typedef of X 8026 8027In the following example, Bar matches isDerivedFrom(hasName("X")): 8028 class Foo; 8029 typedef Foo X; 8030 class Bar : public Foo {}; // derived from a type that X is a typedef of 8031 8032In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8033 @interface NSObject @end 8034 @interface Bar : NSObject @end 8035 8036Usable 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>> 8037</pre></td></tr> 8038 8039 8040<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> 8041<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8042matching Base. 8043 8044Note that a class is not considered to be derived from itself. 8045 8046Example matches Y, C (Base == hasName("X")) 8047 class X; 8048 class Y : public X {}; // directly derived 8049 class Z : public Y {}; // indirectly derived 8050 typedef X A; 8051 typedef A B; 8052 class C : public B {}; // derived from a typedef of X 8053 8054In the following example, Bar matches isDerivedFrom(hasName("X")): 8055 class Foo; 8056 typedef Foo X; 8057 class Bar : public Foo {}; // derived from a type that X is a typedef of 8058</pre></td></tr> 8059 8060 8061<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> 8062<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8063match Base. 8064</pre></td></tr> 8065 8066 8067<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> 8068<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8069expression, or an ObjC-message-send expression. 8070 8071Given 8072 void x(int, int, int) { int y; x(1, y, 42); } 8073callExpr(hasAnyArgument(declRefExpr())) 8074 matches x(1, y, 42) 8075with hasAnyArgument(...) 8076 matching y 8077 8078For ObjectiveC, given 8079 @interface I - (void) f:(int) y; @end 8080 void foo(I *i) { [i f:12]; } 8081objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8082 matches [i f:12] 8083</pre></td></tr> 8084 8085 8086<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> 8087<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8088call expression. 8089 8090Example matches y in x(y) 8091 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8092 void x(int) { int y; x(y); } 8093</pre></td></tr> 8094 8095 8096<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> 8097<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8098and the inner matcher matches on that instance. 8099 8100For example the method call in 8101 NSString *x = @"hello"; 8102 [x containsString:@"h"]; 8103is matched by 8104objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8105</pre></td></tr> 8106 8107 8108<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> 8109<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8110 8111Example 8112matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8113matches the [webView ...] message invocation. 8114 NSString *webViewJavaScript = ... 8115 UIWebView *webView = ... 8116 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8117</pre></td></tr> 8118 8119 8120<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> 8121<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8122block. 8123 8124Does not match the 'this' parameter of a method. 8125 8126Given 8127 class X { void f(int x, int y, int z) {} }; 8128cxxMethodDecl(hasAnyParameter(hasName("y"))) 8129 matches f(int x, int y, int z) {} 8130with hasAnyParameter(...) 8131 matching int y 8132 8133For ObjectiveC, given 8134 @interface I - (void) f:(int) y; @end 8135 8136the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8137matches the declaration of method f with hasParameter 8138matching y. 8139 8140For blocks, given 8141 b = ^(int y) { printf("%d", y) }; 8142 8143the matcher blockDecl(hasAnyParameter(hasName("y"))) 8144matches the declaration of the block b with hasParameter 8145matching y. 8146</pre></td></tr> 8147 8148 8149<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> 8150<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8151declaration or a block. 8152 8153Given 8154 class X { void f(int x) {} }; 8155cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8156 matches f(int x) {} 8157with hasParameter(...) 8158 matching int x 8159 8160For ObjectiveC, given 8161 @interface I - (void) f:(int) y; @end 8162 8163the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8164matches the declaration of method f with hasParameter 8165matching y. 8166</pre></td></tr> 8167 8168 8169<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> 8170<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8171or opaque value's source expression matches the given matcher. 8172 8173Example 1: matches "a string" 8174(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8175class URL { URL(string); }; 8176URL url = "a string"; 8177 8178Example 2: matches 'b' (matcher = 8179opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8180int a = b ?: 1; 8181</pre></td></tr> 8182 8183 8184<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> 8185<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8186overloads matches the given matcher. 8187 8188Given 8189 template <typename T> void foo(T); 8190 template <typename T> void bar(T); 8191 template <typename T> void baz(T t) { 8192 foo(t); 8193 bar(t); 8194 } 8195unresolvedLookupExpr(hasAnyDeclaration( 8196 functionTemplateDecl(hasName("foo")))) 8197 matches foo in foo(t); but not bar in bar(t); 8198</pre></td></tr> 8199 8200 8201<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> 8202<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8203 8204Given 8205 int (*ptr_to_array)[4]; 8206 int (*ptr_to_func)(int); 8207 8208varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8209ptr_to_func but not ptr_to_array. 8210 8211Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8212</pre></td></tr> 8213 8214 8215<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> 8216<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8217pointee matches a given matcher. 8218 8219Given 8220 int *a; 8221 int const *b; 8222 float const *f; 8223pointerType(pointee(isConstQualified(), isInteger())) 8224 matches "int const *b" 8225 8226Usable 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>>, 8227 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>> 8228</pre></td></tr> 8229 8230 8231<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> 8232<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8233 8234Given: 8235 typedef int &int_ref; 8236 int a; 8237 int_ref b = a; 8238 8239varDecl(hasType(qualType(referenceType()))))) will not match the 8240declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8241</pre></td></tr> 8242 8243 8244<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> 8245<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8246matches the given matcher. 8247 8248The associated declaration is: 8249- for type nodes, the declaration of the underlying type 8250- for CallExpr, the declaration of the callee 8251- for MemberExpr, the declaration of the referenced member 8252- for CXXConstructExpr, the declaration of the constructor 8253- for CXXNewExpr, the declaration of the operator new 8254- for ObjCIvarExpr, the declaration of the ivar 8255 8256For type nodes, hasDeclaration will generally match the declaration of the 8257sugared type. Given 8258 class X {}; 8259 typedef X Y; 8260 Y y; 8261in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8262typedefDecl. A common use case is to match the underlying, desugared type. 8263This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8264 varDecl(hasType(hasUnqualifiedDesugaredType( 8265 recordType(hasDeclaration(decl()))))) 8266In this matcher, the decl will match the CXXRecordDecl of class X. 8267 8268Usable 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>>, 8269 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>>, 8270 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>>, 8271 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>>, 8272 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>>, 8273 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>>, 8274 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8275</pre></td></tr> 8276 8277 8278<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> 8279<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8280 8281Given 8282 void (*fp)(void); 8283The matcher 8284 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8285would match the declaration for fp. 8286</pre></td></tr> 8287 8288 8289<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> 8290<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8291</pre></td></tr> 8292 8293 8294<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> 8295<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8296matches the specified matcher. 8297 8298Example matches y->x() 8299 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8300 cxxRecordDecl(hasName("Y"))))))) 8301 class Y { public: void x(); }; 8302 void z() { Y *y; y->x(); } 8303</pre></td></tr> 8304 8305 8306<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> 8307<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8308</pre></td></tr> 8309 8310 8311<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> 8312<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8313type matches the specified matcher. 8314 8315Example matches X &x and const X &y 8316 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8317 class X { 8318 void a(X b) { 8319 X &x = b; 8320 const X &y = b; 8321 } 8322 }; 8323</pre></td></tr> 8324 8325 8326<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> 8327<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8328matches the given matcher. 8329 8330The associated declaration is: 8331- for type nodes, the declaration of the underlying type 8332- for CallExpr, the declaration of the callee 8333- for MemberExpr, the declaration of the referenced member 8334- for CXXConstructExpr, the declaration of the constructor 8335- for CXXNewExpr, the declaration of the operator new 8336- for ObjCIvarExpr, the declaration of the ivar 8337 8338For type nodes, hasDeclaration will generally match the declaration of the 8339sugared type. Given 8340 class X {}; 8341 typedef X Y; 8342 Y y; 8343in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8344typedefDecl. A common use case is to match the underlying, desugared type. 8345This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8346 varDecl(hasType(hasUnqualifiedDesugaredType( 8347 recordType(hasDeclaration(decl()))))) 8348In this matcher, the decl will match the CXXRecordDecl of class X. 8349 8350Usable 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>>, 8351 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>>, 8352 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>>, 8353 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>>, 8354 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>>, 8355 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>>, 8356 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8357</pre></td></tr> 8358 8359 8360<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> 8361<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8362pointee matches a given matcher. 8363 8364Given 8365 int *a; 8366 int const *b; 8367 float const *f; 8368pointerType(pointee(isConstQualified(), isInteger())) 8369 matches "int const *b" 8370 8371Usable 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>>, 8372 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>> 8373</pre></td></tr> 8374 8375 8376<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> 8377<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8378 8379Given 8380 return a + b; 8381hasReturnValue(binaryOperator()) 8382 matches 'return a + b' 8383with binaryOperator() 8384 matching 'a + b' 8385</pre></td></tr> 8386 8387 8388<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> 8389<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8390a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8391 8392Given 8393 { {}; 1+2; } 8394hasAnySubstatement(compoundStmt()) 8395 matches '{ {}; 1+2; }' 8396with compoundStmt() 8397 matching '{}' 8398</pre></td></tr> 8399 8400 8401<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> 8402<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8403alignof. 8404</pre></td></tr> 8405 8406 8407<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> 8408<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 8409 8410Given: 8411F& operator=(const F& o) { 8412 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8413 return *this; 8414} 8415returnStmt(forFunction(hasName("operator="))) 8416 matches 'return *this' 8417 but does not match 'return v > 0' 8418</pre></td></tr> 8419 8420 8421<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> 8422<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8423sizeof. 8424</pre></td></tr> 8425 8426 8427<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> 8428<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8429type that matches the provided matcher. 8430 8431Given 8432 template <typename T> 8433 double F(T t); 8434 int i; 8435 double j = F(i); 8436 8437substTemplateTypeParmType(hasReplacementType(type())) matches int 8438</pre></td></tr> 8439 8440 8441<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> 8442<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8443statement. This matcher may produce multiple matches. 8444 8445Given 8446 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8447switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8448 matches four times, with "c" binding each of "case 1:", "case 2:", 8449"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8450"switch (1)", "switch (2)" and "switch (2)". 8451</pre></td></tr> 8452 8453 8454<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> 8455<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8456switch statement or conditional operator. 8457 8458Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8459 if (true) {} 8460</pre></td></tr> 8461 8462 8463<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> 8464<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8465 8466Given: 8467 void foo() { 8468 if (int i = foobar(); i > 0) {} 8469 switch (int i = foobar(); i) {} 8470 for (auto& a = get_range(); auto& x : a) {} 8471 } 8472 void bar() { 8473 if (foobar() > 0) {} 8474 switch (foobar()) {} 8475 for (auto& x : get_range()) {} 8476 } 8477ifStmt(hasInitStatement(anything())) 8478 matches the if statement in foo but not in bar. 8479switchStmt(hasInitStatement(anything())) 8480 matches the switch statement in foo but not in bar. 8481cxxForRangeStmt(hasInitStatement(anything())) 8482 matches the range for statement in foo but not in bar. 8483</pre></td></tr> 8484 8485 8486<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> 8487<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8488matches the given matcher. 8489 8490The associated declaration is: 8491- for type nodes, the declaration of the underlying type 8492- for CallExpr, the declaration of the callee 8493- for MemberExpr, the declaration of the referenced member 8494- for CXXConstructExpr, the declaration of the constructor 8495- for CXXNewExpr, the declaration of the operator new 8496- for ObjCIvarExpr, the declaration of the ivar 8497 8498For type nodes, hasDeclaration will generally match the declaration of the 8499sugared type. Given 8500 class X {}; 8501 typedef X Y; 8502 Y y; 8503in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8504typedefDecl. A common use case is to match the underlying, desugared type. 8505This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8506 varDecl(hasType(hasUnqualifiedDesugaredType( 8507 recordType(hasDeclaration(decl()))))) 8508In this matcher, the decl will match the CXXRecordDecl of class X. 8509 8510Usable 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>>, 8511 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>>, 8512 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>>, 8513 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>>, 8514 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>>, 8515 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>>, 8516 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8517</pre></td></tr> 8518 8519 8520<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> 8521<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8522 8523Given 8524 struct B { int next; }; 8525 template<int(B::*next_ptr)> struct A {}; 8526 A<&B::next> a; 8527templateSpecializationType(hasAnyTemplateArgument( 8528 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8529 matches the specialization A<&B::next> with fieldDecl(...) matching 8530 B::next 8531</pre></td></tr> 8532 8533 8534<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> 8535<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 8536declaration. 8537 8538Given 8539 struct B { int next; }; 8540 template<int(B::*next_ptr)> struct A {}; 8541 A<&B::next> a; 8542classTemplateSpecializationDecl(hasAnyTemplateArgument( 8543 refersToDeclaration(fieldDecl(hasName("next"))))) 8544 matches the specialization A<&B::next> with fieldDecl(...) matching 8545 B::next 8546</pre></td></tr> 8547 8548 8549<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> 8550<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 8551 8552Given 8553 template<int T> struct C {}; 8554 C<42> c; 8555classTemplateSpecializationDecl( 8556 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 8557 matches the implicit instantiation of C in C<42>. 8558</pre></td></tr> 8559 8560 8561<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> 8562<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 8563 8564Given 8565 template<template <typename> class S> class X {}; 8566 template<typename T> class Y {}; 8567 X<Y> xi; 8568classTemplateSpecializationDecl(hasAnyTemplateArgument( 8569 refersToTemplate(templateName()))) 8570 matches the specialization X<Y> 8571</pre></td></tr> 8572 8573 8574<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> 8575<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 8576 8577Given 8578 struct X {}; 8579 template<typename T> struct A {}; 8580 A<X> a; 8581classTemplateSpecializationDecl(hasAnyTemplateArgument( 8582 refersToType(class(hasName("X"))))) 8583 matches the specialization A<X> 8584</pre></td></tr> 8585 8586 8587<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> 8588<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8589functionDecl that have at least one TemplateArgument matching the given 8590InnerMatcher. 8591 8592Given 8593 template<typename T> class A {}; 8594 template<> class A<double> {}; 8595 A<int> a; 8596 8597 template<typename T> f() {}; 8598 void func() { f<int>(); }; 8599 8600classTemplateSpecializationDecl(hasAnyTemplateArgument( 8601 refersToType(asString("int")))) 8602 matches the specialization A<int> 8603 8604functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8605 matches the specialization f<int> 8606</pre></td></tr> 8607 8608 8609<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> 8610<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 8611matches the given matcher. 8612 8613The associated declaration is: 8614- for type nodes, the declaration of the underlying type 8615- for CallExpr, the declaration of the callee 8616- for MemberExpr, the declaration of the referenced member 8617- for CXXConstructExpr, the declaration of the constructor 8618- for CXXNewExpr, the declaration of the operator new 8619- for ObjCIvarExpr, the declaration of the ivar 8620 8621For type nodes, hasDeclaration will generally match the declaration of the 8622sugared type. Given 8623 class X {}; 8624 typedef X Y; 8625 Y y; 8626in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8627typedefDecl. A common use case is to match the underlying, desugared type. 8628This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8629 varDecl(hasType(hasUnqualifiedDesugaredType( 8630 recordType(hasDeclaration(decl()))))) 8631In this matcher, the decl will match the CXXRecordDecl of class X. 8632 8633Usable 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>>, 8634 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>>, 8635 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>>, 8636 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>>, 8637 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>>, 8638 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>>, 8639 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8640</pre></td></tr> 8641 8642 8643<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> 8644<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8645functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8646 8647Given 8648 template<typename T, typename U> class A {}; 8649 A<bool, int> b; 8650 A<int, bool> c; 8651 8652 template<typename T> void f() {} 8653 void func() { f<int>(); }; 8654classTemplateSpecializationDecl(hasTemplateArgument( 8655 1, refersToType(asString("int")))) 8656 matches the specialization A<bool, int> 8657 8658functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8659 matches the specialization f<int> 8660</pre></td></tr> 8661 8662 8663<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> 8664<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 8665matches the given matcher. 8666 8667The associated declaration is: 8668- for type nodes, the declaration of the underlying type 8669- for CallExpr, the declaration of the callee 8670- for MemberExpr, the declaration of the referenced member 8671- for CXXConstructExpr, the declaration of the constructor 8672- for CXXNewExpr, the declaration of the operator new 8673- for ObjCIvarExpr, the declaration of the ivar 8674 8675For type nodes, hasDeclaration will generally match the declaration of the 8676sugared type. Given 8677 class X {}; 8678 typedef X Y; 8679 Y y; 8680in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8681typedefDecl. A common use case is to match the underlying, desugared type. 8682This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8683 varDecl(hasType(hasUnqualifiedDesugaredType( 8684 recordType(hasDeclaration(decl()))))) 8685In this matcher, the decl will match the CXXRecordDecl of class X. 8686 8687Usable 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>>, 8688 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>>, 8689 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>>, 8690 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>>, 8691 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>>, 8692 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>>, 8693 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8694</pre></td></tr> 8695 8696 8697<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> 8698<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 8699QualType-matcher matches. 8700</pre></td></tr> 8701 8702 8703<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> 8704<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 8705matcher. 8706 8707Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8708 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8709 and U (matcher = typedefDecl(hasType(asString("int"))) 8710 and friend class X (matcher = friendDecl(hasType("X")) 8711 class X {}; 8712 void y(X &x) { x; X z; } 8713 typedef int U; 8714 class Y { friend class X; }; 8715</pre></td></tr> 8716 8717 8718<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> 8719<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 8720matches the given matcher. 8721 8722The associated declaration is: 8723- for type nodes, the declaration of the underlying type 8724- for CallExpr, the declaration of the callee 8725- for MemberExpr, the declaration of the referenced member 8726- for CXXConstructExpr, the declaration of the constructor 8727- for CXXNewExpr, the declaration of the operator new 8728- for ObjCIvarExpr, the declaration of the ivar 8729 8730For type nodes, hasDeclaration will generally match the declaration of the 8731sugared type. Given 8732 class X {}; 8733 typedef X Y; 8734 Y y; 8735in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8736typedefDecl. A common use case is to match the underlying, desugared type. 8737This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8738 varDecl(hasType(hasUnqualifiedDesugaredType( 8739 recordType(hasDeclaration(decl()))))) 8740In this matcher, the decl will match the CXXRecordDecl of class X. 8741 8742Usable 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>>, 8743 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>>, 8744 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>>, 8745 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>>, 8746 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>>, 8747 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>>, 8748 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8749</pre></td></tr> 8750 8751 8752<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> 8753<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 8754type of the matched node. 8755 8756For example, in: 8757 class A {}; 8758 using B = A; 8759The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 8760both B and A. 8761</pre></td></tr> 8762 8763 8764<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> 8765<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 8766 8767Given 8768 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 8769unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 8770 matches sizeof(a) and alignof(c) 8771</pre></td></tr> 8772 8773 8774<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> 8775<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 8776 8777Example matches true (matcher = hasUnaryOperand( 8778 cxxBoolLiteral(equals(true)))) 8779 !true 8780</pre></td></tr> 8781 8782 8783<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> 8784<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 8785given matcher. Implicit object expressions are included; that is, it matches 8786use of implicit `this`. 8787 8788Given 8789 struct X { 8790 int m; 8791 int f(X x) { x.m; return m; } 8792 }; 8793memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8794 matches `x.m`, but not `m`; however, 8795memberExpr(hasObjectExpression(hasType(pointsTo( 8796 cxxRecordDecl(hasName("X")))))) 8797 matches `m` (aka. `this->m`), but not `x.m`. 8798</pre></td></tr> 8799 8800 8801<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> 8802<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 8803matches the given matcher. 8804 8805The associated declaration is: 8806- for type nodes, the declaration of the underlying type 8807- for CallExpr, the declaration of the callee 8808- for MemberExpr, the declaration of the referenced member 8809- for CXXConstructExpr, the declaration of the constructor 8810- for CXXNewExpr, the declaration of the operator new 8811- for ObjCIvarExpr, the declaration of the ivar 8812 8813For type nodes, hasDeclaration will generally match the declaration of the 8814sugared type. Given 8815 class X {}; 8816 typedef X Y; 8817 Y y; 8818in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8819typedefDecl. A common use case is to match the underlying, desugared type. 8820This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8821 varDecl(hasType(hasUnqualifiedDesugaredType( 8822 recordType(hasDeclaration(decl()))))) 8823In this matcher, the decl will match the CXXRecordDecl of class X. 8824 8825Usable 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>>, 8826 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>>, 8827 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>>, 8828 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>>, 8829 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>>, 8830 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>>, 8831 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8832</pre></td></tr> 8833 8834 8835<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> 8836<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 8837 8838Given 8839 namespace X { void b(); } 8840 using X::b; 8841usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 8842 matches using X::b </pre></td></tr> 8843 8844 8845<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> 8846<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 8847matched by the given matcher. 8848 8849Given 8850 namespace X { int a; void b(); } 8851 using X::a; 8852 using X::b; 8853usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 8854 matches using X::b but not using X::a </pre></td></tr> 8855 8856 8857<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> 8858<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8859declaration's type. 8860 8861In case of a value declaration (for example a variable declaration), 8862this resolves one layer of indirection. For example, in the value 8863declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8864X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8865declaration of x. 8866 8867Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8868 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8869 and friend class X (matcher = friendDecl(hasType("X")) 8870 class X {}; 8871 void y(X &x) { x; X z; } 8872 class Y { friend class X; }; 8873 8874Example matches class Derived 8875(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8876class Base {}; 8877class Derived : Base {}; 8878 8879Usable 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>>, 8880Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8881</pre></td></tr> 8882 8883 8884<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> 8885<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 8886matcher. 8887 8888Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8889 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8890 and U (matcher = typedefDecl(hasType(asString("int"))) 8891 and friend class X (matcher = friendDecl(hasType("X")) 8892 class X {}; 8893 void y(X &x) { x; X z; } 8894 typedef int U; 8895 class Y { friend class X; }; 8896</pre></td></tr> 8897 8898 8899<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> 8900<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 8901that matches the given matcher. 8902 8903Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8904 bool y() { return true; } 8905 bool x = y(); 8906</pre></td></tr> 8907 8908 8909<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> 8910<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 8911expression. 8912 8913Given 8914 void f(int b) { 8915 int a[b]; 8916 } 8917variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 8918 varDecl(hasName("b"))))))) 8919 matches "int a[b]" 8920</pre></td></tr> 8921 8922 8923<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> 8924<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 8925 8926 8927<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> 8928<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8929switch statement or conditional operator. 8930 8931Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8932 if (true) {} 8933</pre></td></tr> 8934 8935<!--END_TRAVERSAL_MATCHERS --> 8936</table> 8937 8938</div> 8939</body> 8940</html> 8941 8942 8943