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