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_1Attr.html">Attr</a>></td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>>...</td></tr> 577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes. 578Attributes may be attached with a variety of different syntaxes (including 579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``, 580and ``#pragma``s). They may also be implicit. 581 582Given 583 struct [[nodiscard]] Foo{}; 584 void bar(int * __attribute__((nonnull)) ); 585 __declspec(noinline) void baz(); 586 587 #pragma omp declare simd 588 int min(); 589attr() 590 matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line. 591</pre></td></tr> 592 593 594<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>...</td></tr> 595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases. 596 597Examples matches public virtual B. 598 class B {}; 599 class C : public virtual B {}; 600</pre></td></tr> 601 602 603<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> 604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 605 606Examples matches i(42). 607 class C { 608 C() : i(42) {} 609 int i; 610 }; 611</pre></td></tr> 612 613 614<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> 615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 616 617Given 618 class C { 619 public: 620 int a; 621 }; 622accessSpecDecl() 623 matches 'public:' 624</pre></td></tr> 625 626 627<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> 628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 629Example matches foo and bar 630(matcher = bindingDecl() 631 632 auto [foo, bar] = std::make_pair{42, 42}; 633</pre></td></tr> 634 635 636<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> 637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 638 639Example matches the declaration of the nameless block printing an input 640integer. 641 642 myFunc(^(int p) { 643 printf("%d", p); 644 }) 645</pre></td></tr> 646 647 648<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> 649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 650 651Example matches Z 652 template<class T> class Z {}; 653</pre></td></tr> 654 655 656<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> 657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 658 659Given 660 template<class T1, class T2, int I> 661 class A {}; 662 663 template<class T, int I> 664 class A<T, T*, I> {}; 665 666 template<> 667 class A<int, int, 1> {}; 668classTemplatePartialSpecializationDecl() 669 matches the specialization A<T,T*,I> but not A<int,int,1> 670</pre></td></tr> 671 672 673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 675 676Given 677 template<typename T> class A {}; 678 template<> class A<double> {}; 679 A<int> a; 680classTemplateSpecializationDecl() 681 matches the specializations A<int> and A<double> 682</pre></td></tr> 683 684 685<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> 686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 687 688Example matches Foo::Foo() and Foo::Foo(int) 689 class Foo { 690 public: 691 Foo(); 692 Foo(int); 693 int DoSomething(); 694 }; 695</pre></td></tr> 696 697 698<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 700 701Example matches the operator. 702 class X { operator int() const; }; 703</pre></td></tr> 704 705 706<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> 707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 708 709Example matches the deduction guide. 710 template<typename T> 711 class X { X(int) }; 712 X(int) -> X<int>; 713</pre></td></tr> 714 715 716<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> 717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 718 719Example matches Foo::~Foo() 720 class Foo { 721 public: 722 virtual ~Foo(); 723 }; 724</pre></td></tr> 725 726 727<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> 728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 729 730Example matches y 731 class X { void y(); }; 732</pre></td></tr> 733 734 735<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> 736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 737 738Example matches X, Z 739 class X; 740 template<class T> class Z {}; 741</pre></td></tr> 742 743 744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 746 747Examples matches X, C, and the friend declaration inside C; 748 void X(); 749 class C { 750 friend X; 751 }; 752</pre></td></tr> 753 754 755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 757and non-type template parameter declarations). 758 759Given 760 class X { int y; }; 761declaratorDecl() 762 matches int y. 763</pre></td></tr> 764 765 766<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> 767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 768 769Examples matches the declaration node with foo and bar, but not 770number. 771(matcher = declStmt(has(decompositionDecl()))) 772 773 int number = 42; 774 auto [foo, bar] = std::make_pair{42, 42}; 775</pre></td></tr> 776 777 778<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> 779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 780 781Example matches A, B, C 782 enum X { 783 A, B, C 784 }; 785</pre></td></tr> 786 787 788<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 790 791Example matches X 792 enum X { 793 A, B, C 794 }; 795</pre></td></tr> 796 797 798<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> 799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 800 801Given 802 class X { int m; }; 803fieldDecl() 804 matches 'm'. 805</pre></td></tr> 806 807 808<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> 809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 810 811Given 812 class X { friend void foo(); }; 813friendDecl() 814 matches 'friend void foo()'. 815</pre></td></tr> 816 817 818<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> 819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 820 821Example matches f 822 void f(); 823</pre></td></tr> 824 825 826<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> 827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 828 829Example matches f 830 template<class T> void f(T t) {} 831</pre></td></tr> 832 833 834<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> 835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 836 837Given 838 struct X { struct { int a; }; }; 839indirectFieldDecl() 840 matches 'a'. 841</pre></td></tr> 842 843 844<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> 845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 846 847Given 848 goto FOO; 849 FOO: bar(); 850labelDecl() 851 matches 'FOO:' 852</pre></td></tr> 853 854 855<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> 856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 857 858Given 859 extern "C" {} 860linkageSpecDecl() 861 matches "extern "C" {}" 862</pre></td></tr> 863 864 865<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> 866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 867 868Example matches X, S, the anonymous union type, i, and U; 869 typedef int X; 870 struct S { 871 union { 872 int i; 873 } U; 874 }; 875</pre></td></tr> 876 877 878<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> 879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 880 881Given 882 namespace test {} 883 namespace alias = ::test; 884namespaceAliasDecl() 885 matches "namespace alias" but not "namespace test" 886</pre></td></tr> 887 888 889<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> 890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 891 892Given 893 namespace {} 894 namespace test {} 895namespaceDecl() 896 matches "namespace {}" and "namespace test {}" 897</pre></td></tr> 898 899 900<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 902 903Given 904 template <typename T, int N> struct C {}; 905nonTypeTemplateParmDecl() 906 matches 'N', but not 'T'. 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('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 912 913Example matches Foo (Additions) 914 @interface Foo (Additions) 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('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 921 922Example matches Foo (Additions) 923 @implementation Foo (Additions) 924 @end 925</pre></td></tr> 926 927 928<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> 929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 930 931Example matches Foo 932 @implementation Foo 933 @end 934</pre></td></tr> 935 936 937<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> 938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 939 940Example matches Foo 941 @interface Foo 942 @end 943</pre></td></tr> 944 945 946<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> 947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 948 949Example matches _enabled 950 @implementation Foo { 951 BOOL _enabled; 952 } 953 @end 954</pre></td></tr> 955 956 957<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 959 960Example matches both declaration and definition of -[Foo method] 961 @interface Foo 962 - (void)method; 963 @end 964 965 @implementation Foo 966 - (void)method {} 967 @end 968</pre></td></tr> 969 970 971<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> 972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 973 974Example matches enabled 975 @interface Foo 976 @property BOOL enabled; 977 @end 978</pre></td></tr> 979 980 981<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> 982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 983 984Example matches FooDelegate 985 @protocol FooDelegate 986 @end 987</pre></td></tr> 988 989 990<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> 991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 992 993Given 994 void f(int x); 995parmVarDecl() 996 matches int x. 997</pre></td></tr> 998 999 1000<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> 1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 1002 1003Example matches X, Z, U, and S 1004 class X; 1005 template<class T> class Z {}; 1006 struct S {}; 1007 union U {}; 1008</pre></td></tr> 1009 1010 1011<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> 1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 1013 1014Example: 1015 staticAssertExpr() 1016matches 1017 static_assert(sizeof(S) == sizeof(int)) 1018in 1019 struct S { 1020 int x; 1021 }; 1022 static_assert(sizeof(S) == sizeof(int)); 1023</pre></td></tr> 1024 1025 1026<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> 1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 1028 1029Example matches X, Z, U, S, E 1030 class X; 1031 template<class T> class Z {}; 1032 struct S {}; 1033 union U {}; 1034 enum E { 1035 A, B, C 1036 }; 1037</pre></td></tr> 1038 1039 1040<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1042 1043Given 1044 template <template <typename> class Z, int N> struct C {}; 1045templateTypeParmDecl() 1046 matches 'Z', but not 'N'. 1047</pre></td></tr> 1048 1049 1050<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> 1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1052 1053Given 1054 template <typename T, int N> struct C {}; 1055templateTypeParmDecl() 1056 matches 'T', but not 'N'. 1057</pre></td></tr> 1058 1059 1060<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1062 1063Given 1064 int X; 1065 namespace NS { 1066 int Y; 1067 } // namespace NS 1068decl(hasDeclContext(translationUnitDecl())) 1069 matches "int X", but not "int Y". 1070</pre></td></tr> 1071 1072 1073<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1075 1076Given 1077 typedef int X; 1078 using Y = int; 1079typeAliasDecl() 1080 matches "using Y = int", but not "typedef int X" 1081</pre></td></tr> 1082 1083 1084<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> 1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1086 1087typeAliasTemplateDecl() matches 1088 template <typename T> 1089 using Y = X<T>; 1090</pre></td></tr> 1091 1092 1093<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> 1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1095 1096Given 1097 typedef int X; 1098 using Y = int; 1099typedefDecl() 1100 matches "typedef int X", but not "using Y = int" 1101</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('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1106 1107Given 1108 typedef int X; 1109 using Y = int; 1110typedefNameDecl() 1111 matches "typedef int X" and "using Y = int" 1112</pre></td></tr> 1113 1114 1115<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> 1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1117typename. 1118 1119Given 1120 template <typename T> 1121 struct Base { typedef T Foo; }; 1122 1123 template<typename T> 1124 struct S : private Base<T> { 1125 using typename Base<T>::Foo; 1126 }; 1127unresolvedUsingTypenameDecl() 1128 matches using Base<T>::Foo </pre></td></tr> 1129 1130 1131<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> 1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1133 1134Given 1135 template<typename X> 1136 class C : private X { 1137 using X::x; 1138 }; 1139unresolvedUsingValueDecl() 1140 matches using X::x </pre></td></tr> 1141 1142 1143<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> 1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1145 1146Given 1147 namespace X { int x; } 1148 using X::x; 1149usingDecl() 1150 matches using X::x </pre></td></tr> 1151 1152 1153<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> 1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1155 1156Given 1157 namespace X { int x; } 1158 using namespace X; 1159usingDirectiveDecl() 1160 matches using namespace X </pre></td></tr> 1161 1162 1163<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>>...</td></tr> 1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations. 1165 1166Given 1167 namespace X { enum x {...}; } 1168 using enum X::x; 1169usingEnumDecl() 1170 matches using enum X::x </pre></td></tr> 1171 1172 1173<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> 1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1175 1176Example matches A, B, C and F 1177 enum X { A, B, C }; 1178 void F(); 1179</pre></td></tr> 1180 1181 1182<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> 1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1184 1185Note: this does not match declarations of member variables, which are 1186"field" declarations in Clang parlance. 1187 1188Example matches a 1189 int a; 1190</pre></td></tr> 1191 1192 1193<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('lambdaCapture0')"><a name="lambdaCapture0Anchor">lambdaCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>>...</td></tr> 1194<tr><td colspan="4" class="doc" id="lambdaCapture0"><pre>Matches lambda captures. 1195 1196Given 1197 int main() { 1198 int x; 1199 auto f = [x](){}; 1200 auto g = [x = 1](){}; 1201 } 1202In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`, 1203`lambdaCapture()` matches `x` and `x=1`. 1204</pre></td></tr> 1205 1206 1207<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> 1208<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1209</pre></td></tr> 1210 1211 1212<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> 1213<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1214 1215Given 1216 namespace ns { 1217 struct A { static void f(); }; 1218 void A::f() {} 1219 void g() { A::f(); } 1220 } 1221 ns::A a; 1222nestedNameSpecifier() 1223 matches "ns::" and both "A::" 1224</pre></td></tr> 1225 1226 1227<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> 1228<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1229 1230Given 1231 1232 #pragma omp parallel default(none) 1233 #pragma omp parallel default(shared) 1234 #pragma omp parallel default(firstprivate) 1235 #pragma omp parallel 1236 1237``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1238``default(firstprivate)`` 1239</pre></td></tr> 1240 1241 1242<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> 1243<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 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('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1248<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1249 1250Given 1251 FOO: bar(); 1252 void *ptr = &&FOO; 1253 goto *bar; 1254addrLabelExpr() 1255 matches '&&FOO' 1256</pre></td></tr> 1257 1258 1259<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> 1260<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1261 1262Given 1263 int i = a[1]; 1264arraySubscriptExpr() 1265 matches "a[1]" 1266</pre></td></tr> 1267 1268 1269<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> 1270<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1271 1272 int i = 100; 1273 __asm("mov al, 2"); 1274asmStmt() 1275 matches '__asm("mov al, 2")' 1276</pre></td></tr> 1277 1278 1279<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> 1280<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1281Example matches __atomic_load_n(ptr, 1) 1282 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1283</pre></td></tr> 1284 1285 1286<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> 1287<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1288 1289Given 1290 @autoreleasepool { 1291 int x = 0; 1292 } 1293autoreleasePoolStmt(stmt()) matches the declaration of "x" 1294inside the autorelease pool. 1295</pre></td></tr> 1296 1297 1298<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> 1299<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1300 1301Example matches a ?: b 1302 (a ?: b) + 42; 1303</pre></td></tr> 1304 1305 1306<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> 1307<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1308 1309Example matches a || b 1310 !(a || b) 1311See also the binaryOperation() matcher for more-general matching. 1312</pre></td></tr> 1313 1314 1315<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> 1316<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1317 1318Example: matches "^{}": 1319 void f() { ^{}(); } 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('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1324<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1325 1326Given 1327 while (true) { break; } 1328breakStmt() 1329 matches 'break' 1330</pre></td></tr> 1331 1332 1333<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> 1334<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1335 1336Example: Matches (int) 2.2f in 1337 int i = (int) 2.2f; 1338</pre></td></tr> 1339 1340 1341<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> 1342<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1343 1344Example matches x.y() and y() 1345 X x; 1346 x.y(); 1347 y(); 1348</pre></td></tr> 1349 1350 1351<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 1352<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1353 1354Given 1355 switch(a) { case 42: break; default: break; } 1356caseStmt() 1357 matches 'case 42:'. 1358</pre></td></tr> 1359 1360 1361<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> 1362<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1363 1364Example: castExpr() matches each of the following: 1365 (int) 3; 1366 const_cast<Expr *>(SubExpr); 1367 char c = 0; 1368but does not match 1369 int i = (0); 1370 int k = 0; 1371</pre></td></tr> 1372 1373 1374<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> 1375<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1376 1377Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1378though. 1379 1380Example matches 'a', L'a' 1381 char ch = 'a'; 1382 wchar_t chw = L'a'; 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('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1387<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1388</pre></td></tr> 1389 1390 1391<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>>...</td></tr> 1392<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions. 1393 1394Given 1395 co_await 1; 1396coawaitExpr() 1397 matches 'co_await 1' 1398</pre></td></tr> 1399 1400 1401<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> 1402<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1403 1404Example match: {1}, (1, 2) 1405 int array[4] = {1}; 1406 vector int myvec = (vector int)(1, 2); 1407</pre></td></tr> 1408 1409 1410<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> 1411<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1412 1413Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1414 for (;;) {{}} 1415</pre></td></tr> 1416 1417 1418<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> 1419<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1420 1421Example matches a ? b : c 1422 (a ? b : c) + 42 1423</pre></td></tr> 1424 1425 1426<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> 1427<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1428 1429Example matches the constant in the case statement: 1430 (matcher = constantExpr()) 1431 switch (a) { 1432 case 37: break; 1433 } 1434</pre></td></tr> 1435 1436 1437<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1438<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1439 1440Given 1441 while (true) { continue; } 1442continueStmt() 1443 matches 'continue' 1444</pre></td></tr> 1445 1446 1447<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> 1448<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements. 1449 1450Given 1451 while (true) { co_return; } 1452coreturnStmt() 1453 matches 'co_return' 1454</pre></td></tr> 1455 1456 1457<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> 1458<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions. 1459 1460Given 1461 co_yield 1; 1462coyieldExpr() 1463 matches 'co_yield 1' 1464</pre></td></tr> 1465 1466 1467<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> 1468<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1469 1470Example matches, 1471 kernel<<<i,j>>>(); 1472</pre></td></tr> 1473 1474 1475<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1476<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1477 1478Example matches FunctionTakesString(GetStringByValue()) 1479 (matcher = cxxBindTemporaryExpr()) 1480 FunctionTakesString(GetStringByValue()); 1481 FunctionTakesStringByPointer(GetStringPointer()); 1482</pre></td></tr> 1483 1484 1485<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> 1486<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1487 1488Example matches true 1489 true 1490</pre></td></tr> 1491 1492 1493<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> 1494<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1495 1496 try {} catch(int i) {} 1497cxxCatchStmt() 1498 matches 'catch(int i)' 1499</pre></td></tr> 1500 1501 1502<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 1503<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1504 1505Example: Matches const_cast<int*>(&r) in 1506 int n = 42; 1507 const int &r(n); 1508 int* p = const_cast<int*>(&r); 1509</pre></td></tr> 1510 1511 1512<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> 1513<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1514 1515Example matches string(ptr, n) and ptr within arguments of f 1516 (matcher = cxxConstructExpr()) 1517 void f(const string &a, const string &b); 1518 char *ptr; 1519 int n; 1520 f(string(ptr, n), ptr); 1521</pre></td></tr> 1522 1523 1524<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> 1525<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1526 1527Example matches the CXXDefaultArgExpr placeholder inserted for the 1528 default value of the second parameter in the call expression f(42) 1529 (matcher = cxxDefaultArgExpr()) 1530 void f(int x, int y = 0); 1531 f(42); 1532</pre></td></tr> 1533 1534 1535<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> 1536<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1537 1538Given 1539 delete X; 1540cxxDeleteExpr() 1541 matches 'delete X'. 1542</pre></td></tr> 1543 1544 1545<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> 1546<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1547resolved because the base expression or the member name was dependent. 1548 1549Given 1550 template <class T> void f() { T t; t.g(); } 1551cxxDependentScopeMemberExpr() 1552 matches t.g 1553</pre></td></tr> 1554 1555 1556<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> 1557<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1558 1559Example: 1560 cxxDynamicCastExpr() 1561matches 1562 dynamic_cast<D*>(&b); 1563in 1564 struct B { virtual ~B() {} }; struct D : B {}; 1565 B b; 1566 D* p = dynamic_cast<D*>(&b); 1567</pre></td></tr> 1568 1569 1570<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> 1571<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1572 1573cxxForRangeStmt() matches 'for (auto a : i)' 1574 int i[] = {1, 2, 3}; for (auto a : i); 1575 for(int j = 0; j < 5; ++j); 1576</pre></td></tr> 1577 1578 1579<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> 1580<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1581 1582Example: Matches Foo(bar); 1583 Foo f = bar; 1584 Foo g = (Foo) bar; 1585 Foo h = Foo(bar); 1586</pre></td></tr> 1587 1588 1589<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1590<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1591 1592Example matches x.y() 1593 X x; 1594 x.y(); 1595</pre></td></tr> 1596 1597 1598<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> 1599<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1600 1601Given 1602 new X; 1603cxxNewExpr() 1604 matches 'new X'. 1605</pre></td></tr> 1606 1607 1608<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1609<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1610 1611Given 1612 bool a() noexcept; 1613 bool b() noexcept(true); 1614 bool c() noexcept(false); 1615 bool d() noexcept(noexcept(a())); 1616 bool e = noexcept(b()) || noexcept(c()); 1617cxxNoexceptExpr() 1618 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1619 doesn't match the noexcept specifier in the declarations a, b, c or d. 1620</pre></td></tr> 1621 1622 1623<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> 1624<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1625</pre></td></tr> 1626 1627 1628<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1629<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1630 1631Note that if an operator isn't overloaded, it won't match. Instead, use 1632binaryOperator matcher. 1633Currently it does not match operators such as new delete. 1634FIXME: figure out why these do not match? 1635 1636Example matches both operator<<((o << b), c) and operator<<(o, b) 1637 (matcher = cxxOperatorCallExpr()) 1638 ostream &operator<< (ostream &out, int i) { }; 1639 ostream &o; int b = 1, c = 1; 1640 o << b << c; 1641See also the binaryOperation() matcher for more-general matching of binary 1642uses of this AST node. 1643</pre></td></tr> 1644 1645 1646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1647<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1648 1649Either the source expression or the destination type can be matched 1650using has(), but hasDestinationType() is more specific and can be 1651more readable. 1652 1653Example matches reinterpret_cast<char*>(&p) in 1654 void* p = reinterpret_cast<char*>(&p); 1655</pre></td></tr> 1656 1657 1658<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> 1659<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1660 1661Example matches use of "<": 1662 #include <compare> 1663 struct HasSpaceshipMem { 1664 int a; 1665 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1666 }; 1667 void compare() { 1668 HasSpaceshipMem hs1, hs2; 1669 if (hs1 < hs2) 1670 return; 1671 } 1672See also the binaryOperation() matcher for more-general matching 1673of this AST node. 1674</pre></td></tr> 1675 1676 1677<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> 1678<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1679 1680See also: hasDestinationType 1681See also: reinterpretCast 1682 1683Example: 1684 cxxStaticCastExpr() 1685matches 1686 static_cast<long>(8) 1687in 1688 long eight(static_cast<long>(8)); 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('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1693<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1694 1695Given 1696 std::vector<int> a({ 1, 2, 3 }); 1697 std::vector<int> b = { 4, 5 }; 1698 int c[] = { 6, 7 }; 1699 std::pair<int, int> d = { 8, 9 }; 1700cxxStdInitializerListExpr() 1701 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1702</pre></td></tr> 1703 1704 1705<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> 1706<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1707 1708Example: Matches Foo(bar, bar) 1709 Foo h = Foo(bar, bar); 1710</pre></td></tr> 1711 1712 1713<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1714<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1715 1716Example matches the implicit this expression in "return i". 1717 (matcher = cxxThisExpr()) 1718struct foo { 1719 int i; 1720 int f() { return i; } 1721}; 1722</pre></td></tr> 1723 1724 1725<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> 1726<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1727 1728 try { throw 5; } catch(int i) {} 1729cxxThrowExpr() 1730 matches 'throw 5' 1731</pre></td></tr> 1732 1733 1734<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1735<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1736 1737 try {} catch(int i) {} 1738cxxTryStmt() 1739 matches 'try {}' 1740</pre></td></tr> 1741 1742 1743<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> 1744<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1745 1746Example matches T(t) in return statement of f 1747 (matcher = cxxUnresolvedConstructExpr()) 1748 template <typename T> 1749 void f(const T& t) { return T(t); } 1750</pre></td></tr> 1751 1752 1753<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> 1754<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1755 1756Example matches x in if (x) 1757 bool x; 1758 if (x) {} 1759</pre></td></tr> 1760 1761 1762<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> 1763<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1764 1765Given 1766 int a; 1767declStmt() 1768 matches 'int a'. 1769</pre></td></tr> 1770 1771 1772<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> 1773<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1774 1775Given 1776 switch(a) { case 42: break; default: break; } 1777defaultStmt() 1778 matches 'default:'. 1779</pre></td></tr> 1780 1781 1782<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> 1783<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent 1784</pre></td></tr> 1785 1786 1787<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> 1788<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1789 1790Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1791 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1792</pre></td></tr> 1793 1794 1795<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1796<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1797 1798Given 1799 do {} while (true); 1800doStmt() 1801 matches 'do {} while(true)' 1802</pre></td></tr> 1803 1804 1805<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> 1806<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1807 1808Matches any cast expression written in user code, whether it be a 1809C-style cast, a functional-style cast, or a keyword cast. 1810 1811Does not match implicit conversions. 1812 1813Note: the name "explicitCast" is chosen to match Clang's terminology, as 1814Clang uses the term "cast" to apply to implicit conversions as well as to 1815actual cast expressions. 1816 1817See also: hasDestinationType. 1818 1819Example: matches all five of the casts in 1820 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1821but does not match the implicit conversion in 1822 long ell = 42; 1823</pre></td></tr> 1824 1825 1826<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> 1827<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1828 1829Example matches x() 1830 void f() { x(); } 1831</pre></td></tr> 1832 1833 1834<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> 1835<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1836of the sub-expression's evaluation. 1837 1838Example matches std::string() 1839 const std::string str = std::string(); 1840</pre></td></tr> 1841 1842 1843<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> 1844<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1845</pre></td></tr> 1846 1847 1848<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> 1849<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 18501.0, 1.0f, 1.0L and 1e10. 1851 1852Does not match implicit conversions such as 1853 float a = 10; 1854</pre></td></tr> 1855 1856 1857<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> 1858<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1859 1860Example matches 'for (;;) {}' 1861 for (;;) {} 1862 int i[] = {1, 2, 3}; for (auto a : i); 1863</pre></td></tr> 1864 1865 1866<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>>...</td></tr> 1867<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1868</pre></td></tr> 1869 1870 1871<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> 1872<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1873</pre></td></tr> 1874 1875 1876<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> 1877<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1878 1879Given 1880 goto FOO; 1881 FOO: bar(); 1882gotoStmt() 1883 matches 'goto FOO' 1884</pre></td></tr> 1885 1886 1887<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> 1888<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1889 1890Example matches 'if (x) {}' 1891 if (x) {} 1892</pre></td></tr> 1893 1894 1895<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1896<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1897point literals e.g.: 1i, 1.0i 1898</pre></td></tr> 1899 1900 1901<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> 1902<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1903 1904This matches many different places, including function call return value 1905eliding, as well as any type conversions. 1906</pre></td></tr> 1907 1908 1909<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> 1910<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1911 1912Given 1913 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1914implicitValueInitExpr() 1915 matches "[0].y" (implicitly) 1916</pre></td></tr> 1917 1918 1919<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> 1920<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1921 1922Given 1923 int a[] = { 1, 2 }; 1924 struct B { int x, y; }; 1925 B b = { 5, 6 }; 1926initListExpr() 1927 matches "{ 1, 2 }" and "{ 5, 6 }" 1928</pre></td></tr> 1929 1930 1931<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> 1932<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 19331, 1L, 0x1 and 1U. 1934 1935Does not match character-encoded integers such as L'a'. 1936</pre></td></tr> 1937 1938 1939<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> 1940<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1941 1942Given 1943 goto FOO; 1944 FOO: bar(); 1945labelStmt() 1946 matches 'FOO:' 1947</pre></td></tr> 1948 1949 1950<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> 1951<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1952 1953Example matches [&](){return 5;} 1954 [&](){return 5;} 1955</pre></td></tr> 1956 1957 1958<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1959<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1960 1961Example: Given 1962 struct T {void func();}; 1963 T f(); 1964 void g(T); 1965materializeTemporaryExpr() matches 'f()' in these statements 1966 T u(f()); 1967 g(f()); 1968 f().func(); 1969but does not match 1970 f(); 1971</pre></td></tr> 1972 1973 1974<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> 1975<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1976 1977Given 1978 class Y { 1979 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1980 int a; static int b; 1981 }; 1982memberExpr() 1983 matches this->x, x, y.x, a, this->b 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('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1988<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1989 1990 foo();; 1991nullStmt() 1992 matches the second ';' 1993</pre></td></tr> 1994 1995 1996<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> 1997<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1998 1999Example matches @catch 2000 @try {} 2001 @catch (...) {} 2002</pre></td></tr> 2003 2004 2005<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> 2006<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 2007 2008Example matches @finally 2009 @try {} 2010 @finally {} 2011</pre></td></tr> 2012 2013 2014<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> 2015<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 2016 2017Example: matches "a" in "init" method: 2018@implementation A { 2019 NSString *a; 2020} 2021- (void) init { 2022 a = @"hello"; 2023} 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('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 2028<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 2029 2030The innermost message send invokes the "alloc" class method on the 2031NSString class, while the outermost message send invokes the 2032"initWithString" instance method on the object returned from 2033NSString's "alloc". This matcher should match both message sends. 2034 [[NSString alloc] initWithString:@"Hello"] 2035</pre></td></tr> 2036 2037 2038<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> 2039<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 2040 2041Example matches @throw obj; 2042</pre></td></tr> 2043 2044 2045<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> 2046<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 2047 2048Example matches @try 2049 @try {} 2050 @catch (...) {} 2051</pre></td></tr> 2052 2053 2054<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> 2055<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 2056 2057Given 2058 2059 #pragma omp parallel 2060 #pragma omp parallel default(none) 2061 #pragma omp taskyield 2062 2063``ompExecutableDirective()`` matches ``omp parallel``, 2064``omp parallel default(none)`` and ``omp taskyield``. 2065</pre></td></tr> 2066 2067 2068<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> 2069<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 2070to reference another expressions and can be met 2071in BinaryConditionalOperators, for example. 2072 2073Example matches 'a' 2074 (a ?: c) + 42; 2075</pre></td></tr> 2076 2077 2078<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> 2079<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 2080 2081Example matches (foo() + 1) 2082 int foo() { return 1; } 2083 int a = (foo() + 1); 2084</pre></td></tr> 2085 2086 2087<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> 2088<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 2089ParenListExprs don't have a predefined type and are used for late parsing. 2090In the final AST, they can be met in template declarations. 2091 2092Given 2093 template<typename T> class X { 2094 void f() { 2095 X x(*this); 2096 int a = 0, b = 1; int i = (a, b); 2097 } 2098 }; 2099parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2100has a predefined type and is a ParenExpr, not a ParenListExpr. 2101</pre></td></tr> 2102 2103 2104<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> 2105<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2106 2107Example: Matches __func__ 2108 printf("%s", __func__); 2109</pre></td></tr> 2110 2111 2112<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> 2113<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2114 2115Given 2116 return 1; 2117returnStmt() 2118 matches 'return 1' 2119</pre></td></tr> 2120 2121 2122<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> 2123<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2124 2125Given 2126 { ++a; } 2127stmt() 2128 matches both the compound statement '{ ++a; }' and '++a'. 2129</pre></td></tr> 2130 2131 2132<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> 2133<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2134 2135Example match: ({ int X = 4; X; }) 2136 int C = ({ int X = 4; X; }); 2137</pre></td></tr> 2138 2139 2140<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> 2141<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2142 2143Example matches "abcd", L"abcd" 2144 char *s = "abcd"; 2145 wchar_t *ws = L"abcd"; 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('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 2150<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2151 2152Given 2153 template <int N> 2154 struct A { static const int n = N; }; 2155 struct B : public A<42> {}; 2156substNonTypeTemplateParmExpr() 2157 matches "N" in the right-hand side of "static const int n = N;" 2158</pre></td></tr> 2159 2160 2161<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> 2162<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2163 2164Given 2165 switch(a) { case 42: break; default: break; } 2166switchCase() 2167 matches 'case 42:' and 'default:'. 2168</pre></td></tr> 2169 2170 2171<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> 2172<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2173 2174Given 2175 switch(a) { case 42: break; default: break; } 2176switchStmt() 2177 matches 'switch(a)'. 2178</pre></td></tr> 2179 2180 2181<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> 2182<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2183 2184Given 2185 Foo x = bar; 2186 int y = sizeof(x) + alignof(x); 2187unaryExprOrTypeTraitExpr() 2188 matches sizeof(x) and alignof(x) 2189</pre></td></tr> 2190 2191 2192<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> 2193<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2194 2195Example matches !a 2196 !a || b 2197</pre></td></tr> 2198 2199 2200<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> 2201<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2202but could not be resolved to a specific declaration. 2203 2204Given 2205 template<typename T> 2206 T foo() { T a; return a; } 2207 template<typename T> 2208 void bar() { 2209 foo<T>(); 2210 } 2211unresolvedLookupExpr() 2212 matches foo<T>() </pre></td></tr> 2213 2214 2215<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> 2216<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2217 2218Given 2219 struct X { 2220 template <class T> void f(); 2221 void g(); 2222 }; 2223 template <class T> void h() { X x; x.f<T>(); x.g(); } 2224unresolvedMemberExpr() 2225 matches x.f<T> 2226</pre></td></tr> 2227 2228 2229<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> 2230<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2231 2232Example match: "foo"_suffix 2233</pre></td></tr> 2234 2235 2236<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> 2237<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2238 2239Given 2240 while (true) {} 2241whileStmt() 2242 matches 'while (true) {}'. 2243</pre></td></tr> 2244 2245 2246<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> 2247<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2248 2249Given 2250 template <typename T> struct C {}; 2251 C<int> c; 2252templateArgumentLoc() 2253 matches 'int' in C<int>. 2254</pre></td></tr> 2255 2256 2257<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> 2258<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2259 2260Given 2261 template <typename T> struct C {}; 2262 C<int> c; 2263templateArgument() 2264 matches 'int' in C<int>. 2265</pre></td></tr> 2266 2267 2268<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> 2269<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2270 2271Given 2272 template <typename T> class X { }; 2273 X<int> xi; 2274templateName() 2275 matches 'X' in X<int>. 2276</pre></td></tr> 2277 2278 2279<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>>...</td></tr> 2280<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s. 2281 2282Given 2283 struct s {}; 2284 struct s ss; 2285elaboratedTypeLoc() 2286 matches the `TypeLoc` of the variable declaration of `ss`. 2287</pre></td></tr> 2288 2289 2290<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>>...</td></tr> 2291<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s. 2292 2293Given 2294 int* x; 2295pointerTypeLoc() 2296 matches `int*`. 2297</pre></td></tr> 2298 2299 2300<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('qualifiedTypeLoc0')"><a name="qualifiedTypeLoc0Anchor">qualifiedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>>...</td></tr> 2301<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST. 2302 2303Given 2304 const int x = 0; 2305qualifiedTypeLoc() 2306 matches `const int`. 2307</pre></td></tr> 2308 2309 2310<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>>...</td></tr> 2311<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s. 2312 2313Given 2314 int x = 3; 2315 int& l = x; 2316 int&& r = 3; 2317referenceTypeLoc() 2318 matches `int&` and `int&&`. 2319</pre></td></tr> 2320 2321 2322<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>>...</td></tr> 2323<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s. 2324 2325Given 2326 template <typename T> class C {}; 2327 C<char> var; 2328varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc()))) 2329 matches `C<char> var`. 2330</pre></td></tr> 2331 2332 2333<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> 2334<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2335</pre></td></tr> 2336 2337 2338<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> 2339<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2340 2341Given 2342 int a[] = { 2, 3 }; 2343 int b[4]; 2344 void f() { int c[a[0]]; } 2345arrayType() 2346 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2347</pre></td></tr> 2348 2349 2350<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 2351<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2352 2353Given 2354 _Atomic(int) i; 2355atomicType() 2356 matches "_Atomic(int) i" 2357</pre></td></tr> 2358 2359 2360<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 2361<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2362 2363Given: 2364 auto n = 4; 2365 int v[] = { 2, 3 } 2366 for (auto i : v) { } 2367autoType() 2368 matches "auto n" and "auto i" 2369</pre></td></tr> 2370 2371 2372<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> 2373<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2374"void (^)(int)". 2375 2376The pointee is always required to be a FunctionType. 2377</pre></td></tr> 2378 2379 2380<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> 2381<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2382 2383Given 2384 struct A {}; 2385 A a; 2386 int b; 2387 float c; 2388 bool d; 2389builtinType() 2390 matches "int b", "float c" and "bool d" 2391</pre></td></tr> 2392 2393 2394<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> 2395<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2396 2397Given 2398 _Complex float f; 2399complexType() 2400 matches "_Complex float f" 2401</pre></td></tr> 2402 2403 2404<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 2405<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2406 2407Given 2408 void() { 2409 int a[2]; 2410 int b[] = { 2, 3 }; 2411 int c[b[0]]; 2412 } 2413constantArrayType() 2414 matches "int a[2]" 2415</pre></td></tr> 2416 2417 2418<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> 2419<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2420Example matches i[] in declaration of f. 2421 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2422Example matches i[1]. 2423 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2424 void f(int i[]) { 2425 i[1] = 0; 2426 } 2427</pre></td></tr> 2428 2429 2430<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> 2431<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2432 2433Given: 2434 short i = 1; 2435 int j = 42; 2436 decltype(i + j) result = i + j; 2437decltypeType() 2438 matches "decltype(i + j)" 2439</pre></td></tr> 2440 2441 2442<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> 2443<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2444template types. 2445 2446Given 2447 template <typename T> 2448 class C { public: C(T); }; 2449 2450 C c(123); 2451deducedTemplateSpecializationType() matches the type in the declaration 2452of the variable c. 2453</pre></td></tr> 2454 2455 2456<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> 2457<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2458 2459Given 2460 template<typename T, int Size> 2461 class array { 2462 T data[Size]; 2463 }; 2464dependentSizedArrayType 2465 matches "T data[Size]" 2466</pre></td></tr> 2467 2468 2469<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> 2470<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2471qualified name. 2472 2473Given 2474 namespace N { 2475 namespace M { 2476 class D {}; 2477 } 2478 } 2479 class C {}; 2480 2481 class C c; 2482 N::M::D d; 2483 2484elaboratedType() matches the type of the variable declarations of both 2485c and d. 2486</pre></td></tr> 2487 2488 2489<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> 2490<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2491 2492Given 2493 enum C { Green }; 2494 enum class S { Red }; 2495 2496 C c; 2497 S s; 2498 2499enumType() matches the type of the variable declarations of both c and 2500s. 2501</pre></td></tr> 2502 2503 2504<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> 2505<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2506 2507Given 2508 int (*f)(int); 2509 void g(); 2510functionProtoType() 2511 matches "int (*f)(int)" and the type of "g" in C++ mode. 2512 In C mode, "g" is not matched because it does not contain a prototype. 2513</pre></td></tr> 2514 2515 2516<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> 2517<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2518 2519Given 2520 int (*f)(int); 2521 void g(); 2522functionType() 2523 matches "int (*f)(int)" and the type of "g". 2524</pre></td></tr> 2525 2526 2527<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> 2528<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2529 2530Given 2531 int a[] = { 2, 3 }; 2532 int b[42]; 2533 void f(int c[]) { int d[a[0]]; }; 2534incompleteArrayType() 2535 matches "int a[]" and "int c[]" 2536</pre></td></tr> 2537 2538 2539<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> 2540<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2541 2542Example matches S s, but not S<T> s. 2543 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2544 template <typename T> struct S { 2545 void f(S s); 2546 void g(S<T> s); 2547 }; 2548</pre></td></tr> 2549 2550 2551<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> 2552<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2553 2554Given: 2555 int *a; 2556 int &b = *a; 2557 int &&c = 1; 2558 auto &d = b; 2559 auto &&e = c; 2560 auto &&f = 2; 2561 int g = 5; 2562 2563lValueReferenceType() matches the types of b, d, and e. e is 2564matched since the type is deduced as int& by reference collapsing rules. 2565</pre></td></tr> 2566 2567 2568<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 2569<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2570Given 2571 struct A { int i; } 2572 A::* ptr = A::i; 2573memberPointerType() 2574 matches "A::* ptr" 2575</pre></td></tr> 2576 2577 2578<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> 2579<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2580a pointer type, despite being syntactically similar. 2581 2582Given 2583 int *a; 2584 2585 @interface Foo 2586 @end 2587 Foo *f; 2588pointerType() 2589 matches "Foo *f", but does not match "int *a". 2590</pre></td></tr> 2591 2592 2593<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> 2594<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2595 2596Given 2597 int (*ptr_to_array)[4]; 2598 int *array_of_ptrs[4]; 2599 2600varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2601array_of_ptrs. 2602</pre></td></tr> 2603 2604 2605<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> 2606<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2607types. 2608 2609Given 2610 int *a; 2611 int &b = *a; 2612 int c = 5; 2613 2614 @interface Foo 2615 @end 2616 Foo *f; 2617pointerType() 2618 matches "int *a", but does not match "Foo *f". 2619</pre></td></tr> 2620 2621 2622<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> 2623<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2624 2625Given: 2626 int *a; 2627 int &b = *a; 2628 int &&c = 1; 2629 auto &d = b; 2630 auto &&e = c; 2631 auto &&f = 2; 2632 int g = 5; 2633 2634rValueReferenceType() matches the types of c and f. e is not 2635matched as it is deduced to int& by reference collapsing rules. 2636</pre></td></tr> 2637 2638 2639<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> 2640<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2641 2642Given 2643 class C {}; 2644 struct S {}; 2645 2646 C c; 2647 S s; 2648 2649recordType() matches the type of the variable declarations of both c 2650and s. 2651</pre></td></tr> 2652 2653 2654<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> 2655<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2656 2657Given 2658 int *a; 2659 int &b = *a; 2660 int &&c = 1; 2661 auto &d = b; 2662 auto &&e = c; 2663 auto &&f = 2; 2664 int g = 5; 2665 2666referenceType() matches the types of b, c, d, e, and f. 2667</pre></td></tr> 2668 2669 2670<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> 2671<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2672template type parameter. 2673 2674Given 2675 template <typename T> 2676 void F(T t) { 2677 int i = 1 + t; 2678 } 2679 2680substTemplateTypeParmType() matches the type of 't' but not '1' 2681</pre></td></tr> 2682 2683 2684<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> 2685<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2686 2687Given 2688 enum E {}; 2689 class C {}; 2690 2691 E e; 2692 C c; 2693 2694tagType() matches the type of the variable declarations of both e 2695and c. 2696</pre></td></tr> 2697 2698 2699<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> 2700<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2701 2702Given 2703 template <typename T> 2704 class C { }; 2705 2706 template class C<int>; // A 2707 C<char> var; // B 2708 2709templateSpecializationType() matches the type of the explicit 2710instantiation in A and the type of the variable declaration in B. 2711</pre></td></tr> 2712 2713 2714<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> 2715<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2716 2717Example matches T, but not int. 2718 (matcher = templateTypeParmType()) 2719 template <typename T> void f(int i); 2720</pre></td></tr> 2721 2722 2723<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> 2724<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2725</pre></td></tr> 2726 2727 2728<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> 2729<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2730 2731Given 2732 typedef int X; 2733typedefType() 2734 matches "typedef int X" 2735</pre></td></tr> 2736 2737 2738<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> 2739<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2740 2741Given: 2742 typedef __underlying_type(T) type; 2743unaryTransformType() 2744 matches "__underlying_type(T)" 2745</pre></td></tr> 2746 2747 2748<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('usingType0')"><a name="usingType0Anchor">usingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>>...</td></tr> 2749<tr><td colspan="4" class="doc" id="usingType0"><pre>Matches types specified through a using declaration. 2750 2751Given 2752 namespace a { struct S {}; } 2753 using a::S; 2754 S s; 2755 2756usingType() matches the type of the variable declaration of s. 2757</pre></td></tr> 2758 2759 2760<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> 2761<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2762integer-constant-expression. 2763 2764Given 2765 void f() { 2766 int a[] = { 2, 3 } 2767 int b[42]; 2768 int c[a[0]]; 2769 } 2770variableArrayType() 2771 matches "int c[a[0]]" 2772</pre></td></tr> 2773 2774<!--END_DECL_MATCHERS --> 2775</table> 2776 2777<!-- ======================================================================= --> 2778<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2779<!-- ======================================================================= --> 2780 2781<p>Narrowing matchers match certain attributes on the current node, thus 2782narrowing down the set of nodes of the current type to match on.</p> 2783 2784<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2785which allow users to create more powerful match expressions.</p> 2786 2787<table> 2788<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2789<!-- START_NARROWING_MATCHERS --> 2790 2791<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2792<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2793 2794Usable as: Any Matcher 2795</pre></td></tr> 2796 2797 2798<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2799<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2800 2801Usable as: Any Matcher 2802</pre></td></tr> 2803 2804 2805<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2806<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2807 2808Useful when another matcher requires a child matcher, but there's no 2809additional constraint. This will often be used with an explicit conversion 2810to an internal::Matcher<> type such as TypeMatcher. 2811 2812Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2813"int* p" and "void f()" in 2814 int* p; 2815 void f(); 2816 2817Usable as: Any Matcher 2818</pre></td></tr> 2819 2820 2821<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2822<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2823 2824Given 2825 if (true); 2826 for (; true; ); 2827with the matcher 2828 mapAnyOf(ifStmt, forStmt).with( 2829 hasCondition(cxxBoolLiteralExpr(equals(true))) 2830 ).bind("trueCond") 2831matches the if and the for. It is equivalent to: 2832 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2833 anyOf( 2834 ifStmt(trueCond).bind("trueCond"), 2835 forStmt(trueCond).bind("trueCond") 2836 ); 2837 2838The with() chain-call accepts zero or more matchers which are combined 2839as-if with allOf() in each of the node matchers. 2840Usable as: Any Matcher 2841</pre></td></tr> 2842 2843 2844<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2845<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2846 2847Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2848 class X {}; 2849 class Y {}; 2850 2851Usable as: Any Matcher 2852</pre></td></tr> 2853 2854 2855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>></td><td class="name" onclick="toggle('isImplicit1')"><a name="isImplicit1Anchor">isImplicit</a></td><td></td></tr> 2856<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 2857implicit default/copy constructors). 2858</pre></td></tr> 2859 2860 2861<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> 2862<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2863specified names. 2864 2865 hasAnyOperatorName("+", "-") 2866 Is equivalent to 2867 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2868</pre></td></tr> 2869 2870 2871<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> 2872<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2873unary). 2874 2875Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2876 !(a || b) 2877</pre></td></tr> 2878 2879 2880<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> 2881<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2882 2883Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2884 if (a == b) 2885 a += b; 2886 2887Example 2: matches s1 = s2 2888 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2889 struct S { S& operator=(const S&); }; 2890 void x() { S s1, s2; s1 = s2; } 2891</pre></td></tr> 2892 2893 2894<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> 2895<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2896 2897Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2898 if (a == b) 2899 a += b; 2900 2901Example 2: matches s1 < s2 2902 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2903 struct S { bool operator<(const S& other); }; 2904 void x(S s1, S s2) { bool b1 = s1 < s2; } 2905</pre></td></tr> 2906 2907 2908<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> 2909<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2910inheritance. 2911 2912Examples: 2913 class C { 2914 public: int a; 2915 protected: int b; 2916 private: int c; // fieldDecl(isPrivate()) matches 'c' 2917 }; 2918 2919 struct Base {}; 2920 struct Derived1 : private Base {}; // matches 'Base' 2921 class Derived2 : Base {}; // matches 'Base' 2922</pre></td></tr> 2923 2924 2925<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> 2926<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2927protected inheritance. 2928 2929Examples: 2930 class C { 2931 public: int a; 2932 protected: int b; // fieldDecl(isProtected()) matches 'b' 2933 private: int c; 2934 }; 2935 2936 class Base {}; 2937 class Derived : protected Base {}; // matches 'Base' 2938</pre></td></tr> 2939 2940 2941<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> 2942<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2943inheritance. 2944 2945Examples: 2946 class C { 2947 public: int a; // fieldDecl(isPublic()) matches 'a' 2948 protected: int b; 2949 private: int c; 2950 }; 2951 2952 class Base {}; 2953 class Derived1 : public Base {}; // matches 'Base' 2954 struct Derived2 : Base {}; // matches 'Base' 2955</pre></td></tr> 2956 2957 2958<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> 2959<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2960virtual inheritance. 2961 2962Example: 2963 class A { 2964 public: 2965 virtual void x(); // matches x 2966 }; 2967 2968Example: 2969 class Base {}; 2970 class DirectlyDerived : virtual Base {}; // matches Base 2971 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2972 2973Usable 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>> 2974</pre></td></tr> 2975 2976 2977<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> 2978<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2979 2980 2981<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> 2982<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2983 2984Given 2985 f('false, 3.14, 42); 2986characterLiteral(equals(0)) 2987 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2988 match false 2989floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2990 match 3.14 2991integerLiteral(equals(42)) 2992 matches 42 2993 2994Note that you cannot directly match a negative numeric literal because the 2995minus sign is not part of the literal: It is a unary operator whose operand 2996is the positive numeric literal. Instead, you must use a unaryOperator() 2997matcher to match the minus sign: 2998 2999unaryOperator(hasOperatorName("-"), 3000 hasUnaryOperand(integerLiteral(equals(13)))) 3001 3002Usable 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>>, 3003 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>> 3004</pre></td></tr> 3005 3006 3007<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> 3008<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 3009 3010 3011<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> 3012<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 3013 3014 3015<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> 3016<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 3017 3018Given 3019 try { 3020 // ... 3021 } catch (int) { 3022 // ... 3023 } catch (...) { 3024 // ... 3025 } 3026cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 3027</pre></td></tr> 3028 3029 3030<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> 3031<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 3032a specific number of arguments (including absent default arguments). 3033 3034Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3035 void f(int x, int y); 3036 f(0, 0); 3037</pre></td></tr> 3038 3039 3040<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> 3041<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 3042</pre></td></tr> 3043 3044 3045<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> 3046<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 3047zero initialization. 3048 3049Given 3050void foo() { 3051 struct point { double x; double y; }; 3052 point pt[2] = { { 1.0, 2.0 } }; 3053} 3054initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 3055will match the implicit array filler for pt[1]. 3056</pre></td></tr> 3057 3058 3059<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> 3060<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 3061 3062Given 3063 struct S { 3064 S(); // #1 3065 S(const S &); // #2 3066 S(S &&); // #3 3067 }; 3068cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 3069</pre></td></tr> 3070 3071 3072<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> 3073<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 3074 3075Given 3076 struct S { 3077 S(); // #1 3078 S(const S &); // #2 3079 S(S &&); // #3 3080 }; 3081cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 3082</pre></td></tr> 3083 3084 3085<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> 3086<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 3087 3088Given 3089 struct S { 3090 S(); // #1 3091 S(int) {} // #2 3092 S(S &&) : S() {} // #3 3093 }; 3094 S::S() : S(0) {} // #4 3095cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 3096#1 or #2. 3097</pre></td></tr> 3098 3099 3100<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> 3101<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 3102that have an explicit specifier if this explicit specifier is resolved to 3103true. 3104 3105Given 3106 template<bool b> 3107 struct S { 3108 S(int); // #1 3109 explicit S(double); // #2 3110 operator int(); // #3 3111 explicit operator bool(); // #4 3112 explicit(false) S(bool) // # 7 3113 explicit(true) S(char) // # 8 3114 explicit(b) S(S) // # 9 3115 }; 3116 S(int) -> S<true> // #5 3117 explicit S(double) -> S<false> // #6 3118cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3119cxxConversionDecl(isExplicit()) will match #4, but not #3. 3120cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3121</pre></td></tr> 3122 3123 3124<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isInheritingConstructor0')"><a name="isInheritingConstructor0Anchor">isInheritingConstructor</a></td><td></td></tr> 3125<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr> 3126 3127 3128<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> 3129<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3130 3131Given 3132 struct S { 3133 S(); // #1 3134 S(const S &); // #2 3135 S(S &&); // #3 3136 }; 3137cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3138</pre></td></tr> 3139 3140 3141<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> 3142<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3143that have an explicit specifier if this explicit specifier is resolved to 3144true. 3145 3146Given 3147 template<bool b> 3148 struct S { 3149 S(int); // #1 3150 explicit S(double); // #2 3151 operator int(); // #3 3152 explicit operator bool(); // #4 3153 explicit(false) S(bool) // # 7 3154 explicit(true) S(char) // # 8 3155 explicit(b) S(S) // # 9 3156 }; 3157 S(int) -> S<true> // #5 3158 explicit S(double) -> S<false> // #6 3159cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3160cxxConversionDecl(isExplicit()) will match #4, but not #3. 3161cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3162</pre></td></tr> 3163 3164 3165<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> 3166<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3167opposed to a member. 3168 3169Given 3170 struct B {}; 3171 struct D : B { 3172 int I; 3173 D(int i) : I(i) {} 3174 }; 3175 struct E : B { 3176 E() : B() {} 3177 }; 3178cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3179 will match E(), but not match D(int). 3180</pre></td></tr> 3181 3182 3183<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> 3184<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3185opposed to a base. 3186 3187Given 3188 struct B {}; 3189 struct D : B { 3190 int I; 3191 D(int i) : I(i) {} 3192 }; 3193 struct E : B { 3194 E() : B() {} 3195 }; 3196cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3197 will match D(int), but not match E(). 3198</pre></td></tr> 3199 3200 3201<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> 3202<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3203code (as opposed to implicitly added by the compiler). 3204 3205Given 3206 struct Foo { 3207 Foo() { } 3208 Foo(int) : foo_("A") { } 3209 string foo_; 3210 }; 3211cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3212 will match Foo(int), but not Foo() 3213</pre></td></tr> 3214 3215 3216<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> 3217<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3218that have an explicit specifier if this explicit specifier is resolved to 3219true. 3220 3221Given 3222 template<bool b> 3223 struct S { 3224 S(int); // #1 3225 explicit S(double); // #2 3226 operator int(); // #3 3227 explicit operator bool(); // #4 3228 explicit(false) S(bool) // # 7 3229 explicit(true) S(char) // # 8 3230 explicit(b) S(S) // # 9 3231 }; 3232 S(int) -> S<true> // #5 3233 explicit S(double) -> S<false> // #6 3234cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3235cxxConversionDecl(isExplicit()) will match #4, but not #3. 3236cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3237</pre></td></tr> 3238 3239 3240<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> 3241<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3242 3243In template declarations, dependent members are not resolved and so can 3244not be matched to particular named declarations. 3245 3246This matcher allows to match on the known name of members. 3247 3248Given 3249 template <typename T> 3250 struct S { 3251 void mem(); 3252 }; 3253 template <typename T> 3254 void x() { 3255 S<T> s; 3256 s.mem(); 3257 } 3258cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3259</pre></td></tr> 3260 3261 3262<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> 3263<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3264to '.'. 3265 3266Member calls on the implicit this pointer match as called with '->'. 3267 3268Given 3269 class Y { 3270 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3271 template <class T> void f() { this->f<T>(); f<T>(); } 3272 int a; 3273 static int b; 3274 }; 3275 template <class T> 3276 class Z { 3277 void x() { this->m; } 3278 }; 3279memberExpr(isArrow()) 3280 matches this->x, x, y.x, a, this->b 3281cxxDependentScopeMemberExpr(isArrow()) 3282 matches this->m 3283unresolvedMemberExpr(isArrow()) 3284 matches this->f<T>, f<T> 3285</pre></td></tr> 3286 3287 3288<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> 3289<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3290node 3291 3292In template declarations, dependent members are not resolved and so can 3293not be matched to particular named declarations. 3294 3295This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3296and CXXMethodDecl nodes. 3297 3298Given 3299 template <typename T> 3300 struct S { 3301 void mem(); 3302 }; 3303 template <typename T> 3304 void x() { 3305 S<T> s; 3306 s.mem(); 3307 } 3308The matcher 3309@code 3310cxxDependentScopeMemberExpr( 3311 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3312 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3313 cxxMethodDecl(hasName("mem")).bind("templMem") 3314 ))))) 3315 )))), 3316 memberHasSameNameAsBoundNode("templMem") 3317 ) 3318@endcode 3319first matches and binds the @c mem member of the @c S template, then 3320compares its name to the usage in @c s.mem() in the @c x function template 3321</pre></td></tr> 3322 3323 3324<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> 3325<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3326 3327Given 3328struct A { 3329 void foo() const; 3330 void bar(); 3331}; 3332 3333cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3334</pre></td></tr> 3335 3336 3337<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> 3338<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3339operator. 3340 3341Given 3342struct A { 3343 A &operator=(const A &); 3344 A &operator=(A &&); 3345}; 3346 3347cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3348the second one. 3349</pre></td></tr> 3350 3351 3352<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> 3353<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3354 3355Given: 3356 class A final {}; 3357 3358 struct B { 3359 virtual void f(); 3360 }; 3361 3362 struct C : B { 3363 void f() final; 3364 }; 3365matches A and C::f, but not B, C, or B::f 3366</pre></td></tr> 3367 3368 3369<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> 3370<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3371operator. 3372 3373Given 3374struct A { 3375 A &operator=(const A &); 3376 A &operator=(A &&); 3377}; 3378 3379cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3380the first one. 3381</pre></td></tr> 3382 3383 3384<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> 3385<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3386 3387Given 3388 class A { 3389 public: 3390 virtual void x(); 3391 }; 3392 class B : public A { 3393 public: 3394 virtual void x(); 3395 }; 3396 matches B::x 3397</pre></td></tr> 3398 3399 3400<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> 3401<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3402 3403Given 3404 class A { 3405 public: 3406 virtual void x() = 0; 3407 }; 3408 matches A::x 3409</pre></td></tr> 3410 3411 3412<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> 3413<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3414 3415Given 3416 struct S { 3417 S(); // #1 3418 S(const S &) = default; // #2 3419 S(S &&) = delete; // #3 3420 }; 3421cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3422</pre></td></tr> 3423 3424 3425<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> 3426<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3427virtual inheritance. 3428 3429Example: 3430 class A { 3431 public: 3432 virtual void x(); // matches x 3433 }; 3434 3435Example: 3436 class Base {}; 3437 class DirectlyDerived : virtual Base {}; // matches Base 3438 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3439 3440Usable 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>> 3441</pre></td></tr> 3442 3443 3444<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> 3445<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3446 3447Given 3448 class A { 3449 public: 3450 virtual void x(); 3451 }; 3452 class B : public A { 3453 public: 3454 void x(); 3455 }; 3456 matches A::x but not B::x 3457</pre></td></tr> 3458 3459 3460<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> 3461<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3462 3463Given: 3464 MyClass *p1 = new MyClass[10]; 3465cxxNewExpr(isArray()) 3466 matches the expression 'new MyClass[10]'. 3467</pre></td></tr> 3468 3469 3470<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> 3471<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3472specified names. 3473 3474 hasAnyOperatorName("+", "-") 3475 Is equivalent to 3476 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3477</pre></td></tr> 3478 3479 3480<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> 3481<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3482 3483Matches overloaded operator names specified in strings without the 3484"operator" prefix: e.g. "<<". 3485 3486 hasAnyOverloadedOperatorName("+", "-") 3487Is equivalent to 3488 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3489</pre></td></tr> 3490 3491 3492<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> 3493<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3494unary). 3495 3496Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3497 !(a || b) 3498</pre></td></tr> 3499 3500 3501<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> 3502<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3503 3504Matches overloaded operator names specified in strings without the 3505"operator" prefix: e.g. "<<". 3506 3507Given: 3508 class A { int operator*(); }; 3509 const A &operator<<(const A &a, const A &b); 3510 A a; 3511 a << a; // <-- This matches 3512 3513cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3514specified line and 3515cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3516matches the declaration of A. 3517 3518Usable 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>> 3519</pre></td></tr> 3520 3521 3522<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> 3523<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3524 3525Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3526 if (a == b) 3527 a += b; 3528 3529Example 2: matches s1 = s2 3530 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3531 struct S { S& operator=(const S&); }; 3532 void x() { S s1, s2; s1 = s2; } 3533</pre></td></tr> 3534 3535 3536<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> 3537<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3538 3539Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3540 if (a == b) 3541 a += b; 3542 3543Example 2: matches s1 < s2 3544 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3545 struct S { bool operator<(const S& other); }; 3546 void x(S s1, S s2) { bool b1 = s1 < s2; } 3547</pre></td></tr> 3548 3549 3550<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> 3551<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3552 3553Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3554class x {}; 3555class y; 3556</pre></td></tr> 3557 3558 3559<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> 3560<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3561</pre></td></tr> 3562 3563 3564<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> 3565<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3566</pre></td></tr> 3567 3568 3569<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> 3570<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3571static member variable template instantiations. 3572 3573Given 3574 template<typename T> void A(T t) { } 3575 template<> void A(int N) { } 3576functionDecl(isExplicitTemplateSpecialization()) 3577 matches the specialization A<int>(). 3578 3579Usable 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>> 3580</pre></td></tr> 3581 3582 3583<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> 3584<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3585 3586Given: 3587 class A final {}; 3588 3589 struct B { 3590 virtual void f(); 3591 }; 3592 3593 struct C : B { 3594 void f() final; 3595 }; 3596matches A and C::f, but not B, C, or B::f 3597</pre></td></tr> 3598 3599 3600<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> 3601<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3602 3603Given: 3604 auto x = []{}; 3605 3606cxxRecordDecl(isLambda()) matches the implicit class declaration of 3607decltype(x) 3608</pre></td></tr> 3609 3610 3611<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> 3612<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3613isSameOrDerivedFrom(hasName(...)). 3614</pre></td></tr> 3615 3616 3617<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> 3618<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3619member variable template instantiations. 3620 3621Given 3622 template <typename T> class X {}; class A {}; X<A> x; 3623or 3624 template <typename T> class X {}; class A {}; template class X<A>; 3625or 3626 template <typename T> class X {}; class A {}; extern template class X<A>; 3627cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3628 matches the template instantiation of X<A>. 3629 3630But given 3631 template <typename T> class X {}; class A {}; 3632 template <> class X<A> {}; X<A> x; 3633cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3634 does not match, as X<A> is an explicit template specialization. 3635 3636Usable 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>> 3637</pre></td></tr> 3638 3639 3640<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> 3641<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3642specified names. 3643 3644 hasAnyOperatorName("+", "-") 3645 Is equivalent to 3646 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3647</pre></td></tr> 3648 3649 3650<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> 3651<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3652unary). 3653 3654Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3655 !(a || b) 3656</pre></td></tr> 3657 3658 3659<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> 3660<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3661 3662Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3663 if (a == b) 3664 a += b; 3665 3666Example 2: matches s1 = s2 3667 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3668 struct S { S& operator=(const S&); }; 3669 void x() { S s1, s2; s1 = s2; } 3670</pre></td></tr> 3671 3672 3673<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> 3674<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3675 3676Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3677 if (a == b) 3678 a += b; 3679 3680Example 2: matches s1 < s2 3681 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3682 struct S { bool operator<(const S& other); }; 3683 void x(S s1, S s2) { bool b1 = s1 < s2; } 3684</pre></td></tr> 3685 3686 3687<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> 3688<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3689a specific number of arguments (including absent default arguments). 3690 3691Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3692 void f(int x, int y); 3693 f(0, 0); 3694</pre></td></tr> 3695 3696 3697<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> 3698<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3699a specific number of arguments (including absent default arguments). 3700 3701Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3702 void f(int x, int y); 3703 f(0, 0); 3704</pre></td></tr> 3705 3706 3707<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> 3708<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3709 3710Example matches y(x) but not y(42) or NS::y(x). 3711 namespace NS { 3712 struct X {}; 3713 void y(X); 3714 } 3715 3716 void y(...); 3717 3718 void test() { 3719 NS::X x; 3720 y(x); // Matches 3721 NS::y(x); // Doesn't match 3722 y(42); // Doesn't match 3723 using NS::y; 3724 y(x); // Found by both unqualified lookup and ADL, doesn't match 3725 } 3726</pre></td></tr> 3727 3728 3729<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> 3730<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3731 3732Example: matches the implicit cast around 0 3733(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3734 int *p = 0; 3735 3736If the matcher is use from clang-query, CastKind parameter 3737should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3738</pre></td></tr> 3739 3740 3741<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> 3742<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3743 3744 3745<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> 3746<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3747 3748Given 3749 f('false, 3.14, 42); 3750characterLiteral(equals(0)) 3751 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3752 match false 3753floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3754 match 3.14 3755integerLiteral(equals(42)) 3756 matches 42 3757 3758Note that you cannot directly match a negative numeric literal because the 3759minus sign is not part of the literal: It is a unary operator whose operand 3760is the positive numeric literal. Instead, you must use a unaryOperator() 3761matcher to match the minus sign: 3762 3763unaryOperator(hasOperatorName("-"), 3764 hasUnaryOperand(integerLiteral(equals(13)))) 3765 3766Usable 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>>, 3767 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>> 3768</pre></td></tr> 3769 3770 3771<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> 3772<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3773 3774 3775<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> 3776<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3777 3778 3779<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> 3780<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3781 3782Given 3783 template<typename T> struct C {}; 3784 C<int> c; 3785classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3786 matches C<int>. 3787</pre></td></tr> 3788 3789 3790<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> 3791<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3792child statements. 3793 3794Example: Given 3795 { for (;;) {} } 3796compoundStmt(statementCountIs(0))) 3797 matches '{}' 3798 but does not match the outer compound statement. 3799</pre></td></tr> 3800 3801 3802<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> 3803<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3804 3805Given 3806 int a[42]; 3807 int b[2 * 21]; 3808 int c[41], d[43]; 3809 char *s = "abcd"; 3810 wchar_t *ws = L"abcd"; 3811 char *w = "a"; 3812constantArrayType(hasSize(42)) 3813 matches "int a[42]" and "int b[2 * 21]" 3814stringLiteral(hasSize(4)) 3815 matches "abcd", L"abcd" 3816</pre></td></tr> 3817 3818 3819<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> 3820<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3821declarations. 3822 3823Example: Given 3824 int a, b; 3825 int c; 3826 int d = 2, e; 3827declCountIs(2) 3828 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3829</pre></td></tr> 3830 3831 3832<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> 3833<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3834 3835Matches a node if it equals the node previously bound to ID. 3836 3837Given 3838 class X { int a; int b; }; 3839cxxRecordDecl( 3840 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3841 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3842 matches the class X, as a and b have the same type. 3843 3844Note that when multiple matches are involved via forEach* matchers, 3845equalsBoundNodes acts as a filter. 3846For example: 3847compoundStmt( 3848 forEachDescendant(varDecl().bind("d")), 3849 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3850will trigger a match for each combination of variable declaration 3851and reference to that variable declaration within a compound statement. 3852</pre></td></tr> 3853 3854 3855<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> 3856<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3857 3858Decl has pointer identity in the AST. 3859</pre></td></tr> 3860 3861 3862<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> 3863<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3864 3865Given 3866 __attribute__((device)) void f() { ... } 3867decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3868f. If the matcher is used from clang-query, attr::Kind parameter should be 3869passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3870</pre></td></tr> 3871 3872 3873<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> 3874<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3875Does not match if only part of the statement is expanded from that macro or 3876if different parts of the statement are expanded from different 3877appearances of the macro. 3878</pre></td></tr> 3879 3880 3881<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> 3882<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3883partially matching a given regex. 3884 3885Example matches Y but not X 3886 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3887 #include "ASTMatcher.h" 3888 class X {}; 3889ASTMatcher.h: 3890 class Y {}; 3891 3892Usable 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>> 3893 3894If the matcher is used in clang-query, RegexFlags parameter 3895should be passed as a quoted string. e.g: "NoFlags". 3896Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3897</pre></td></tr> 3898 3899 3900<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> 3901<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3902 3903Example matches X but not Y 3904 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3905 #include <Y.h> 3906 class X {}; 3907Y.h: 3908 class Y {}; 3909 3910Usable 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>> 3911</pre></td></tr> 3912 3913 3914<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> 3915<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3916 3917Example matches Y but not X 3918 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3919 #include <SystemHeader.h> 3920 class X {}; 3921SystemHeader.h: 3922 class Y {}; 3923 3924Usable 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>> 3925</pre></td></tr> 3926 3927 3928<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> 3929<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 3930implicit default/copy constructors). 3931</pre></td></tr> 3932 3933 3934<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> 3935<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3936 3937Given 3938 class vector {}; 3939 namespace foo { 3940 class vector {}; 3941 namespace std { 3942 class vector {}; 3943 } 3944 } 3945 namespace std { 3946 inline namespace __1 { 3947 class vector {}; // #1 3948 namespace experimental { 3949 class vector {}; 3950 } 3951 } 3952 } 3953cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3954</pre></td></tr> 3955 3956 3957<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> 3958<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3959template instantiations. 3960 3961Given 3962 template<typename T> void A(T t) { T i; } 3963 A(0); 3964 A(0U); 3965functionDecl(isInstantiated()) 3966 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3967</pre></td></tr> 3968 3969 3970<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> 3971<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3972inheritance. 3973 3974Examples: 3975 class C { 3976 public: int a; 3977 protected: int b; 3978 private: int c; // fieldDecl(isPrivate()) matches 'c' 3979 }; 3980 3981 struct Base {}; 3982 struct Derived1 : private Base {}; // matches 'Base' 3983 class Derived2 : Base {}; // matches 'Base' 3984</pre></td></tr> 3985 3986 3987<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> 3988<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3989protected inheritance. 3990 3991Examples: 3992 class C { 3993 public: int a; 3994 protected: int b; // fieldDecl(isProtected()) matches 'b' 3995 private: int c; 3996 }; 3997 3998 class Base {}; 3999 class Derived : protected Base {}; // matches 'Base' 4000</pre></td></tr> 4001 4002 4003<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> 4004<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 4005inheritance. 4006 4007Examples: 4008 class C { 4009 public: int a; // fieldDecl(isPublic()) matches 'a' 4010 protected: int b; 4011 private: int c; 4012 }; 4013 4014 class Base {}; 4015 class Derived1 : public Base {}; // matches 'Base' 4016 struct Derived2 : Base {}; // matches 'Base' 4017</pre></td></tr> 4018 4019 4020<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> 4021<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 4022a specific number of designators. 4023 4024Example: Given 4025 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 4026 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 4027designatorCountIs(2) 4028 matches '{ [2].y = 1.0, [0].x = 1.0 }', 4029 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 4030</pre></td></tr> 4031 4032 4033<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> 4034<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 4035 4036Example matches Y (matcher = enumDecl(isScoped())) 4037enum X {}; 4038enum class Y {}; 4039</pre></td></tr> 4040 4041 4042<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> 4043<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 4044neither type- nor value-dependent. 4045 4046In the following example, the expression sizeof(sizeof(T() + T())) 4047is instantiation-dependent (since it involves a template parameter T), 4048but is neither type- nor value-dependent, since the type of the inner 4049sizeof is known (std::size_t) and therefore the size of the outer 4050sizeof is known. 4051 template<typename T> 4052 void f(T x, T y) { sizeof(sizeof(T() + T()); } 4053expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 4054</pre></td></tr> 4055 4056 4057<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> 4058<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 4059is not yet instantiated. 4060 4061For example, the expressions "x" and "x + y" are type-dependent in 4062the following code, but "y" is not type-dependent: 4063 template<typename T> 4064 void add(T x, int y) { 4065 x + y; 4066 } 4067expr(isTypeDependent()) matches x + y 4068</pre></td></tr> 4069 4070 4071<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> 4072<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 4073non-type template parameter. 4074 4075For example, the array bound of "Chars" in the following example is 4076value-dependent. 4077 template<int Size> int f() { return Size; } 4078expr(isValueDependent()) matches return Size 4079</pre></td></tr> 4080 4081 4082<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> 4083<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 4084GNU's __null, C++11's nullptr, or C's NULL macro. 4085 4086Given: 4087 void *v1 = NULL; 4088 void *v2 = nullptr; 4089 void *v3 = __null; // GNU extension 4090 char *cp = (char *)0; 4091 int *ip = 0; 4092 int i = 0; 4093expr(nullPointerConstant()) 4094 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 4095 initializer for i. 4096</pre></td></tr> 4097 4098 4099<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> 4100<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 4101bit width. 4102 4103Given 4104 class C { 4105 int a : 2; 4106 int b : 4; 4107 int c : 2; 4108 }; 4109fieldDecl(hasBitWidth(2)) 4110 matches 'int a;' and 'int c;' but not 'int b;'. 4111</pre></td></tr> 4112 4113 4114<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> 4115<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 4116 4117Given 4118 class C { 4119 int a : 2; 4120 int b; 4121 }; 4122fieldDecl(isBitField()) 4123 matches 'int a;' but not 'int b;'. 4124</pre></td></tr> 4125 4126 4127<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> 4128<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4129 4130Given 4131 f('false, 3.14, 42); 4132characterLiteral(equals(0)) 4133 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4134 match false 4135floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4136 match 3.14 4137integerLiteral(equals(42)) 4138 matches 42 4139 4140Note that you cannot directly match a negative numeric literal because the 4141minus sign is not part of the literal: It is a unary operator whose operand 4142is the positive numeric literal. Instead, you must use a unaryOperator() 4143matcher to match the minus sign: 4144 4145unaryOperator(hasOperatorName("-"), 4146 hasUnaryOperand(integerLiteral(equals(13)))) 4147 4148Usable 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>>, 4149 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>> 4150</pre></td></tr> 4151 4152 4153<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> 4154<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 4155 4156 4157<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> 4158<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4159 4160Matches overloaded operator names specified in strings without the 4161"operator" prefix: e.g. "<<". 4162 4163 hasAnyOverloadedOperatorName("+", "-") 4164Is equivalent to 4165 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4166</pre></td></tr> 4167 4168 4169<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> 4170<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4171 4172Given: 4173 void f(); 4174 void g() noexcept; 4175 void h() noexcept(true); 4176 void i() noexcept(false); 4177 void j() throw(); 4178 void k() throw(int); 4179 void l() throw(...); 4180functionDecl(hasDynamicExceptionSpec()) and 4181 functionProtoType(hasDynamicExceptionSpec()) 4182 match the declarations of j, k, and l, but not f, g, h, or i. 4183</pre></td></tr> 4184 4185 4186<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> 4187<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4188 4189Matches overloaded operator names specified in strings without the 4190"operator" prefix: e.g. "<<". 4191 4192Given: 4193 class A { int operator*(); }; 4194 const A &operator<<(const A &a, const A &b); 4195 A a; 4196 a << a; // <-- This matches 4197 4198cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4199specified line and 4200cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4201matches the declaration of A. 4202 4203Usable 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>> 4204</pre></td></tr> 4205 4206 4207<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> 4208<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4209 4210Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4211int X() {} 4212auto Y() -> int {} 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('isConsteval0')"><a name="isConsteval0Anchor">isConsteval</a></td><td></td></tr> 4217<tr><td colspan="4" class="doc" id="isConsteval0"><pre>Matches consteval function declarations and if consteval/if ! consteval 4218statements. 4219 4220Given: 4221 consteval int a(); 4222 void b() { if consteval {} } 4223 void c() { if ! consteval {} } 4224 void d() { if ! consteval {} else {} } 4225functionDecl(isConsteval()) 4226 matches the declaration of "int a()". 4227ifStmt(isConsteval()) 4228 matches the if statement in "void b()", "void c()", "void d()". 4229</pre></td></tr> 4230 4231 4232<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> 4233<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4234 and if constexpr. 4235 4236Given: 4237 constexpr int foo = 42; 4238 constexpr int bar(); 4239 void baz() { if constexpr(1 > 0) {} } 4240varDecl(isConstexpr()) 4241 matches the declaration of foo. 4242functionDecl(isConstexpr()) 4243 matches the declaration of bar. 4244ifStmt(isConstexpr()) 4245 matches the if statement in baz. 4246</pre></td></tr> 4247 4248 4249<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> 4250<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4251 4252Given: 4253 class A { ~A(); }; 4254 class B { ~B() = default; }; 4255functionDecl(isDefaulted()) 4256 matches the declaration of ~B, but not ~A. 4257</pre></td></tr> 4258 4259 4260<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> 4261<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4262 4263Example matches A, va, fa 4264 class A {}; 4265 class B; // Doesn't match, as it has no body. 4266 int va; 4267 extern int vb; // Doesn't match, as it doesn't define the variable. 4268 void fa() {} 4269 void fb(); // Doesn't match, as it has no body. 4270 @interface X 4271 - (void)ma; // Doesn't match, interface is declaration. 4272 @end 4273 @implementation X 4274 - (void)ma {} 4275 @end 4276 4277Usable 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>>, 4278 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4279</pre></td></tr> 4280 4281 4282<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> 4283<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4284 4285Given: 4286 void Func(); 4287 void DeletedFunc() = delete; 4288functionDecl(isDeleted()) 4289 matches the declaration of DeletedFunc, but not Func. 4290</pre></td></tr> 4291 4292 4293<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> 4294<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4295static member variable template instantiations. 4296 4297Given 4298 template<typename T> void A(T t) { } 4299 template<> void A(int N) { } 4300functionDecl(isExplicitTemplateSpecialization()) 4301 matches the specialization A<int>(). 4302 4303Usable 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>> 4304</pre></td></tr> 4305 4306 4307<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> 4308<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4309 4310Given: 4311 extern "C" void f() {} 4312 extern "C" { void g() {} } 4313 void h() {} 4314 extern "C" int x = 1; 4315 extern "C" int y = 2; 4316 int z = 3; 4317functionDecl(isExternC()) 4318 matches the declaration of f and g, but not the declaration of h. 4319varDecl(isExternC()) 4320 matches the declaration of x and y, but not the declaration of z. 4321</pre></td></tr> 4322 4323 4324<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> 4325<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4326the inline keyword. 4327 4328Given 4329 inline void f(); 4330 void g(); 4331 namespace n { 4332 inline namespace m {} 4333 } 4334functionDecl(isInline()) will match ::f(). 4335namespaceDecl(isInline()) will match n::m. 4336</pre></td></tr> 4337 4338 4339<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> 4340<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4341into an executable program. 4342</pre></td></tr> 4343 4344 4345<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> 4346<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4347 4348Given 4349 void nope(); 4350 [[noreturn]] void a(); 4351 __attribute__((noreturn)) void b(); 4352 struct c { [[noreturn]] c(); }; 4353functionDecl(isNoReturn()) 4354 matches all of those except 4355 void nope(); 4356</pre></td></tr> 4357 4358 4359<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> 4360<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4361 4362Given: 4363 void f(); 4364 void g() noexcept; 4365 void h() throw(); 4366 void i() throw(int); 4367 void j() noexcept(false); 4368functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4369 match the declarations of g, and h, but not f, i or j. 4370</pre></td></tr> 4371 4372 4373<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> 4374<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4375class specifier ("static" keyword) written in the source. 4376 4377Given: 4378 static void f() {} 4379 static int i = 0; 4380 extern int j; 4381 int k; 4382functionDecl(isStaticStorageClass()) 4383 matches the function declaration f. 4384varDecl(isStaticStorageClass()) 4385 matches the variable declaration i. 4386</pre></td></tr> 4387 4388 4389<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> 4390<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4391member variable template instantiations. 4392 4393Given 4394 template <typename T> class X {}; class A {}; X<A> x; 4395or 4396 template <typename T> class X {}; class A {}; template class X<A>; 4397or 4398 template <typename T> class X {}; class A {}; extern template class X<A>; 4399cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4400 matches the template instantiation of X<A>. 4401 4402But given 4403 template <typename T> class X {}; class A {}; 4404 template <> class X<A> {}; X<A> x; 4405cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4406 does not match, as X<A> is an explicit template specialization. 4407 4408Usable 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>> 4409</pre></td></tr> 4410 4411 4412<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> 4413<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4414 4415Example matches f, but not g or h. The function i will not match, even when 4416compiled in C mode. 4417 void f(...); 4418 void g(int); 4419 template <typename... Ts> void h(Ts...); 4420 void i(); 4421</pre></td></tr> 4422 4423 4424<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> 4425<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4426 4427Given: 4428 void foo() __attribute__((__weakref__("__foo"))); 4429 void bar(); 4430functionDecl(isWeak()) 4431 matches the weak declaration "foo", but not "bar". 4432</pre></td></tr> 4433 4434 4435<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> 4436<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4437specific parameter count. 4438 4439Given 4440 void f(int i) {} 4441 void g(int i, int j) {} 4442 void h(int i, int j); 4443 void j(int i); 4444 void k(int x, int y, int z, ...); 4445functionDecl(parameterCountIs(2)) 4446 matches g and h 4447functionProtoType(parameterCountIs(2)) 4448 matches g and h 4449functionProtoType(parameterCountIs(3)) 4450 matches k 4451</pre></td></tr> 4452 4453 4454<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> 4455<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4456 4457Given: 4458 void f(); 4459 void g() noexcept; 4460 void h() noexcept(true); 4461 void i() noexcept(false); 4462 void j() throw(); 4463 void k() throw(int); 4464 void l() throw(...); 4465functionDecl(hasDynamicExceptionSpec()) and 4466 functionProtoType(hasDynamicExceptionSpec()) 4467 match the declarations of j, k, and l, but not f, g, h, or i. 4468</pre></td></tr> 4469 4470 4471<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> 4472<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4473 4474Given: 4475 void f(); 4476 void g() noexcept; 4477 void h() throw(); 4478 void i() throw(int); 4479 void j() noexcept(false); 4480functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4481 match the declarations of g, and h, but not f, i or j. 4482</pre></td></tr> 4483 4484 4485<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> 4486<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4487specific parameter count. 4488 4489Given 4490 void f(int i) {} 4491 void g(int i, int j) {} 4492 void h(int i, int j); 4493 void j(int i); 4494 void k(int x, int y, int z, ...); 4495functionDecl(parameterCountIs(2)) 4496 matches g and h 4497functionProtoType(parameterCountIs(2)) 4498 matches g and h 4499functionProtoType(parameterCountIs(3)) 4500 matches k 4501</pre></td></tr> 4502 4503 4504<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConsteval1')"><a name="isConsteval1Anchor">isConsteval</a></td><td></td></tr> 4505<tr><td colspan="4" class="doc" id="isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval 4506statements. 4507 4508Given: 4509 consteval int a(); 4510 void b() { if consteval {} } 4511 void c() { if ! consteval {} } 4512 void d() { if ! consteval {} else {} } 4513functionDecl(isConsteval()) 4514 matches the declaration of "int a()". 4515ifStmt(isConsteval()) 4516 matches the if statement in "void b()", "void c()", "void d()". 4517</pre></td></tr> 4518 4519 4520<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> 4521<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4522 and if constexpr. 4523 4524Given: 4525 constexpr int foo = 42; 4526 constexpr int bar(); 4527 void baz() { if constexpr(1 > 0) {} } 4528varDecl(isConstexpr()) 4529 matches the declaration of foo. 4530functionDecl(isConstexpr()) 4531 matches the declaration of bar. 4532ifStmt(isConstexpr()) 4533 matches the if statement in baz. 4534</pre></td></tr> 4535 4536 4537<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> 4538<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4539 4540 4541<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> 4542<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4543 4544Given 4545 f('false, 3.14, 42); 4546characterLiteral(equals(0)) 4547 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4548 match false 4549floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4550 match 3.14 4551integerLiteral(equals(42)) 4552 matches 42 4553 4554Note that you cannot directly match a negative numeric literal because the 4555minus sign is not part of the literal: It is a unary operator whose operand 4556is the positive numeric literal. Instead, you must use a unaryOperator() 4557matcher to match the minus sign: 4558 4559unaryOperator(hasOperatorName("-"), 4560 hasUnaryOperand(integerLiteral(equals(13)))) 4561 4562Usable 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>>, 4563 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>> 4564</pre></td></tr> 4565 4566 4567<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> 4568<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4569 4570 4571<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> 4572<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4573 4574 4575<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('capturesThis0')"><a name="capturesThis0Anchor">capturesThis</a></td><td></td></tr> 4576<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'. 4577 4578Given 4579class C { 4580 int cc; 4581 int f() { 4582 auto l = [this]() { return cc; }; 4583 return l(); 4584 } 4585}; 4586lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis()))) 4587 matches `[this]() { return cc; }`. 4588</pre></td></tr> 4589 4590 4591<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('isImplicit2')"><a name="isImplicit2Anchor">isImplicit</a></td><td></td></tr> 4592<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 4593implicit default/copy constructors). 4594</pre></td></tr> 4595 4596 4597<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> 4598<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4599to '.'. 4600 4601Member calls on the implicit this pointer match as called with '->'. 4602 4603Given 4604 class Y { 4605 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4606 template <class T> void f() { this->f<T>(); f<T>(); } 4607 int a; 4608 static int b; 4609 }; 4610 template <class T> 4611 class Z { 4612 void x() { this->m; } 4613 }; 4614memberExpr(isArrow()) 4615 matches this->x, x, y.x, a, this->b 4616cxxDependentScopeMemberExpr(isArrow()) 4617 matches this->m 4618unresolvedMemberExpr(isArrow()) 4619 matches this->f<T>, f<T> 4620</pre></td></tr> 4621 4622 4623<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> 4624<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4625 4626This matcher is only provided as a performance optimization of hasName. 4627 hasAnyName(a, b, c) 4628 is equivalent to, but faster than 4629 anyOf(hasName(a), hasName(b), hasName(c)) 4630</pre></td></tr> 4631 4632 4633<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> 4634<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4635 4636Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4637void f() { 4638 int x; 4639 static int y; 4640} 4641int z; 4642 4643Example matches f() because it has external formal linkage despite being 4644unique to the translation unit as though it has internal likage 4645(matcher = functionDecl(hasExternalFormalLinkage())) 4646 4647namespace { 4648void f() {} 4649} 4650</pre></td></tr> 4651 4652 4653<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> 4654<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4655 4656Supports specifying enclosing namespaces or classes by prefixing the name 4657with '<enclosing>::'. 4658Does not match typedefs of an underlying type with the given name. 4659 4660Example matches X (Name == "X") 4661 class X; 4662 4663Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4664 namespace a { namespace b { class X; } } 4665</pre></td></tr> 4666 4667 4668<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> 4669<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4670a substring matched by the given RegExp. 4671 4672Supports specifying enclosing namespaces or classes by 4673prefixing the name with '<enclosing>::'. Does not match typedefs 4674of an underlying type with the given name. 4675 4676Example matches X (regexp == "::X") 4677 class X; 4678 4679Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4680 namespace foo { namespace bar { class X; } } 4681 4682If the matcher is used in clang-query, RegexFlags parameter 4683should be passed as a quoted string. e.g: "NoFlags". 4684Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4685</pre></td></tr> 4686 4687 4688<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr> 4689<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4690 4691Given 4692 namespace n { 4693 namespace {} // #1 4694 } 4695namespaceDecl(isAnonymous()) will match #1 but not ::n. 4696</pre></td></tr> 4697 4698 4699<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> 4700<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4701the inline keyword. 4702 4703Given 4704 inline void f(); 4705 void g(); 4706 namespace n { 4707 inline namespace m {} 4708 } 4709functionDecl(isInline()) will match ::f(). 4710namespaceDecl(isInline()) will match n::m. 4711</pre></td></tr> 4712 4713 4714<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> 4715<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4716specified. 4717 4718Given 4719 4720 #pragma omp parallel 4721 #pragma omp parallel default(none) 4722 #pragma omp parallel default(shared) 4723 #pragma omp parallel default(firstprivate) 4724 4725``ompDefaultClause(isFirstPrivateKind())`` matches only 4726``default(firstprivate)``. 4727</pre></td></tr> 4728 4729 4730<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> 4731<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4732 4733Given 4734 4735 #pragma omp parallel 4736 #pragma omp parallel default(none) 4737 #pragma omp parallel default(shared) 4738 #pragma omp parallel default(firstprivate) 4739 4740``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4741</pre></td></tr> 4742 4743 4744<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> 4745<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4746 4747Given 4748 4749 #pragma omp parallel 4750 #pragma omp parallel default(none) 4751 #pragma omp parallel default(shared) 4752 #pragma omp parallel default(firstprivate) 4753 4754``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4755</pre></td></tr> 4756 4757 4758<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> 4759<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4760clause kind. 4761 4762Given 4763 4764 #pragma omp parallel 4765 #pragma omp parallel for 4766 #pragma omp for 4767 4768`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4769``omp parallel`` and ``omp parallel for``. 4770 4771If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4772should be passed as a quoted string. e.g., 4773``isAllowedToContainClauseKind("OMPC_default").`` 4774</pre></td></tr> 4775 4776 4777<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> 4778<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4779i.e., directives that can't have a structured block. 4780 4781Given 4782 4783 #pragma omp parallel 4784 {} 4785 #pragma omp taskyield 4786 4787``ompExecutableDirective(isStandaloneDirective()))`` matches 4788``omp taskyield``. 4789</pre></td></tr> 4790 4791 4792<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> 4793<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4794</pre></td></tr> 4795 4796 4797<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> 4798<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4799</pre></td></tr> 4800 4801 4802<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> 4803<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4804isSameOrDerivedFrom(hasName(...)). 4805</pre></td></tr> 4806 4807 4808<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> 4809<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4810a specific number of arguments (including absent default arguments). 4811 4812Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4813 void f(int x, int y); 4814 f(0, 0); 4815</pre></td></tr> 4816 4817 4818<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> 4819<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4820Selector.getAsString() 4821 4822 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4823 matches both of the expressions below: 4824 [myObj methodA:argA]; 4825 [myObj methodB:argB]; 4826</pre></td></tr> 4827 4828 4829<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> 4830<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4831 4832objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4833message expression in 4834 4835 UIWebView *webView = ...; 4836 CGRect bodyFrame = webView.frame; 4837 bodyFrame.size.height = self.bodyContentHeight; 4838 webView.frame = bodyFrame; 4839 // ^---- matches here 4840</pre></td></tr> 4841 4842 4843<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> 4844<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4845 4846Matches only when the selector of the objCMessageExpr is NULL. This may 4847represent an error condition in the tree! 4848</pre></td></tr> 4849 4850 4851<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> 4852<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4853 4854 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4855 matches the outer message expr in the code below, but NOT the message 4856 invocation for self.bodyView. 4857 [self.bodyView loadHTMLString:html baseURL:NULL]; 4858</pre></td></tr> 4859 4860 4861<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> 4862<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4863 4864 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4865 matches self.bodyView in the code below, but NOT the outer message 4866 invocation of "loadHTMLString:baseURL:". 4867 [self.bodyView loadHTMLString:html baseURL:NULL]; 4868</pre></td></tr> 4869 4870 4871<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> 4872<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4873 4874Example 4875matcher = objcMessageExpr(isClassMessage()) 4876matches 4877 [NSString stringWithFormat:@"format"]; 4878but not 4879 NSString *x = @"hello"; 4880 [x containsString:@"h"]; 4881</pre></td></tr> 4882 4883 4884<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> 4885<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4886 4887Example 4888matcher = objcMessageExpr(isInstanceMessage()) 4889matches 4890 NSString *x = @"hello"; 4891 [x containsString:@"h"]; 4892but not 4893 [NSString stringWithFormat:@"format"]; 4894</pre></td></tr> 4895 4896 4897<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> 4898<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4899a substring matched by the given RegExp. 4900 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4901 invocation for self.bodyView. 4902 [self.bodyView loadHTMLString:html baseURL:NULL]; 4903 4904If the matcher is used in clang-query, RegexFlags parameter 4905should be passed as a quoted string. e.g: "NoFlags". 4906Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4907</pre></td></tr> 4908 4909 4910<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> 4911<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4912 4913 matcher = objCMessageExpr(numSelectorArgs(0)); 4914 matches self.bodyView in the code below 4915 4916 matcher = objCMessageExpr(numSelectorArgs(2)); 4917 matches the invocation of "loadHTMLString:baseURL:" but not that 4918 of self.bodyView 4919 [self.bodyView loadHTMLString:html baseURL:NULL]; 4920</pre></td></tr> 4921 4922 4923<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> 4924<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4925 4926Example 4927matcher = objcMethodDecl(isClassMethod()) 4928matches 4929@interface I + (void)foo; @end 4930but not 4931@interface I - (void)bar; @end 4932</pre></td></tr> 4933 4934 4935<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> 4936<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4937 4938Example matches A, va, fa 4939 class A {}; 4940 class B; // Doesn't match, as it has no body. 4941 int va; 4942 extern int vb; // Doesn't match, as it doesn't define the variable. 4943 void fa() {} 4944 void fb(); // Doesn't match, as it has no body. 4945 @interface X 4946 - (void)ma; // Doesn't match, interface is declaration. 4947 @end 4948 @implementation X 4949 - (void)ma {} 4950 @end 4951 4952Usable 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>>, 4953 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4954</pre></td></tr> 4955 4956 4957<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> 4958<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4959 4960Example 4961matcher = objcMethodDecl(isInstanceMethod()) 4962matches 4963@interface I - (void)bar; @end 4964but not 4965@interface I + (void)foo; @end 4966</pre></td></tr> 4967 4968 4969<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> 4970<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4971 4972Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4973void x(int val) {} 4974void y(int val = 0) {} 4975 4976Deprecated. Use hasInitializer() instead to be able to 4977match on the contents of the default argument. For example: 4978 4979void x(int val = 7) {} 4980void y(int val = 42) {} 4981parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4982 matches the parameter of y 4983 4984A matcher such as 4985 parmVarDecl(hasInitializer(anything())) 4986is equivalent to parmVarDecl(hasDefaultArgument()). 4987</pre></td></tr> 4988 4989 4990<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> 4991<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4992list. The parameter list could be that of either a block, function, or 4993objc-method. 4994 4995 4996Given 4997 4998void f(int a, int b, int c) { 4999} 5000 5001``parmVarDecl(isAtPosition(0))`` matches ``int a``. 5002 5003``parmVarDecl(isAtPosition(1))`` matches ``int b``. 5004</pre></td></tr> 5005 5006 5007<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> 5008<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 5009 5010Given 5011 class Y { public: void x(); }; 5012 void z() { Y* y; y->x(); } 5013cxxMemberCallExpr(on(hasType(asString("class Y *")))) 5014 matches y->x() 5015</pre></td></tr> 5016 5017 5018<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> 5019<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 5020 5021Matches a node if it equals the node previously bound to ID. 5022 5023Given 5024 class X { int a; int b; }; 5025cxxRecordDecl( 5026 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5027 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5028 matches the class X, as a and b have the same type. 5029 5030Note that when multiple matches are involved via forEach* matchers, 5031equalsBoundNodes acts as a filter. 5032For example: 5033compoundStmt( 5034 forEachDescendant(varDecl().bind("d")), 5035 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5036will trigger a match for each combination of variable declaration 5037and reference to that variable declaration within a compound statement. 5038</pre></td></tr> 5039 5040 5041<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> 5042<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 5043the node, not hidden within a typedef. 5044 5045Given 5046 typedef const int const_int; 5047 const_int i; 5048 int *const j; 5049 int *volatile k; 5050 int m; 5051varDecl(hasType(hasLocalQualifiers())) matches only j and k. 5052i is const-qualified but the qualifier is not local. 5053</pre></td></tr> 5054 5055 5056<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> 5057<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 5058 5059Given 5060 void a(char); 5061 void b(wchar_t); 5062 void c(double); 5063functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 5064matches "a(char)", "b(wchar_t)", but not "c(double)". 5065</pre></td></tr> 5066 5067 5068<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> 5069<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 5070the Objective-C object pointer type, which is different despite being 5071syntactically similar. 5072 5073Given 5074 int *i = nullptr; 5075 5076 @interface Foo 5077 @end 5078 Foo *f; 5079 5080 int j; 5081varDecl(hasType(isAnyPointer())) 5082 matches "int *i" and "Foo *f", but not "int j". 5083</pre></td></tr> 5084 5085 5086<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> 5087<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 5088include "top-level" const. 5089 5090Given 5091 void a(int); 5092 void b(int const); 5093 void c(const int); 5094 void d(const int*); 5095 void e(int const) {}; 5096functionDecl(hasAnyParameter(hasType(isConstQualified()))) 5097 matches "void b(int const)", "void c(const int)" and 5098 "void e(int const) {}". It does not match d as there 5099 is no top-level const on the parameter type "const int *". 5100</pre></td></tr> 5101 5102 5103<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> 5104<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 5105 5106Given 5107 void a(int); 5108 void b(long); 5109 void c(double); 5110functionDecl(hasAnyParameter(hasType(isInteger()))) 5111matches "a(int)", "b(long)", but not "c(double)". 5112</pre></td></tr> 5113 5114 5115<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> 5116<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 5117 5118Given 5119 void a(int); 5120 void b(unsigned long); 5121 void c(double); 5122functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 5123matches "a(int)", but not "b(unsigned long)" and "c(double)". 5124</pre></td></tr> 5125 5126 5127<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> 5128<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 5129 5130Given 5131 void a(int); 5132 void b(unsigned long); 5133 void c(double); 5134functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 5135matches "b(unsigned long)", but not "a(int)" and "c(double)". 5136</pre></td></tr> 5137 5138 5139<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> 5140<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 5141include "top-level" volatile. 5142 5143Given 5144 void a(int); 5145 void b(int volatile); 5146 void c(volatile int); 5147 void d(volatile int*); 5148 void e(int volatile) {}; 5149functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 5150 matches "void b(int volatile)", "void c(volatile int)" and 5151 "void e(int volatile) {}". It does not match d as there 5152 is no top-level volatile on the parameter type "volatile int *". 5153</pre></td></tr> 5154 5155 5156<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> 5157<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 5158 5159Matches a node if it equals the node previously bound to ID. 5160 5161Given 5162 class X { int a; int b; }; 5163cxxRecordDecl( 5164 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5165 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5166 matches the class X, as a and b have the same type. 5167 5168Note that when multiple matches are involved via forEach* matchers, 5169equalsBoundNodes acts as a filter. 5170For example: 5171compoundStmt( 5172 forEachDescendant(varDecl().bind("d")), 5173 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5174will trigger a match for each combination of variable declaration 5175and reference to that variable declaration within a compound statement. 5176</pre></td></tr> 5177 5178 5179<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> 5180<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5181 5182Stmt has pointer identity in the AST. 5183</pre></td></tr> 5184 5185 5186<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> 5187<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5188Does not match if only part of the statement is expanded from that macro or 5189if different parts of the statement are expanded from different 5190appearances of the macro. 5191</pre></td></tr> 5192 5193 5194<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> 5195<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5196partially matching a given regex. 5197 5198Example matches Y but not X 5199 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5200 #include "ASTMatcher.h" 5201 class X {}; 5202ASTMatcher.h: 5203 class Y {}; 5204 5205Usable 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>> 5206 5207If the matcher is used in clang-query, RegexFlags parameter 5208should be passed as a quoted string. e.g: "NoFlags". 5209Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5210</pre></td></tr> 5211 5212 5213<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> 5214<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5215 5216Example matches X but not Y 5217 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5218 #include <Y.h> 5219 class X {}; 5220Y.h: 5221 class Y {}; 5222 5223Usable 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>> 5224</pre></td></tr> 5225 5226 5227<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> 5228<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5229 5230Example matches Y but not X 5231 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5232 #include <SystemHeader.h> 5233 class X {}; 5234SystemHeader.h: 5235 class Y {}; 5236 5237Usable 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>> 5238</pre></td></tr> 5239 5240 5241<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> 5242<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5243 5244Given 5245 int j; 5246 template<typename T> void A(T t) { T i; j += 42;} 5247 A(0); 5248 A(0U); 5249declStmt(isInTemplateInstantiation()) 5250 matches 'int i;' and 'unsigned i'. 5251unless(stmt(isInTemplateInstantiation())) 5252 will NOT match j += 42; as it's shared between the template definition and 5253 instantiation. 5254</pre></td></tr> 5255 5256 5257<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> 5258<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5259 5260Given 5261 int a[42]; 5262 int b[2 * 21]; 5263 int c[41], d[43]; 5264 char *s = "abcd"; 5265 wchar_t *ws = L"abcd"; 5266 char *w = "a"; 5267constantArrayType(hasSize(42)) 5268 matches "int a[42]" and "int b[2 * 21]" 5269stringLiteral(hasSize(4)) 5270 matches "abcd", L"abcd" 5271</pre></td></tr> 5272 5273 5274<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> 5275<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5276 5277Example matches C, but not S, U or E. 5278 struct S {}; 5279 class C {}; 5280 union U {}; 5281 enum E {}; 5282</pre></td></tr> 5283 5284 5285<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> 5286<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5287 5288Example matches A, va, fa 5289 class A {}; 5290 class B; // Doesn't match, as it has no body. 5291 int va; 5292 extern int vb; // Doesn't match, as it doesn't define the variable. 5293 void fa() {} 5294 void fb(); // Doesn't match, as it has no body. 5295 @interface X 5296 - (void)ma; // Doesn't match, interface is declaration. 5297 @end 5298 @implementation X 5299 - (void)ma {} 5300 @end 5301 5302Usable 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>>, 5303 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5304</pre></td></tr> 5305 5306 5307<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> 5308<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5309 5310Example matches E, but not C, S or U. 5311 struct S {}; 5312 class C {}; 5313 union U {}; 5314 enum E {}; 5315</pre></td></tr> 5316 5317 5318<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> 5319<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5320 5321Example matches S, but not C, U or E. 5322 struct S {}; 5323 class C {}; 5324 union U {}; 5325 enum E {}; 5326</pre></td></tr> 5327 5328 5329<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> 5330<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5331 5332Example matches U, but not C, S or E. 5333 struct S {}; 5334 class C {}; 5335 union U {}; 5336 enum E {}; 5337</pre></td></tr> 5338 5339 5340<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> 5341<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5342 5343Note that 'Value' is a string as the template argument's value is 5344an arbitrary precision integer. 'Value' must be euqal to the canonical 5345representation of that integral value in base 10. 5346 5347Given 5348 template<int T> struct C {}; 5349 C<42> c; 5350classTemplateSpecializationDecl( 5351 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5352 matches the implicit instantiation of C in C<42>. 5353</pre></td></tr> 5354 5355 5356<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> 5357<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5358 5359Given 5360 template<int T> struct C {}; 5361 C<42> c; 5362classTemplateSpecializationDecl( 5363 hasAnyTemplateArgument(isIntegral())) 5364 matches the implicit instantiation of C in C<42> 5365 with isIntegral() matching 42. 5366</pre></td></tr> 5367 5368 5369<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> 5370<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5371 5372Given 5373 template<typename T> struct C {}; 5374 C<int> c; 5375classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5376 matches C<int>. 5377</pre></td></tr> 5378 5379 5380<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> 5381<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5382Does not match if only part of the statement is expanded from that macro or 5383if different parts of the statement are expanded from different 5384appearances of the macro. 5385</pre></td></tr> 5386 5387 5388<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> 5389<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5390partially matching a given regex. 5391 5392Example matches Y but not X 5393 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5394 #include "ASTMatcher.h" 5395 class X {}; 5396ASTMatcher.h: 5397 class Y {}; 5398 5399Usable 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>> 5400 5401If the matcher is used in clang-query, RegexFlags parameter 5402should be passed as a quoted string. e.g: "NoFlags". 5403Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5404</pre></td></tr> 5405 5406 5407<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> 5408<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5409 5410Example matches X but not Y 5411 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5412 #include <Y.h> 5413 class X {}; 5414Y.h: 5415 class Y {}; 5416 5417Usable 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>> 5418</pre></td></tr> 5419 5420 5421<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> 5422<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5423 5424Example matches Y but not X 5425 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5426 #include <SystemHeader.h> 5427 class X {}; 5428SystemHeader.h: 5429 class Y {}; 5430 5431Usable 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>> 5432</pre></td></tr> 5433 5434 5435<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> 5436<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5437 5438Given 5439 struct S { bool func(); }; 5440functionDecl(returns(booleanType())) 5441 matches "bool func();" 5442</pre></td></tr> 5443 5444 5445<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> 5446<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5447 5448Matches a node if it equals the node previously bound to ID. 5449 5450Given 5451 class X { int a; int b; }; 5452cxxRecordDecl( 5453 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5454 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5455 matches the class X, as a and b have the same type. 5456 5457Note that when multiple matches are involved via forEach* matchers, 5458equalsBoundNodes acts as a filter. 5459For example: 5460compoundStmt( 5461 forEachDescendant(varDecl().bind("d")), 5462 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5463will trigger a match for each combination of variable declaration 5464and reference to that variable declaration within a compound statement. 5465</pre></td></tr> 5466 5467 5468<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> 5469<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5470 5471Type has pointer identity in the AST. 5472</pre></td></tr> 5473 5474 5475<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> 5476<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5477 5478Given 5479 int i; 5480 float f; 5481realFloatingPointType() 5482 matches "float f" but not "int i" 5483</pre></td></tr> 5484 5485 5486<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> 5487<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5488 5489Given 5490 struct S { void func(); }; 5491functionDecl(returns(voidType())) 5492 matches "void func();" 5493</pre></td></tr> 5494 5495 5496<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> 5497<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5498 5499Given 5500 int x; 5501 int s = sizeof(x) + alignof(x) 5502unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5503 matches sizeof(x) 5504 5505If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5506should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5507</pre></td></tr> 5508 5509 5510<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> 5511<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5512specified names. 5513 5514 hasAnyOperatorName("+", "-") 5515 Is equivalent to 5516 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5517</pre></td></tr> 5518 5519 5520<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> 5521<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5522unary). 5523 5524Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5525 !(a || b) 5526</pre></td></tr> 5527 5528 5529<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> 5530<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5531to '.'. 5532 5533Member calls on the implicit this pointer match as called with '->'. 5534 5535Given 5536 class Y { 5537 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5538 template <class T> void f() { this->f<T>(); f<T>(); } 5539 int a; 5540 static int b; 5541 }; 5542 template <class T> 5543 class Z { 5544 void x() { this->m; } 5545 }; 5546memberExpr(isArrow()) 5547 matches this->x, x, y.x, a, this->b 5548cxxDependentScopeMemberExpr(isArrow()) 5549 matches this->m 5550unresolvedMemberExpr(isArrow()) 5551 matches this->f<T>, f<T> 5552</pre></td></tr> 5553 5554 5555<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> 5556<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5557 5558Example matches x, but not y, z, or a. 5559(matcher = varDecl(hasAutomaticStorageDuration()) 5560void f() { 5561 int x; 5562 static int y; 5563 thread_local int z; 5564} 5565int a; 5566</pre></td></tr> 5567 5568 5569<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> 5570<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5571 5572Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5573void f() { 5574 int x; 5575 static int y; 5576} 5577int z; 5578</pre></td></tr> 5579 5580 5581<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> 5582<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5583non-static local variable. 5584 5585Example matches x (matcher = varDecl(hasLocalStorage()) 5586void f() { 5587 int x; 5588 static int y; 5589} 5590int z; 5591</pre></td></tr> 5592 5593 5594<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> 5595<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5596It includes the variable declared at namespace scope and those declared 5597with "static" and "extern" storage class specifiers. 5598 5599void f() { 5600 int x; 5601 static int y; 5602 thread_local int z; 5603} 5604int a; 5605static int b; 5606extern int c; 5607varDecl(hasStaticStorageDuration()) 5608 matches the function declaration y, a, b and c. 5609</pre></td></tr> 5610 5611 5612<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> 5613<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5614 5615Example matches z, but not x, z, or a. 5616(matcher = varDecl(hasThreadStorageDuration()) 5617void f() { 5618 int x; 5619 static int y; 5620 thread_local int z; 5621} 5622int a; 5623</pre></td></tr> 5624 5625 5626<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> 5627<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5628 and if constexpr. 5629 5630Given: 5631 constexpr int foo = 42; 5632 constexpr int bar(); 5633 void baz() { if constexpr(1 > 0) {} } 5634varDecl(isConstexpr()) 5635 matches the declaration of foo. 5636functionDecl(isConstexpr()) 5637 matches the declaration of bar. 5638ifStmt(isConstexpr()) 5639 matches the if statement in baz. 5640</pre></td></tr> 5641 5642 5643<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstinit0')"><a name="isConstinit0Anchor">isConstinit</a></td><td></td></tr> 5644<tr><td colspan="4" class="doc" id="isConstinit0"><pre>Matches constinit variable declarations. 5645 5646Given: 5647 constinit int foo = 42; 5648 constinit const char* bar = "bar"; 5649 int baz = 42; 5650 [[clang::require_constant_initialization]] int xyz = 42; 5651varDecl(isConstinit()) 5652 matches the declaration of `foo` and `bar`, but not `baz` and `xyz`. 5653</pre></td></tr> 5654 5655 5656<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> 5657<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5658 5659Example matches A, va, fa 5660 class A {}; 5661 class B; // Doesn't match, as it has no body. 5662 int va; 5663 extern int vb; // Doesn't match, as it doesn't define the variable. 5664 void fa() {} 5665 void fb(); // Doesn't match, as it has no body. 5666 @interface X 5667 - (void)ma; // Doesn't match, interface is declaration. 5668 @end 5669 @implementation X 5670 - (void)ma {} 5671 @end 5672 5673Usable 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>>, 5674 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5675</pre></td></tr> 5676 5677 5678<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> 5679<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5680a C++ catch block, or an Objective-C statement. 5681 5682Example matches x (matcher = varDecl(isExceptionVariable()) 5683void f(int y) { 5684 try { 5685 } catch (int x) { 5686 } 5687} 5688</pre></td></tr> 5689 5690 5691<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> 5692<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5693static member variable template instantiations. 5694 5695Given 5696 template<typename T> void A(T t) { } 5697 template<> void A(int N) { } 5698functionDecl(isExplicitTemplateSpecialization()) 5699 matches the specialization A<int>(). 5700 5701Usable 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>> 5702</pre></td></tr> 5703 5704 5705<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> 5706<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5707 5708Given: 5709 extern "C" void f() {} 5710 extern "C" { void g() {} } 5711 void h() {} 5712 extern "C" int x = 1; 5713 extern "C" int y = 2; 5714 int z = 3; 5715functionDecl(isExternC()) 5716 matches the declaration of f and g, but not the declaration of h. 5717varDecl(isExternC()) 5718 matches the declaration of x and y, but not the declaration of z. 5719</pre></td></tr> 5720 5721 5722<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isInitCapture0')"><a name="isInitCapture0Anchor">isInitCapture</a></td><td></td></tr> 5723<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init- 5724capture. 5725 5726Example matches x (matcher = varDecl(isInitCapture())) 5727auto f = [x=3]() { return x; }; 5728</pre></td></tr> 5729 5730 5731<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> 5732<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5733 5734Example matches y (matcher = varDecl(isStaticLocal())) 5735void f() { 5736 int x; 5737 static int y; 5738} 5739static int z; 5740</pre></td></tr> 5741 5742 5743<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> 5744<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5745class specifier ("static" keyword) written in the source. 5746 5747Given: 5748 static void f() {} 5749 static int i = 0; 5750 extern int j; 5751 int k; 5752functionDecl(isStaticStorageClass()) 5753 matches the function declaration f. 5754varDecl(isStaticStorageClass()) 5755 matches the variable declaration i. 5756</pre></td></tr> 5757 5758 5759<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> 5760<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5761member variable template instantiations. 5762 5763Given 5764 template <typename T> class X {}; class A {}; X<A> x; 5765or 5766 template <typename T> class X {}; class A {}; template class X<A>; 5767or 5768 template <typename T> class X {}; class A {}; extern template class X<A>; 5769cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5770 matches the template instantiation of X<A>. 5771 5772But given 5773 template <typename T> class X {}; class A {}; 5774 template <> class X<A> {}; X<A> x; 5775cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5776 does not match, as X<A> is an explicit template specialization. 5777 5778Usable 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>> 5779</pre></td></tr> 5780 5781<!--END_NARROWING_MATCHERS --> 5782</table> 5783 5784<!-- ======================================================================= --> 5785<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5786<!-- ======================================================================= --> 5787 5788<p>Traversal matchers specify the relationship to other nodes that are 5789reachable from the current node.</p> 5790 5791<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5792forEachDescendant) which work on all nodes and allow users to write more generic 5793match expressions.</p> 5794 5795<table> 5796<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5797<!-- START_TRAVERSAL_MATCHERS --> 5798 5799<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5800<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5801 5802The code 5803 var1 != var2; 5804might be represented in the clang AST as a binaryOperator, a 5805cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5806 5807* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5808 least one is a class type (cxxOperatorCallExpr) 5809* whether the code appears in a template declaration, if at least one of the 5810 vars is a dependent-type (binaryOperator) 5811* whether the code relies on a rewritten binary operator, such as a 5812spaceship operator or an inverted equality operator 5813(cxxRewrittenBinaryOperator) 5814 5815This matcher elides details in places where the matchers for the nodes are 5816compatible. 5817 5818Given 5819 binaryOperation( 5820 hasOperatorName("!="), 5821 hasLHS(expr().bind("lhs")), 5822 hasRHS(expr().bind("rhs")) 5823 ) 5824matches each use of "!=" in: 5825 struct S{ 5826 bool operator!=(const S&) const; 5827 }; 5828 5829 void foo() 5830 { 5831 1 != 2; 5832 S() != S(); 5833 } 5834 5835 template<typename T> 5836 void templ() 5837 { 5838 1 != 2; 5839 T() != S(); 5840 } 5841 struct HasOpEq 5842 { 5843 bool operator==(const HasOpEq &) const; 5844 }; 5845 5846 void inverse() 5847 { 5848 HasOpEq s1; 5849 HasOpEq s2; 5850 if (s1 != s2) 5851 return; 5852 } 5853 5854 struct HasSpaceship 5855 { 5856 bool operator<=>(const HasOpEq &) const; 5857 }; 5858 5859 void use_spaceship() 5860 { 5861 HasSpaceship s1; 5862 HasSpaceship s2; 5863 if (s1 != s2) 5864 return; 5865 } 5866</pre></td></tr> 5867 5868 5869<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5870<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5871 5872Unlike anyOf, eachOf will generate a match result for each 5873matching submatcher. 5874 5875For example, in: 5876 class A { int a; int b; }; 5877The matcher: 5878 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5879 has(fieldDecl(hasName("b")).bind("v")))) 5880will generate two results binding "v", the first of which binds 5881the field declaration of a, the second the field declaration of 5882b. 5883 5884Usable as: Any Matcher 5885</pre></td></tr> 5886 5887 5888<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5889<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5890 5891Generates results for each match. 5892 5893For example, in: 5894 class A { class B {}; class C {}; }; 5895The matcher: 5896 cxxRecordDecl(hasName("::A"), 5897 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5898will generate results for A, B and C. 5899 5900Usable as: Any Matcher 5901</pre></td></tr> 5902 5903 5904<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5905<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5906provided matcher. 5907 5908Example matches X, A, A::X, B, B::C, B::C::X 5909 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5910 class X {}; 5911 class A { class X {}; }; // Matches A, because A::X is a class of name 5912 // X inside A. 5913 class B { class C { class X {}; }; }; 5914 5915DescendantT must be an AST base type. 5916 5917As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5918each result that matches instead of only on the first one. 5919 5920Note: Recursively combined ForEachDescendant can cause many matches: 5921 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5922 forEachDescendant(cxxRecordDecl()) 5923 ))) 5924will match 10 times (plus injected class name matches) on: 5925 class A { class B { class C { class D { class E {}; }; }; }; }; 5926 5927Usable as: Any Matcher 5928</pre></td></tr> 5929 5930 5931<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5932<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5933provided matcher. 5934 5935Example matches X, Y, Y::X, Z::Y, Z::Y::X 5936 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5937 class X {}; 5938 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5939 // inside Y. 5940 class Z { class Y { class X {}; }; }; // Does not match Z. 5941 5942ChildT must be an AST base type. 5943 5944As opposed to 'has', 'forEach' will cause a match for each result that 5945matches instead of only on the first one. 5946 5947Usable as: Any Matcher 5948</pre></td></tr> 5949 5950 5951<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5952<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5953matcher. 5954 5955Given 5956void f() { if (true) { int x = 42; } } 5957void g() { for (;;) { int x = 43; } } 5958expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5959 5960Usable as: Any Matcher 5961</pre></td></tr> 5962 5963 5964<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5965<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5966provided matcher. 5967 5968Example matches X, Y, Z 5969 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5970 class X {}; // Matches X, because X::X is a class of name X inside X. 5971 class Y { class X {}; }; 5972 class Z { class Y { class X {}; }; }; 5973 5974DescendantT must be an AST base type. 5975 5976Usable as: Any Matcher 5977</pre></td></tr> 5978 5979 5980<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5981<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5982provided matcher. 5983 5984Example matches X, Y 5985 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5986 class X {}; // Matches X, because X::X is a class of name X inside X. 5987 class Y { class X {}; }; 5988 class Z { class Y { class X {}; }; }; // Does not match Z. 5989 5990ChildT must be an AST base type. 5991 5992Usable as: Any Matcher 5993Note that has is direct matcher, so it also matches things like implicit 5994casts and paren casts. If you are matching with expr then you should 5995probably consider using ignoringParenImpCasts like: 5996has(ignoringParenImpCasts(expr())). 5997</pre></td></tr> 5998 5999 6000<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 6001<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 6002matcher. 6003 6004Given 6005void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 6006compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 6007 6008Usable as: Any Matcher 6009</pre></td></tr> 6010 6011 6012<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 6013<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 6014 6015Because CallExpr and CXXConstructExpr do not share a common 6016base class with API accessing arguments etc, AST Matchers for code 6017which should match both are typically duplicated. This matcher 6018removes the need for duplication. 6019 6020Given code 6021struct ConstructorTakesInt 6022{ 6023 ConstructorTakesInt(int i) {} 6024}; 6025 6026void callTakesInt(int i) 6027{ 6028} 6029 6030void doCall() 6031{ 6032 callTakesInt(42); 6033} 6034 6035void doConstruct() 6036{ 6037 ConstructorTakesInt cti(42); 6038} 6039 6040The matcher 6041invocation(hasArgument(0, integerLiteral(equals(42)))) 6042matches the expression in both doCall and doConstruct 6043</pre></td></tr> 6044 6045 6046<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 6047<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 6048 6049However, optionally will retain any bindings generated by the submatcher. 6050Useful when additional information which may or may not present about a main 6051matching node is desired. 6052 6053For example, in: 6054 class Foo { 6055 int bar; 6056 } 6057The matcher: 6058 cxxRecordDecl( 6059 optionally(has( 6060 fieldDecl(hasName("bar")).bind("var") 6061 ))).bind("record") 6062will produce a result binding for both "record" and "var". 6063The matcher will produce a "record" binding for even if there is no data 6064member named "bar" in that class. 6065 6066Usable as: Any Matcher 6067</pre></td></tr> 6068 6069 6070<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 6071<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 6072 6073Given 6074 void foo() 6075 { 6076 int i = 3.0; 6077 } 6078The matcher 6079 traverse(TK_IgnoreUnlessSpelledInSource, 6080 varDecl(hasInitializer(floatLiteral().bind("init"))) 6081 ) 6082matches the variable declaration with "init" bound to the "3.0". 6083</pre></td></tr> 6084 6085 6086<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> 6087<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 6088switch statement or conditional operator. 6089 6090Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6091 if (true) {} 6092</pre></td></tr> 6093 6094 6095<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> 6096<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 6097(binary or ternary). 6098 6099Example matches b 6100 condition ? a : b 6101 condition ?: b 6102</pre></td></tr> 6103 6104 6105<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> 6106<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 6107 6108Example 1 (conditional ternary operator): matches a 6109 condition ? a : b 6110 6111Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 6112 condition ?: b 6113</pre></td></tr> 6114 6115 6116<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> 6117<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 6118matches the given matcher. 6119 6120The associated declaration is: 6121- for type nodes, the declaration of the underlying type 6122- for CallExpr, the declaration of the callee 6123- for MemberExpr, the declaration of the referenced member 6124- for CXXConstructExpr, the declaration of the constructor 6125- for CXXNewExpr, the declaration of the operator new 6126- for ObjCIvarExpr, the declaration of the ivar 6127 6128For type nodes, hasDeclaration will generally match the declaration of the 6129sugared type. Given 6130 class X {}; 6131 typedef X Y; 6132 Y y; 6133in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6134typedefDecl. A common use case is to match the underlying, desugared type. 6135This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6136 varDecl(hasType(hasUnqualifiedDesugaredType( 6137 recordType(hasDeclaration(decl()))))) 6138In this matcher, the decl will match the CXXRecordDecl of class X. 6139 6140Usable 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>>, 6141 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>>, 6142 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>>, 6143 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>>, 6144 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>>, 6145 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>>, 6146 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6147</pre></td></tr> 6148 6149 6150<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> 6151<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 6152 6153Given 6154 int i[5]; 6155 void f() { i[1] = 42; } 6156arraySubscriptExpression(hasBase(implicitCastExpr( 6157 hasSourceExpression(declRefExpr())))) 6158 matches i[1] with the declRefExpr() matching i 6159</pre></td></tr> 6160 6161 6162<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> 6163<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 6164 6165Given 6166 int i[5]; 6167 void f() { i[1] = 42; } 6168arraySubscriptExpression(hasIndex(integerLiteral())) 6169 matches i[1] with the integerLiteral() matching 1 6170</pre></td></tr> 6171 6172 6173<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> 6174<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 6175 6176Example matches a (matcher = binaryOperator(hasLHS())) 6177 a || b 6178</pre></td></tr> 6179 6180 6181<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> 6182<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 6183 6184Example matches b (matcher = binaryOperator(hasRHS())) 6185 a || b 6186</pre></td></tr> 6187 6188 6189<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> 6190<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 6191type. 6192 6193Given 6194 struct A {}; 6195 A a[7]; 6196 int b[7]; 6197arrayType(hasElementType(builtinType())) 6198 matches "int b[7]" 6199 6200Usable 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>> 6201</pre></td></tr> 6202 6203 6204<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> 6205<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6206 6207Given 6208 _Atomic(int) i; 6209 _Atomic(float) f; 6210atomicType(hasValueType(isInteger())) 6211 matches "_Atomic(int) i" 6212 6213Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6214</pre></td></tr> 6215 6216 6217<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> 6218<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6219 6220Note: There is no TypeLoc for the deduced type and thus no 6221getDeducedLoc() matcher. 6222 6223Given 6224 auto a = 1; 6225 auto b = 2.0; 6226autoType(hasDeducedType(isInteger())) 6227 matches "auto a" 6228 6229Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6230</pre></td></tr> 6231 6232 6233<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BaseUsingDecl.html">BaseUsingDecl</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> 6234<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 6235 6236Given 6237 namespace X { void b(); } 6238 using X::b; 6239usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 6240 matches using X::b </pre></td></tr> 6241 6242 6243<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> 6244<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6245binary operator matches. 6246</pre></td></tr> 6247 6248 6249<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> 6250<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6251 6252Example matches a (matcher = binaryOperator(hasLHS())) 6253 a || b 6254</pre></td></tr> 6255 6256 6257<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> 6258<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6259 6260Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6261 integerLiteral(equals(2))) 6262 1 + 2 // Match 6263 2 + 1 // Match 6264 1 + 1 // No match 6265 2 + 2 // No match 6266</pre></td></tr> 6267 6268 6269<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> 6270<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6271 6272Example matches b (matcher = binaryOperator(hasRHS())) 6273 a || b 6274</pre></td></tr> 6275 6276 6277<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> 6278<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6279 6280For example, in: 6281void foo() 6282{ 6283 int arr[3]; 6284 auto &[f, s, t] = arr; 6285 6286 f = 42; 6287} 6288The matcher: 6289 bindingDecl(hasName("f"), 6290 forDecomposition(decompositionDecl()) 6291matches 'f' in 'auto &[f, s, t]'. 6292</pre></td></tr> 6293 6294 6295<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> 6296<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6297block. 6298 6299Does not match the 'this' parameter of a method. 6300 6301Given 6302 class X { void f(int x, int y, int z) {} }; 6303cxxMethodDecl(hasAnyParameter(hasName("y"))) 6304 matches f(int x, int y, int z) {} 6305with hasAnyParameter(...) 6306 matching int y 6307 6308For ObjectiveC, given 6309 @interface I - (void) f:(int) y; @end 6310 6311the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6312matches the declaration of method f with hasParameter 6313matching y. 6314 6315For blocks, given 6316 b = ^(int y) { printf("%d", y) }; 6317 6318the matcher blockDecl(hasAnyParameter(hasName("y"))) 6319matches the declaration of the block b with hasParameter 6320matching y. 6321</pre></td></tr> 6322 6323 6324<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> 6325<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6326declaration or a block. 6327 6328Given 6329 class X { void f(int x) {} }; 6330cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6331 matches f(int x) {} 6332with hasParameter(...) 6333 matching int x 6334 6335For ObjectiveC, given 6336 @interface I - (void) f:(int) y; @end 6337 6338the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6339matches the declaration of method f with hasParameter 6340matching y. 6341</pre></td></tr> 6342 6343 6344<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</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> 6345<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. 6346 6347Examples: 6348 int x; 6349declaratorDecl(hasTypeLoc(loc(asString("int")))) 6350 matches int x 6351 6352auto x = int(3); 6353cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6354 matches int(3) 6355 6356struct Foo { Foo(int, int); }; 6357auto x = Foo(1, 2); 6358cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6359 matches Foo(1, 2) 6360 6361Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6362 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6363 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6364 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6365 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6366 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6367 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6368 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6369</pre></td></tr> 6370 6371 6372<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> 6373<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6374pointee matches a given matcher. 6375 6376Given 6377 int *a; 6378 int const *b; 6379 float const *f; 6380pointerType(pointee(isConstQualified(), isInteger())) 6381 matches "int const *b" 6382 6383Usable 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>>, 6384 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>> 6385</pre></td></tr> 6386 6387 6388<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6389<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. 6390 6391Examples: 6392 int x; 6393declaratorDecl(hasTypeLoc(loc(asString("int")))) 6394 matches int x 6395 6396auto x = int(3); 6397cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6398 matches int(3) 6399 6400struct Foo { Foo(int, int); }; 6401auto x = Foo(1, 2); 6402cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6403 matches Foo(1, 2) 6404 6405Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6406 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6407 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6408 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6409 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6410 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6411 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6412 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6413</pre></td></tr> 6414 6415 6416<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6417<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6418declaration's type. 6419 6420In case of a value declaration (for example a variable declaration), 6421this resolves one layer of indirection. For example, in the value 6422declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6423X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6424declaration of x. 6425 6426Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6427 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6428 and friend class X (matcher = friendDecl(hasType("X")) 6429 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6430 cxxRecordDecl(hasName("X")))) 6431 class X {}; 6432 void y(X &x) { x; X z; } 6433 class Y { friend class X; }; 6434 class Z : public virtual X {}; 6435 6436Example matches class Derived 6437(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6438class Base {}; 6439class Derived : Base {}; 6440 6441Usable 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>>, 6442Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6443</pre></td></tr> 6444 6445 6446<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</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_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6447<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6448matcher. 6449 6450Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6451 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6452 and U (matcher = typedefDecl(hasType(asString("int"))) 6453 and friend class X (matcher = friendDecl(hasType("X")) 6454 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6455 asString("class X"))) 6456 class X {}; 6457 void y(X &x) { x; X z; } 6458 typedef int U; 6459 class Y { friend class X; }; 6460 class Z : public virtual X {}; 6461</pre></td></tr> 6462 6463 6464<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> 6465<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6466 6467Given 6468 void f(int i); 6469 int y; 6470 f(y); 6471callExpr( 6472 forEachArgumentWithParam( 6473 declRefExpr(to(varDecl(hasName("y")))), 6474 parmVarDecl(hasType(isInteger())) 6475)) 6476 matches f(y); 6477with declRefExpr(...) 6478 matching int y 6479and parmVarDecl(...) 6480 matching int i 6481</pre></td></tr> 6482 6483 6484<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> 6485<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6486CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6487it works on calls through function pointers as well. 6488 6489The difference is, that function pointers do not provide access to a 6490ParmVarDecl, but only the QualType for each argument. 6491 6492Given 6493 void f(int i); 6494 int y; 6495 f(y); 6496 void (*f_ptr)(int) = f; 6497 f_ptr(y); 6498callExpr( 6499 forEachArgumentWithParamType( 6500 declRefExpr(to(varDecl(hasName("y")))), 6501 qualType(isInteger()).bind("type) 6502)) 6503 matches f(y) and f_ptr(y) 6504with declRefExpr(...) 6505 matching int y 6506and qualType(...) 6507 matching int 6508</pre></td></tr> 6509 6510 6511<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> 6512<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6513expression, or an ObjC-message-send expression. 6514 6515Given 6516 void x(int, int, int) { int y; x(1, y, 42); } 6517callExpr(hasAnyArgument(declRefExpr())) 6518 matches x(1, y, 42) 6519with hasAnyArgument(...) 6520 matching y 6521 6522For ObjectiveC, given 6523 @interface I - (void) f:(int) y; @end 6524 void foo(I *i) { [i f:12]; } 6525objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6526 matches [i f:12] 6527</pre></td></tr> 6528 6529 6530<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> 6531<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6532call expression. 6533 6534Example matches y in x(y) 6535 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6536 void x(int) { int y; x(y); } 6537</pre></td></tr> 6538 6539 6540<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> 6541<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6542matches the given matcher. 6543 6544The associated declaration is: 6545- for type nodes, the declaration of the underlying type 6546- for CallExpr, the declaration of the callee 6547- for MemberExpr, the declaration of the referenced member 6548- for CXXConstructExpr, the declaration of the constructor 6549- for CXXNewExpr, the declaration of the operator new 6550- for ObjCIvarExpr, the declaration of the ivar 6551 6552For type nodes, hasDeclaration will generally match the declaration of the 6553sugared type. Given 6554 class X {}; 6555 typedef X Y; 6556 Y y; 6557in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6558typedefDecl. A common use case is to match the underlying, desugared type. 6559This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6560 varDecl(hasType(hasUnqualifiedDesugaredType( 6561 recordType(hasDeclaration(decl()))))) 6562In this matcher, the decl will match the CXXRecordDecl of class X. 6563 6564Usable 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>>, 6565 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>>, 6566 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>>, 6567 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>>, 6568 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>>, 6569 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>>, 6570 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6571</pre></td></tr> 6572 6573 6574<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> 6575<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6576 6577Given 6578 class A { A() : i(42), j(42) {} int i; int j; }; 6579cxxConstructorDecl(forEachConstructorInitializer( 6580 forField(decl().bind("x")) 6581)) 6582 will trigger two matches, binding for 'i' and 'j' respectively. 6583</pre></td></tr> 6584 6585 6586<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> 6587<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6588 6589Given 6590 struct Foo { 6591 Foo() : foo_(1) { } 6592 int foo_; 6593 }; 6594cxxRecordDecl(has(cxxConstructorDecl( 6595 hasAnyConstructorInitializer(anything()) 6596))) 6597 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6598</pre></td></tr> 6599 6600 6601<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> 6602<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6603 6604Given 6605 struct Foo { 6606 Foo() : foo_(1) { } 6607 int foo_; 6608 }; 6609cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6610 forField(hasName("foo_")))))) 6611 matches Foo 6612with forField matching foo_ 6613</pre></td></tr> 6614 6615 6616<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6617<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. 6618 6619Examples: 6620 int x; 6621declaratorDecl(hasTypeLoc(loc(asString("int")))) 6622 matches int x 6623 6624auto x = int(3); 6625cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6626 matches int(3) 6627 6628struct Foo { Foo(int, int); }; 6629auto x = Foo(1, 2); 6630cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6631 matches Foo(1, 2) 6632 6633Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6634 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6635 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6636 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6637 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6638 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6639 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6640 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6641</pre></td></tr> 6642 6643 6644<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> 6645<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6646 6647Given 6648 struct Foo { 6649 Foo() : foo_(1) { } 6650 int foo_; 6651 }; 6652cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6653 withInitializer(integerLiteral(equals(1))))))) 6654 matches Foo 6655with withInitializer matching (1) 6656</pre></td></tr> 6657 6658 6659<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> 6660<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6661given matcher. Implicit object expressions are included; that is, it matches 6662use of implicit `this`. 6663 6664Given 6665 struct X { 6666 int m; 6667 int f(X x) { x.m; return m; } 6668 }; 6669memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6670 matches `x.m`, but not `m`; however, 6671memberExpr(hasObjectExpression(hasType(pointsTo( 6672 cxxRecordDecl(hasName("X")))))) 6673 matches `m` (aka. `this->m`), but not `x.m`. 6674</pre></td></tr> 6675 6676 6677<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> 6678<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6679 6680 6681<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> 6682<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6683 6684Given: 6685 void foo() { 6686 if (int i = foobar(); i > 0) {} 6687 switch (int i = foobar(); i) {} 6688 for (auto& a = get_range(); auto& x : a) {} 6689 } 6690 void bar() { 6691 if (foobar() > 0) {} 6692 switch (foobar()) {} 6693 for (auto& x : get_range()) {} 6694 } 6695ifStmt(hasInitStatement(anything())) 6696 matches the if statement in foo but not in bar. 6697switchStmt(hasInitStatement(anything())) 6698 matches the switch statement in foo but not in bar. 6699cxxForRangeStmt(hasInitStatement(anything())) 6700 matches the range for statement in foo but not in bar. 6701</pre></td></tr> 6702 6703 6704<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> 6705<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6706 6707Example: 6708 forStmt(hasLoopVariable(anything())) 6709matches 'int x' in 6710 for (int x : a) { } 6711</pre></td></tr> 6712 6713 6714<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> 6715<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6716 6717Example: 6718 forStmt(hasRangeInit(anything())) 6719matches 'a' in 6720 for (int x : a) { } 6721</pre></td></tr> 6722 6723 6724<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6725<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. 6726 6727Examples: 6728 int x; 6729declaratorDecl(hasTypeLoc(loc(asString("int")))) 6730 matches int x 6731 6732auto x = int(3); 6733cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6734 matches int(3) 6735 6736struct Foo { Foo(int, int); }; 6737auto x = Foo(1, 2); 6738cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6739 matches Foo(1, 2) 6740 6741Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6742 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6743 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6744 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6745 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6746 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6747 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6748 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6749</pre></td></tr> 6750 6751 6752<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> 6753<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6754`on`, matches the argument directly without stripping away anything. 6755 6756Given 6757 class Y { public: void m(); }; 6758 Y g(); 6759 class X : public Y { void g(); }; 6760 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6761cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6762 cxxRecordDecl(hasName("Y"))))) 6763 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6764cxxMemberCallExpr(on(callExpr())) 6765 does not match `(g()).m()`, because the parens are not ignored. 6766 6767FIXME: Overload to allow directly matching types? 6768</pre></td></tr> 6769 6770 6771<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> 6772<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6773stripping off any parentheses or implicit casts. 6774 6775Given 6776 class Y { public: void m(); }; 6777 Y g(); 6778 class X : public Y {}; 6779 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6780cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6781 matches `y.m()` and `(g()).m()`. 6782cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6783 matches `x.m()`. 6784cxxMemberCallExpr(on(callExpr())) 6785 matches `(g()).m()`. 6786 6787FIXME: Overload to allow directly matching types? 6788</pre></td></tr> 6789 6790 6791<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> 6792<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6793</pre></td></tr> 6794 6795 6796<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> 6797<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6798matches the InnerMatcher, or is a pointer to a type that matches the 6799InnerMatcher. 6800 6801Given 6802 class Y { public: void m(); }; 6803 class X : public Y { void g(); }; 6804 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6805cxxMemberCallExpr(thisPointerType(hasDeclaration( 6806 cxxRecordDecl(hasName("Y"))))) 6807 matches `y.m()`, `p->m()` and `x.m()`. 6808cxxMemberCallExpr(thisPointerType(hasDeclaration( 6809 cxxRecordDecl(hasName("X"))))) 6810 matches `x.g()`. 6811</pre></td></tr> 6812 6813 6814<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> 6815<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6816produce multiple matches. 6817 6818Given 6819 class A { virtual void f(); }; 6820 class B : public A { void f(); }; 6821 class C : public B { void f(); }; 6822cxxMethodDecl(ofClass(hasName("C")), 6823 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6824 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6825 that B::f is not overridden by C::f). 6826 6827The check can produce multiple matches in case of multiple inheritance, e.g. 6828 class A1 { virtual void f(); }; 6829 class A2 { virtual void f(); }; 6830 class C : public A1, public A2 { void f(); }; 6831cxxMethodDecl(ofClass(hasName("C")), 6832 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6833 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6834 once with "b" binding "A2::f" and "d" binding "C::f". 6835</pre></td></tr> 6836 6837 6838<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> 6839<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6840belongs to. 6841 6842FIXME: Generalize this for other kinds of declarations. 6843FIXME: What other kind of declarations would we need to generalize 6844this to? 6845 6846Example matches A() in the last line 6847 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6848 ofClass(hasName("A")))))) 6849 class A { 6850 public: 6851 A(); 6852 }; 6853 A a = A(); 6854</pre></td></tr> 6855 6856 6857<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> 6858<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6859 6860Given: 6861 MyClass *p1 = new (Storage) MyClass(); 6862cxxNewExpr(hasAnyPlacementArg(anything())) 6863 matches the expression 'new (Storage, 16) MyClass()'. 6864</pre></td></tr> 6865 6866 6867<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> 6868<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6869 6870Given: 6871 MyClass *p1 = new MyClass[10]; 6872cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6873 matches the expression 'new MyClass[10]'. 6874</pre></td></tr> 6875 6876 6877<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> 6878<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6879matches the given matcher. 6880 6881The associated declaration is: 6882- for type nodes, the declaration of the underlying type 6883- for CallExpr, the declaration of the callee 6884- for MemberExpr, the declaration of the referenced member 6885- for CXXConstructExpr, the declaration of the constructor 6886- for CXXNewExpr, the declaration of the operator new 6887- for ObjCIvarExpr, the declaration of the ivar 6888 6889For type nodes, hasDeclaration will generally match the declaration of the 6890sugared type. Given 6891 class X {}; 6892 typedef X Y; 6893 Y y; 6894in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6895typedefDecl. A common use case is to match the underlying, desugared type. 6896This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6897 varDecl(hasType(hasUnqualifiedDesugaredType( 6898 recordType(hasDeclaration(decl()))))) 6899In this matcher, the decl will match the CXXRecordDecl of class X. 6900 6901Usable 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>>, 6902 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>>, 6903 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>>, 6904 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>>, 6905 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>>, 6906 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>>, 6907 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6908</pre></td></tr> 6909 6910 6911<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> 6912<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6913 6914Given: 6915 MyClass *p1 = new (Storage, 16) MyClass(); 6916cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6917 matches the expression 'new (Storage, 16) MyClass()'. 6918</pre></td></tr> 6919 6920 6921<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6922<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. 6923 6924Examples: 6925 int x; 6926declaratorDecl(hasTypeLoc(loc(asString("int")))) 6927 matches int x 6928 6929auto x = int(3); 6930cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6931 matches int(3) 6932 6933struct Foo { Foo(int, int); }; 6934auto x = Foo(1, 2); 6935cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6936 matches Foo(1, 2) 6937 6938Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6939 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6940 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6941 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6942 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6943 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6944 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6945 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6946</pre></td></tr> 6947 6948 6949<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> 6950<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6951binary operator matches. 6952</pre></td></tr> 6953 6954 6955<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> 6956<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6957 6958Example matches a (matcher = binaryOperator(hasLHS())) 6959 a || b 6960</pre></td></tr> 6961 6962 6963<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> 6964<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6965 6966Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6967 integerLiteral(equals(2))) 6968 1 + 2 // Match 6969 2 + 1 // Match 6970 1 + 1 // No match 6971 2 + 2 // No match 6972</pre></td></tr> 6973 6974 6975<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> 6976<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6977 6978Example matches b (matcher = binaryOperator(hasRHS())) 6979 a || b 6980</pre></td></tr> 6981 6982 6983<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> 6984<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6985 6986Example matches true (matcher = hasUnaryOperand( 6987 cxxBoolLiteral(equals(true)))) 6988 !true 6989</pre></td></tr> 6990 6991 6992<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> 6993<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6994 6995Example: 6996matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6997 class Foo; 6998 class Bar : Foo {}; 6999 class Baz : Bar {}; 7000 class SpecialBase; 7001 class Proxy : SpecialBase {}; // matches Proxy 7002 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 7003 7004FIXME: Refactor this and isDerivedFrom to reuse implementation. 7005</pre></td></tr> 7006 7007 7008<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> 7009<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 7010 7011Example: 7012matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 7013 class Foo; 7014 class Bar : Foo {}; 7015 class Baz : Bar {}; 7016 class SpecialBase; 7017 class Proxy : SpecialBase {}; // matches Proxy 7018 class IndirectlyDerived : Proxy {}; // doesn't match 7019</pre></td></tr> 7020 7021 7022<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> 7023<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 7024 7025Given: 7026 class A { void func(); }; 7027 class B { void member(); }; 7028 7029cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 7030A but not B. 7031</pre></td></tr> 7032 7033 7034<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> 7035<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 7036matching Base, or Objective-C classes that directly or indirectly 7037subclass a class matching Base. 7038 7039Note that a class is not considered to be derived from itself. 7040 7041Example matches Y, Z, C (Base == hasName("X")) 7042 class X; 7043 class Y : public X {}; // directly derived 7044 class Z : public Y {}; // indirectly derived 7045 typedef X A; 7046 typedef A B; 7047 class C : public B {}; // derived from a typedef of X 7048 7049In the following example, Bar matches isDerivedFrom(hasName("X")): 7050 class Foo; 7051 typedef Foo X; 7052 class Bar : public Foo {}; // derived from a type that X is a typedef of 7053 7054In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7055 @interface NSObject @end 7056 @interface Bar : NSObject @end 7057 7058Usable 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>> 7059</pre></td></tr> 7060 7061 7062<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> 7063<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7064matching Base. 7065 7066Note that a class is not considered to be derived from itself. 7067 7068Example matches Y, C (Base == hasName("X")) 7069 class X; 7070 class Y : public X {}; // directly derived 7071 class Z : public Y {}; // indirectly derived 7072 typedef X A; 7073 typedef A B; 7074 class C : public B {}; // derived from a typedef of X 7075 7076In the following example, Bar matches isDerivedFrom(hasName("X")): 7077 class Foo; 7078 typedef Foo X; 7079 class Bar : public Foo {}; // derived from a type that X is a typedef of 7080</pre></td></tr> 7081 7082 7083<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> 7084<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7085match Base. 7086</pre></td></tr> 7087 7088 7089<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> 7090<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 7091binary operator matches. 7092</pre></td></tr> 7093 7094 7095<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> 7096<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 7097 7098Example matches a (matcher = binaryOperator(hasLHS())) 7099 a || b 7100</pre></td></tr> 7101 7102 7103<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> 7104<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 7105 7106Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 7107 integerLiteral(equals(2))) 7108 1 + 2 // Match 7109 2 + 1 // Match 7110 1 + 1 // No match 7111 2 + 2 // No match 7112</pre></td></tr> 7113 7114 7115<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> 7116<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 7117 7118Example matches b (matcher = binaryOperator(hasRHS())) 7119 a || b 7120</pre></td></tr> 7121 7122 7123<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7124<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. 7125 7126Examples: 7127 int x; 7128declaratorDecl(hasTypeLoc(loc(asString("int")))) 7129 matches int x 7130 7131auto x = int(3); 7132cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7133 matches int(3) 7134 7135struct Foo { Foo(int, int); }; 7136auto x = Foo(1, 2); 7137cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7138 matches Foo(1, 2) 7139 7140Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7141 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7142 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7143 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7144 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7145 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7146 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7147 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7148</pre></td></tr> 7149 7150 7151<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> 7152<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 7153expression, or an ObjC-message-send expression. 7154 7155Given 7156 void x(int, int, int) { int y; x(1, y, 42); } 7157callExpr(hasAnyArgument(declRefExpr())) 7158 matches x(1, y, 42) 7159with hasAnyArgument(...) 7160 matching y 7161 7162For ObjectiveC, given 7163 @interface I - (void) f:(int) y; @end 7164 void foo(I *i) { [i f:12]; } 7165objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7166 matches [i f:12] 7167</pre></td></tr> 7168 7169 7170<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> 7171<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7172call expression. 7173 7174Example matches y in x(y) 7175 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7176 void x(int) { int y; x(y); } 7177</pre></td></tr> 7178 7179 7180<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7181<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. 7182 7183Examples: 7184 int x; 7185declaratorDecl(hasTypeLoc(loc(asString("int")))) 7186 matches int x 7187 7188auto x = int(3); 7189cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7190 matches int(3) 7191 7192struct Foo { Foo(int, int); }; 7193auto x = Foo(1, 2); 7194cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7195 matches Foo(1, 2) 7196 7197Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7198 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7199 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7200 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7201 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7202 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7203 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7204 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7205</pre></td></tr> 7206 7207 7208<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> 7209<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 7210given matcher. 7211 7212Example matches y.x() (matcher = callExpr(callee( 7213 cxxMethodDecl(hasName("x"))))) 7214 class Y { public: void x(); }; 7215 void z() { Y y; y.x(); } 7216</pre></td></tr> 7217 7218 7219<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> 7220<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 7221 7222Given 7223 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 7224 void f() { f(); } 7225callExpr(callee(expr())) 7226 matches this->x(), x(), y.x(), f() 7227with callee(...) 7228 matching this->x, x, y.x, f respectively 7229 7230Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 7231because this introduces ambiguous overloads with calls to Callee taking a 7232internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 7233implemented in terms of implicit casts. 7234</pre></td></tr> 7235 7236 7237<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> 7238<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 7239 7240Given 7241 void f(int i); 7242 int y; 7243 f(y); 7244callExpr( 7245 forEachArgumentWithParam( 7246 declRefExpr(to(varDecl(hasName("y")))), 7247 parmVarDecl(hasType(isInteger())) 7248)) 7249 matches f(y); 7250with declRefExpr(...) 7251 matching int y 7252and parmVarDecl(...) 7253 matching int i 7254</pre></td></tr> 7255 7256 7257<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> 7258<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 7259CXXConstructExpr. It is very similar to forEachArgumentWithParam but 7260it works on calls through function pointers as well. 7261 7262The difference is, that function pointers do not provide access to a 7263ParmVarDecl, but only the QualType for each argument. 7264 7265Given 7266 void f(int i); 7267 int y; 7268 f(y); 7269 void (*f_ptr)(int) = f; 7270 f_ptr(y); 7271callExpr( 7272 forEachArgumentWithParamType( 7273 declRefExpr(to(varDecl(hasName("y")))), 7274 qualType(isInteger()).bind("type) 7275)) 7276 matches f(y) and f_ptr(y) 7277with declRefExpr(...) 7278 matching int y 7279and qualType(...) 7280 matching int 7281</pre></td></tr> 7282 7283 7284<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> 7285<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 7286expression, or an ObjC-message-send expression. 7287 7288Given 7289 void x(int, int, int) { int y; x(1, y, 42); } 7290callExpr(hasAnyArgument(declRefExpr())) 7291 matches x(1, y, 42) 7292with hasAnyArgument(...) 7293 matching y 7294 7295For ObjectiveC, given 7296 @interface I - (void) f:(int) y; @end 7297 void foo(I *i) { [i f:12]; } 7298objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7299 matches [i f:12] 7300</pre></td></tr> 7301 7302 7303<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> 7304<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 7305call expression. 7306 7307Example matches y in x(y) 7308 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7309 void x(int) { int y; x(y); } 7310</pre></td></tr> 7311 7312 7313<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> 7314<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 7315matches the given matcher. 7316 7317The associated declaration is: 7318- for type nodes, the declaration of the underlying type 7319- for CallExpr, the declaration of the callee 7320- for MemberExpr, the declaration of the referenced member 7321- for CXXConstructExpr, the declaration of the constructor 7322- for CXXNewExpr, the declaration of the operator new 7323- for ObjCIvarExpr, the declaration of the ivar 7324 7325For type nodes, hasDeclaration will generally match the declaration of the 7326sugared type. Given 7327 class X {}; 7328 typedef X Y; 7329 Y y; 7330in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7331typedefDecl. A common use case is to match the underlying, desugared type. 7332This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7333 varDecl(hasType(hasUnqualifiedDesugaredType( 7334 recordType(hasDeclaration(decl()))))) 7335In this matcher, the decl will match the CXXRecordDecl of class X. 7336 7337Usable 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>>, 7338 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>>, 7339 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>>, 7340 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>>, 7341 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>>, 7342 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>>, 7343 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7344</pre></td></tr> 7345 7346 7347<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> 7348<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 7349extension, matches the constant given in the statement. 7350 7351Given 7352 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 7353caseStmt(hasCaseConstant(integerLiteral())) 7354 matches "case 1:" 7355</pre></td></tr> 7356 7357 7358<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> 7359<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 7360or opaque value's source expression matches the given matcher. 7361 7362Example 1: matches "a string" 7363(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7364class URL { URL(string); }; 7365URL url = "a string"; 7366 7367Example 2: matches 'b' (matcher = 7368opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7369int a = b ?: 1; 7370</pre></td></tr> 7371 7372 7373<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> 7374<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7375functionDecl that have at least one TemplateArgument matching the given 7376InnerMatcher. 7377 7378Given 7379 template<typename T> class A {}; 7380 template<> class A<double> {}; 7381 A<int> a; 7382 7383 template<typename T> f() {}; 7384 void func() { f<int>(); }; 7385 7386classTemplateSpecializationDecl(hasAnyTemplateArgument( 7387 refersToType(asString("int")))) 7388 matches the specialization A<int> 7389 7390functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7391 matches the specialization f<int> 7392</pre></td></tr> 7393 7394 7395<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> 7396<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 7397 7398Given 7399 template<typename T> class A {}; #1 7400 template<> class A<int> {}; #2 7401classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7402 matches '#2' with classTemplateDecl() matching the class template 7403 declaration of 'A' at #1. 7404</pre></td></tr> 7405 7406 7407<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> 7408<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7409functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7410 7411Given 7412 template<typename T, typename U> class A {}; 7413 A<bool, int> b; 7414 A<int, bool> c; 7415 7416 template<typename T> void f() {} 7417 void func() { f<int>(); }; 7418classTemplateSpecializationDecl(hasTemplateArgument( 7419 1, refersToType(asString("int")))) 7420 matches the specialization A<bool, int> 7421 7422functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7423 matches the specialization f<int> 7424</pre></td></tr> 7425 7426 7427<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7428<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. 7429 7430Examples: 7431 int x; 7432declaratorDecl(hasTypeLoc(loc(asString("int")))) 7433 matches int x 7434 7435auto x = int(3); 7436cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7437 matches int(3) 7438 7439struct Foo { Foo(int, int); }; 7440auto x = Foo(1, 2); 7441cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7442 matches Foo(1, 2) 7443 7444Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7445 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7446 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7447 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7448 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7449 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7450 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7451 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7452</pre></td></tr> 7453 7454 7455<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> 7456<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7457type. 7458 7459Given 7460 struct A {}; 7461 A a[7]; 7462 int b[7]; 7463arrayType(hasElementType(builtinType())) 7464 matches "int b[7]" 7465 7466Usable 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>> 7467</pre></td></tr> 7468 7469 7470<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7471<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. 7472 7473Examples: 7474 int x; 7475declaratorDecl(hasTypeLoc(loc(asString("int")))) 7476 matches int x 7477 7478auto x = int(3); 7479cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7480 matches int(3) 7481 7482struct Foo { Foo(int, int); }; 7483auto x = Foo(1, 2); 7484cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7485 matches Foo(1, 2) 7486 7487Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7488 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7489 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7490 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7491 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7492 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7493 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7494 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7495</pre></td></tr> 7496 7497 7498<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> 7499<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7500a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7501 7502Given 7503 { {}; 1+2; } 7504hasAnySubstatement(compoundStmt()) 7505 matches '{ {}; 1+2; }' 7506with compoundStmt() 7507 matching '{}' 7508</pre></td></tr> 7509 7510 7511<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> 7512<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7513</pre></td></tr> 7514 7515 7516<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> 7517<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7518matches the given matcher. 7519 7520The associated declaration is: 7521- for type nodes, the declaration of the underlying type 7522- for CallExpr, the declaration of the callee 7523- for MemberExpr, the declaration of the referenced member 7524- for CXXConstructExpr, the declaration of the constructor 7525- for CXXNewExpr, the declaration of the operator new 7526- for ObjCIvarExpr, the declaration of the ivar 7527 7528For type nodes, hasDeclaration will generally match the declaration of the 7529sugared type. Given 7530 class X {}; 7531 typedef X Y; 7532 Y y; 7533in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7534typedefDecl. A common use case is to match the underlying, desugared type. 7535This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7536 varDecl(hasType(hasUnqualifiedDesugaredType( 7537 recordType(hasDeclaration(decl()))))) 7538In this matcher, the decl will match the CXXRecordDecl of class X. 7539 7540Usable 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>>, 7541 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>>, 7542 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>>, 7543 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>>, 7544 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>>, 7545 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>>, 7546 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7547</pre></td></tr> 7548 7549 7550<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasTemplateArgumentLoc0')"><a name="hasTemplateArgumentLoc0Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>> InnerMatcher</td></tr> 7551<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th 7552`TemplateArgumentLoc` matches the given `InnerMatcher`. 7553 7554Given 7555 template<typename T, typename U> class A {}; 7556 A<double, int> b; 7557 A<int, double> c; 7558varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 7559 hasTypeLoc(loc(asString("double"))))))) 7560 matches `A<double, int> b`, but not `A<int, double> c`. 7561</pre></td></tr> 7562 7563 7564<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>> Inner</td></tr> 7565<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches if a node refers to a declaration through a specific 7566using shadow declaration. 7567 7568Examples: 7569 namespace a { int f(); } 7570 using a::f; 7571 int x = f(); 7572declRefExpr(throughUsingDecl(anything())) 7573 matches f 7574 7575 namespace a { class X{}; } 7576 using a::X; 7577 X x; 7578typeLoc(loc(usingType(throughUsingDecl(anything())))) 7579 matches X 7580 7581Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 7582</pre></td></tr> 7583 7584 7585<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> 7586<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7587specified matcher. 7588 7589Example matches x in if(x) 7590 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7591 bool x; 7592 if (x) {} 7593</pre></td></tr> 7594 7595 7596<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> 7597<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7598 7599Note that this does not work for global declarations because the AST 7600breaks up multiple-declaration DeclStmt's into multiple single-declaration 7601DeclStmt's. 7602Example: Given non-global declarations 7603 int a, b = 0; 7604 int c; 7605 int d = 2, e; 7606declStmt(containsDeclaration( 7607 0, varDecl(hasInitializer(anything())))) 7608 matches only 'int d = 2, e;', and 7609declStmt(containsDeclaration(1, varDecl())) 7610 matches 'int a, b = 0' as well as 'int d = 2, e;' 7611 but 'int c;' is not matched. 7612</pre></td></tr> 7613 7614 7615<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> 7616<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7617 7618Given 7619 int a, b; 7620 int c; 7621declStmt(hasSingleDecl(anything())) 7622 matches 'int c;' but not 'int a, b;'. 7623</pre></td></tr> 7624 7625 7626<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7627<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. 7628 7629Examples: 7630 int x; 7631declaratorDecl(hasTypeLoc(loc(asString("int")))) 7632 matches int x 7633 7634auto x = int(3); 7635cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7636 matches int(3) 7637 7638struct Foo { Foo(int, int); }; 7639auto x = Foo(1, 2); 7640cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7641 matches Foo(1, 2) 7642 7643Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7644 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7645 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7646 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7647 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7648 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7649 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7650 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7651</pre></td></tr> 7652 7653 7654<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> 7655<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7656Decl, matches InnerMatcher. 7657 7658Given 7659 namespace N { 7660 namespace M { 7661 class D {}; 7662 } 7663 } 7664 7665cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7666declaration of class D. 7667</pre></td></tr> 7668 7669 7670<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> 7671<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType or UsingType nodes to find the underlying type. 7672 7673Given 7674 decltype(1) a = 1; 7675 decltype(2.0) b = 2.0; 7676decltypeType(hasUnderlyingType(isInteger())) 7677 matches the type of "a" 7678 7679Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 7680</pre></td></tr> 7681 7682 7683<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> 7684<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7685 7686For example, in: 7687void foo() 7688{ 7689 int arr[3]; 7690 auto &[f, s, t] = arr; 7691 7692 f = 42; 7693} 7694The matcher: 7695 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7696matches the decomposition decl with 'f' bound to "fBinding". 7697</pre></td></tr> 7698 7699 7700<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> 7701<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7702 7703For example, in: 7704void foo() 7705{ 7706 int arr[3]; 7707 auto &[f, s, t] = arr; 7708 7709 f = 42; 7710} 7711The matcher: 7712 decompositionDecl(hasBinding(0, 7713 bindingDecl(hasName("f").bind("fBinding")))) 7714matches the decomposition decl with 'f' bound to "fBinding". 7715</pre></td></tr> 7716 7717 7718<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> 7719<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7720 7721 7722<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> 7723<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7724switch statement or conditional operator. 7725 7726Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7727 if (true) {} 7728</pre></td></tr> 7729 7730 7731<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>></td><td class="name" onclick="toggle('hasNamedTypeLoc0')"><a name="hasNamedTypeLoc0Anchor">hasNamedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 7732<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching 7733`InnerMatcher`. 7734 7735Given 7736 template <typename T> 7737 class C {}; 7738 class C<int> c; 7739 7740 class D {}; 7741 class D d; 7742elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc())); 7743 matches the `TypeLoc` of the variable declaration of `c`, but not `d`. 7744</pre></td></tr> 7745 7746 7747<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> 7748<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7749matches InnerMatcher if the qualifier exists. 7750 7751Given 7752 namespace N { 7753 namespace M { 7754 class D {}; 7755 } 7756 } 7757 N::M::D d; 7758 7759elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7760matches the type of the variable declaration of d. 7761</pre></td></tr> 7762 7763 7764<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> 7765<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7766 7767Given 7768 namespace N { 7769 namespace M { 7770 class D {}; 7771 } 7772 } 7773 N::M::D d; 7774 7775elaboratedType(namesType(recordType( 7776hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7777declaration of d. 7778</pre></td></tr> 7779 7780 7781<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> 7782<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7783matches the given matcher. 7784 7785The associated declaration is: 7786- for type nodes, the declaration of the underlying type 7787- for CallExpr, the declaration of the callee 7788- for MemberExpr, the declaration of the referenced member 7789- for CXXConstructExpr, the declaration of the constructor 7790- for CXXNewExpr, the declaration of the operator new 7791- for ObjCIvarExpr, the declaration of the ivar 7792 7793For type nodes, hasDeclaration will generally match the declaration of the 7794sugared type. Given 7795 class X {}; 7796 typedef X Y; 7797 Y y; 7798in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7799typedefDecl. A common use case is to match the underlying, desugared type. 7800This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7801 varDecl(hasType(hasUnqualifiedDesugaredType( 7802 recordType(hasDeclaration(decl()))))) 7803In this matcher, the decl will match the CXXRecordDecl of class X. 7804 7805Usable 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>>, 7806 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>>, 7807 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>>, 7808 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>>, 7809 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>>, 7810 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>>, 7811 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7812</pre></td></tr> 7813 7814 7815<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> 7816<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7817 7818(Note: Clang's AST refers to other conversions as "casts" too, and calls 7819actual casts "explicit" casts.) 7820</pre></td></tr> 7821 7822 7823<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7824<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. 7825 7826Examples: 7827 int x; 7828declaratorDecl(hasTypeLoc(loc(asString("int")))) 7829 matches int x 7830 7831auto x = int(3); 7832cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7833 matches int(3) 7834 7835struct Foo { Foo(int, int); }; 7836auto x = Foo(1, 2); 7837cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7838 matches Foo(1, 2) 7839 7840Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7841 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7842 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7843 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7844 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7845 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7846 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7847 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7848</pre></td></tr> 7849 7850 7851<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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> 7852<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7853declaration's type. 7854 7855In case of a value declaration (for example a variable declaration), 7856this resolves one layer of indirection. For example, in the value 7857declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7858X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7859declaration of x. 7860 7861Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7862 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7863 and friend class X (matcher = friendDecl(hasType("X")) 7864 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7865 cxxRecordDecl(hasName("X")))) 7866 class X {}; 7867 void y(X &x) { x; X z; } 7868 class Y { friend class X; }; 7869 class Z : public virtual X {}; 7870 7871Example matches class Derived 7872(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7873class Base {}; 7874class Derived : Base {}; 7875 7876Usable 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>>, 7877Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7878</pre></td></tr> 7879 7880 7881<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> 7882<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7883matcher. 7884 7885Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7886 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7887 and U (matcher = typedefDecl(hasType(asString("int"))) 7888 and friend class X (matcher = friendDecl(hasType("X")) 7889 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7890 asString("class X"))) 7891 class X {}; 7892 void y(X &x) { x; X z; } 7893 typedef int U; 7894 class Y { friend class X; }; 7895 class Z : public virtual X {}; 7896</pre></td></tr> 7897 7898 7899<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> 7900<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7901elidable constructor and other corresponding bookkeeping nodes. 7902 7903In C++17, elidable copy constructors are no longer being generated in the 7904AST as it is not permitted by the standard. They are, however, part of the 7905AST in C++14 and earlier. So, a matcher must abstract over these differences 7906to work in all language modes. This matcher skips elidable constructor-call 7907AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7908various implicit nodes inside the constructor calls, all of which will not 7909appear in the C++17 AST. 7910 7911Given 7912 7913struct H {}; 7914H G(); 7915void f() { 7916 H D = G(); 7917} 7918 7919``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7920matches ``H D = G()`` in C++11 through C++17 (and beyond). 7921</pre></td></tr> 7922 7923 7924<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> 7925<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7926are stripped off. 7927 7928Parentheses and explicit casts are not discarded. 7929Given 7930 int arr[5]; 7931 int a = 0; 7932 char b = 0; 7933 const int c = a; 7934 int *d = arr; 7935 long e = (long) 0l; 7936The matchers 7937 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7938 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7939would match the declarations for a, b, c, and d, but not e. 7940While 7941 varDecl(hasInitializer(integerLiteral())) 7942 varDecl(hasInitializer(declRefExpr())) 7943only match the declarations for a. 7944</pre></td></tr> 7945 7946 7947<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> 7948<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7949nodes are stripped off. 7950 7951Parentheses and explicit casts are not discarded. 7952Given 7953 class C {}; 7954 C a = C(); 7955 C b; 7956 C c = b; 7957The matchers 7958 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7959would match the declarations for a, b, and c. 7960While 7961 varDecl(hasInitializer(cxxConstructExpr())) 7962only match the declarations for b and c. 7963</pre></td></tr> 7964 7965 7966<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> 7967<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7968casts are stripped off. 7969 7970Implicit and non-C Style casts are also discarded. 7971Given 7972 int a = 0; 7973 char b = (0); 7974 void* c = reinterpret_cast<char*>(0); 7975 char d = char(0); 7976The matcher 7977 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7978would match the declarations for a, b, c, and d. 7979while 7980 varDecl(hasInitializer(integerLiteral())) 7981only match the declaration for a. 7982</pre></td></tr> 7983 7984 7985<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> 7986<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7987parentheses are stripped off. 7988 7989Explicit casts are not discarded. 7990Given 7991 int arr[5]; 7992 int a = 0; 7993 char b = (0); 7994 const int c = a; 7995 int *d = (arr); 7996 long e = ((long) 0l); 7997The matchers 7998 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7999 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 8000would match the declarations for a, b, c, and d, but not e. 8001while 8002 varDecl(hasInitializer(integerLiteral())) 8003 varDecl(hasInitializer(declRefExpr())) 8004would only match the declaration for a. 8005</pre></td></tr> 8006 8007 8008<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> 8009<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 8010 8011Given 8012 const char* str = ("my-string"); 8013The matcher 8014 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 8015would match the implicit cast resulting from the assignment. 8016</pre></td></tr> 8017 8018 8019<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> 8020<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 8021 8022Given 8023 class C { 8024 int a = 2; 8025 int b = 3; 8026 int c; 8027 }; 8028fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 8029 matches 'int a;' but not 'int b;'. 8030fieldDecl(hasInClassInitializer(anything())) 8031 matches 'int a;' and 'int b;' but not 'int c;'. 8032</pre></td></tr> 8033 8034 8035<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> 8036<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 8037 8038 8039<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> 8040<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 8041switch statement or conditional operator. 8042 8043Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8044 if (true) {} 8045</pre></td></tr> 8046 8047 8048<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> 8049<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 8050 8051Example: 8052 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 8053matches '++x' in 8054 for (x; x < N; ++x) { } 8055</pre></td></tr> 8056 8057 8058<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> 8059<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 8060 8061Example: 8062 forStmt(hasLoopInit(declStmt())) 8063matches 'int x = 0' in 8064 for (int x = 0; x < N; ++x) { } 8065</pre></td></tr> 8066 8067 8068<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</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> 8069<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8070declaration's type. 8071 8072In case of a value declaration (for example a variable declaration), 8073this resolves one layer of indirection. For example, in the value 8074declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8075X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8076declaration of x. 8077 8078Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8079 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8080 and friend class X (matcher = friendDecl(hasType("X")) 8081 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8082 cxxRecordDecl(hasName("X")))) 8083 class X {}; 8084 void y(X &x) { x; X z; } 8085 class Y { friend class X; }; 8086 class Z : public virtual X {}; 8087 8088Example matches class Derived 8089(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8090class Base {}; 8091class Derived : Base {}; 8092 8093Usable 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>>, 8094Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8095</pre></td></tr> 8096 8097 8098<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> 8099<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 8100matcher. 8101 8102Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8103 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8104 and U (matcher = typedefDecl(hasType(asString("int"))) 8105 and friend class X (matcher = friendDecl(hasType("X")) 8106 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8107 asString("class X"))) 8108 class X {}; 8109 void y(X &x) { x; X z; } 8110 typedef int U; 8111 class Y { friend class X; }; 8112 class Z : public virtual X {}; 8113</pre></td></tr> 8114 8115 8116<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> 8117<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 8118Note that this matcher matches all the declarations of a function whose 8119body is present in the AST. 8120 8121Given 8122 void f(); 8123 void f() {} 8124 void g(); 8125functionDecl(hasAnyBody(compoundStmt())) 8126 matches both 'void f();' 8127 and 'void f() {}' 8128with compoundStmt() 8129 matching '{}' 8130 but does not match 'void g();' 8131</pre></td></tr> 8132 8133 8134<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> 8135<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 8136block. 8137 8138Does not match the 'this' parameter of a method. 8139 8140Given 8141 class X { void f(int x, int y, int z) {} }; 8142cxxMethodDecl(hasAnyParameter(hasName("y"))) 8143 matches f(int x, int y, int z) {} 8144with hasAnyParameter(...) 8145 matching int y 8146 8147For ObjectiveC, given 8148 @interface I - (void) f:(int) y; @end 8149 8150the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8151matches the declaration of method f with hasParameter 8152matching y. 8153 8154For blocks, given 8155 b = ^(int y) { printf("%d", y) }; 8156 8157the matcher blockDecl(hasAnyParameter(hasName("y"))) 8158matches the declaration of the block b with hasParameter 8159matching y. 8160</pre></td></tr> 8161 8162 8163<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> 8164<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8165functionDecl that have at least one TemplateArgument matching the given 8166InnerMatcher. 8167 8168Given 8169 template<typename T> class A {}; 8170 template<> class A<double> {}; 8171 A<int> a; 8172 8173 template<typename T> f() {}; 8174 void func() { f<int>(); }; 8175 8176classTemplateSpecializationDecl(hasAnyTemplateArgument( 8177 refersToType(asString("int")))) 8178 matches the specialization A<int> 8179 8180functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8181 matches the specialization f<int> 8182</pre></td></tr> 8183 8184 8185<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> 8186<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 8187 8188 8189<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> 8190<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 8191declaration. 8192 8193Given 8194 template<bool b> 8195 struct S { 8196 S(int); // #1 8197 explicit S(double); // #2 8198 operator int(); // #3 8199 explicit operator bool(); // #4 8200 explicit(false) S(bool) // # 7 8201 explicit(true) S(char) // # 8 8202 explicit(b) S(S) // # 9 8203 }; 8204 S(int) -> S<true> // #5 8205 explicit S(double) -> S<false> // #6 8206cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 8207cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 8208cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 8209</pre></td></tr> 8210 8211 8212<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> 8213<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 8214declaration or a block. 8215 8216Given 8217 class X { void f(int x) {} }; 8218cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8219 matches f(int x) {} 8220with hasParameter(...) 8221 matching int x 8222 8223For ObjectiveC, given 8224 @interface I - (void) f:(int) y; @end 8225 8226the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8227matches the declaration of method f with hasParameter 8228matching y. 8229</pre></td></tr> 8230 8231 8232<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasReturnTypeLoc0')"><a name="hasReturnTypeLoc0Anchor">hasReturnTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> ReturnMatcher</td></tr> 8233<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`. 8234 8235Given 8236 int f() { return 5; } 8237 void g() {} 8238functionDecl(hasReturnTypeLoc(loc(asString("int")))) 8239 matches the declaration of `f`, but not `g`. 8240</pre></td></tr> 8241 8242 8243<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> 8244<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8245functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8246 8247Given 8248 template<typename T, typename U> class A {}; 8249 A<bool, int> b; 8250 A<int, bool> c; 8251 8252 template<typename T> void f() {} 8253 void func() { f<int>(); }; 8254classTemplateSpecializationDecl(hasTemplateArgument( 8255 1, refersToType(asString("int")))) 8256 matches the specialization A<bool, int> 8257 8258functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8259 matches the specialization f<int> 8260</pre></td></tr> 8261 8262 8263<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> 8264<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 8265 8266Given: 8267 class X { int f() { return 1; } }; 8268cxxMethodDecl(returns(asString("int"))) 8269 matches int f() { return 1; } 8270</pre></td></tr> 8271 8272 8273<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> 8274<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 8275switch statement or conditional operator. 8276 8277Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8278 if (true) {} 8279</pre></td></tr> 8280 8281 8282<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> 8283<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 8284 8285Given 8286 if (A* a = GetAPointer()) {} 8287hasConditionVariableStatement(...) 8288 matches 'A* a = GetAPointer()'. 8289</pre></td></tr> 8290 8291 8292<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> 8293<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 8294 8295Examples matches the if statement 8296 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 8297 if (false) false; else true; 8298</pre></td></tr> 8299 8300 8301<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> 8302<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 8303 8304Given: 8305 void foo() { 8306 if (int i = foobar(); i > 0) {} 8307 switch (int i = foobar(); i) {} 8308 for (auto& a = get_range(); auto& x : a) {} 8309 } 8310 void bar() { 8311 if (foobar() > 0) {} 8312 switch (foobar()) {} 8313 for (auto& x : get_range()) {} 8314 } 8315ifStmt(hasInitStatement(anything())) 8316 matches the if statement in foo but not in bar. 8317switchStmt(hasInitStatement(anything())) 8318 matches the switch statement in foo but not in bar. 8319cxxForRangeStmt(hasInitStatement(anything())) 8320 matches the range for statement in foo but not in bar. 8321</pre></td></tr> 8322 8323 8324<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> 8325<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 8326 8327Examples matches the if statement 8328 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 8329 if (false) true; else false; 8330</pre></td></tr> 8331 8332 8333<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> 8334<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 8335matcher. 8336 8337FIXME: Unit test this matcher 8338</pre></td></tr> 8339 8340 8341<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> 8342<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 8343 8344Example matches y. 8345 (matcher = initListExpr(hasInit(0, expr()))) 8346 int x{y}. 8347</pre></td></tr> 8348 8349 8350<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> 8351<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 8352(if expression have it). 8353</pre></td></tr> 8354 8355 8356<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> 8357<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 8358matches the given matcher. 8359 8360The associated declaration is: 8361- for type nodes, the declaration of the underlying type 8362- for CallExpr, the declaration of the callee 8363- for MemberExpr, the declaration of the referenced member 8364- for CXXConstructExpr, the declaration of the constructor 8365- for CXXNewExpr, the declaration of the operator new 8366- for ObjCIvarExpr, the declaration of the ivar 8367 8368For type nodes, hasDeclaration will generally match the declaration of the 8369sugared type. Given 8370 class X {}; 8371 typedef X Y; 8372 Y y; 8373in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8374typedefDecl. A common use case is to match the underlying, desugared type. 8375This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8376 varDecl(hasType(hasUnqualifiedDesugaredType( 8377 recordType(hasDeclaration(decl()))))) 8378In this matcher, the decl will match the CXXRecordDecl of class X. 8379 8380Usable 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>>, 8381 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>>, 8382 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>>, 8383 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>>, 8384 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>>, 8385 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>>, 8386 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8387</pre></td></tr> 8388 8389 8390<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> 8391<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 8392matches the given matcher. 8393 8394The associated declaration is: 8395- for type nodes, the declaration of the underlying type 8396- for CallExpr, the declaration of the callee 8397- for MemberExpr, the declaration of the referenced member 8398- for CXXConstructExpr, the declaration of the constructor 8399- for CXXNewExpr, the declaration of the operator new 8400- for ObjCIvarExpr, the declaration of the ivar 8401 8402For type nodes, hasDeclaration will generally match the declaration of the 8403sugared type. Given 8404 class X {}; 8405 typedef X Y; 8406 Y y; 8407in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8408typedefDecl. A common use case is to match the underlying, desugared type. 8409This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8410 varDecl(hasType(hasUnqualifiedDesugaredType( 8411 recordType(hasDeclaration(decl()))))) 8412In this matcher, the decl will match the CXXRecordDecl of class X. 8413 8414Usable 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>>, 8415 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>>, 8416 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>>, 8417 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>>, 8418 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>>, 8419 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>>, 8420 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8421</pre></td></tr> 8422 8423 8424<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('capturesVar0')"><a name="capturesVar0Anchor">capturesVar</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 8425<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The 8426`VarDecl` can be a separate variable that is captured by value or 8427reference, or a synthesized variable if the capture has an initializer. 8428 8429Given 8430 void foo() { 8431 int x; 8432 auto f = [x](){}; 8433 auto g = [x = 1](){}; 8434 } 8435In the matcher 8436lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))), 8437capturesVar(hasName("x")) matches `x` and `x = 1`. 8438</pre></td></tr> 8439 8440 8441<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('forEachLambdaCapture0')"><a name="forEachLambdaCapture0Anchor">forEachLambdaCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>> InnerMatcher</td></tr> 8442<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression. 8443 8444Given 8445 int main() { 8446 int x, y; 8447 float z; 8448 auto f = [=]() { return x + y + z; }; 8449 } 8450lambdaExpr(forEachLambdaCapture( 8451 lambdaCapture(capturesVar(varDecl(hasType(isInteger())))))) 8452will trigger two matches, binding for 'x' and 'y' respectively. 8453</pre></td></tr> 8454 8455 8456<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_1LambdaCapture.html">LambdaCapture</a>> InnerMatcher</td></tr> 8457<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression. 8458 8459Given 8460 void foo() { 8461 int t = 5; 8462 auto f = [=](){ return t; }; 8463 } 8464lambdaExpr(hasAnyCapture(lambdaCapture())) and 8465lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t"))))) 8466 both match `[=](){ return t; }`. 8467</pre></td></tr> 8468 8469 8470<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> 8471<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 8472matches the given matcher. 8473 8474The associated declaration is: 8475- for type nodes, the declaration of the underlying type 8476- for CallExpr, the declaration of the callee 8477- for MemberExpr, the declaration of the referenced member 8478- for CXXConstructExpr, the declaration of the constructor 8479- for CXXNewExpr, the declaration of the operator new 8480- for ObjCIvarExpr, the declaration of the ivar 8481 8482For type nodes, hasDeclaration will generally match the declaration of the 8483sugared type. Given 8484 class X {}; 8485 typedef X Y; 8486 Y y; 8487in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8488typedefDecl. A common use case is to match the underlying, desugared type. 8489This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8490 varDecl(hasType(hasUnqualifiedDesugaredType( 8491 recordType(hasDeclaration(decl()))))) 8492In this matcher, the decl will match the CXXRecordDecl of class X. 8493 8494Usable 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>>, 8495 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>>, 8496 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>>, 8497 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>>, 8498 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>>, 8499 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>>, 8500 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8501</pre></td></tr> 8502 8503 8504<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> 8505<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 8506given matcher. Implicit object expressions are included; that is, it matches 8507use of implicit `this`. 8508 8509Given 8510 struct X { 8511 int m; 8512 int f(X x) { x.m; return m; } 8513 }; 8514memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8515 matches `x.m`, but not `m`; however, 8516memberExpr(hasObjectExpression(hasType(pointsTo( 8517 cxxRecordDecl(hasName("X")))))) 8518 matches `m` (aka. `this->m`), but not `x.m`. 8519</pre></td></tr> 8520 8521 8522<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> 8523<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 8524given matcher. 8525 8526Given 8527 struct { int first, second; } first, second; 8528 int i(second.first); 8529 int j(first.second); 8530memberExpr(member(hasName("first"))) 8531 matches second.first 8532 but not first.second (because the member name there is "second"). 8533</pre></td></tr> 8534 8535 8536<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> 8537<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 8538pointee matches a given matcher. 8539 8540Given 8541 int *a; 8542 int const *b; 8543 float const *f; 8544pointerType(pointee(isConstQualified(), isInteger())) 8545 matches "int const *b" 8546 8547Usable 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>>, 8548 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>> 8549</pre></td></tr> 8550 8551 8552<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> 8553<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 8554matcher. 8555 8556Given 8557 namespace N { template<class T> void f(T t); } 8558 template <class T> void g() { using N::f; f(T()); } 8559unresolvedLookupExpr(hasAnyDeclaration( 8560 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 8561 matches the use of f in g() . 8562</pre></td></tr> 8563 8564 8565<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> 8566<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8567 8568Given 8569 struct A { struct B { struct C {}; }; }; 8570 A::B::C c; 8571nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8572 matches "A::" 8573</pre></td></tr> 8574 8575 8576<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> 8577<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8578NestedNameSpecifier-matcher matches. 8579</pre></td></tr> 8580 8581 8582<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> 8583<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8584given TypeLoc. 8585 8586Given 8587 struct A { struct B { struct C {}; }; }; 8588 A::B::C c; 8589nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8590 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8591 matches "A::" 8592</pre></td></tr> 8593 8594 8595<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> 8596<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8597 8598Given 8599 struct A { struct B { struct C {}; }; }; 8600 A::B::C c; 8601nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8602 matches "A::" 8603</pre></td></tr> 8604 8605 8606<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> 8607<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8608given namespace matcher. 8609 8610Given 8611 namespace ns { struct A {}; } 8612 ns::A a; 8613nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8614 matches "ns::" 8615</pre></td></tr> 8616 8617 8618<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> 8619<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8620given QualType matcher without qualifiers. 8621 8622Given 8623 struct A { struct B { struct C {}; }; }; 8624 A::B::C c; 8625nestedNameSpecifier(specifiesType( 8626 hasDeclaration(cxxRecordDecl(hasName("A"))) 8627)) 8628 matches "A::" 8629</pre></td></tr> 8630 8631 8632<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> 8633<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8634 8635Given 8636 8637 #pragma omp parallel 8638 #pragma omp parallel default(none) 8639 8640``ompExecutableDirective(hasAnyClause(anything()))`` matches 8641``omp parallel default(none)``. 8642</pre></td></tr> 8643 8644 8645<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> 8646<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8647 8648Prerequisite: the executable directive must not be standalone directive. 8649If it is, it will never match. 8650 8651Given 8652 8653 #pragma omp parallel 8654 ; 8655 #pragma omp parallel 8656 {} 8657 8658``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8659</pre></td></tr> 8660 8661 8662<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> 8663<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8664matching Base, or Objective-C classes that directly or indirectly 8665subclass a class matching Base. 8666 8667Note that a class is not considered to be derived from itself. 8668 8669Example matches Y, Z, C (Base == hasName("X")) 8670 class X; 8671 class Y : public X {}; // directly derived 8672 class Z : public Y {}; // indirectly derived 8673 typedef X A; 8674 typedef A B; 8675 class C : public B {}; // derived from a typedef of X 8676 8677In the following example, Bar matches isDerivedFrom(hasName("X")): 8678 class Foo; 8679 typedef Foo X; 8680 class Bar : public Foo {}; // derived from a type that X is a typedef of 8681 8682In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8683 @interface NSObject @end 8684 @interface Bar : NSObject @end 8685 8686Usable 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>> 8687</pre></td></tr> 8688 8689 8690<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> 8691<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8692matching Base. 8693 8694Note that a class is not considered to be derived from itself. 8695 8696Example matches Y, C (Base == hasName("X")) 8697 class X; 8698 class Y : public X {}; // directly derived 8699 class Z : public Y {}; // indirectly derived 8700 typedef X A; 8701 typedef A B; 8702 class C : public B {}; // derived from a typedef of X 8703 8704In the following example, Bar matches isDerivedFrom(hasName("X")): 8705 class Foo; 8706 typedef Foo X; 8707 class Bar : public Foo {}; // derived from a type that X is a typedef of 8708</pre></td></tr> 8709 8710 8711<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> 8712<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8713match Base. 8714</pre></td></tr> 8715 8716 8717<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> 8718<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8719expression, or an ObjC-message-send expression. 8720 8721Given 8722 void x(int, int, int) { int y; x(1, y, 42); } 8723callExpr(hasAnyArgument(declRefExpr())) 8724 matches x(1, y, 42) 8725with hasAnyArgument(...) 8726 matching y 8727 8728For ObjectiveC, given 8729 @interface I - (void) f:(int) y; @end 8730 void foo(I *i) { [i f:12]; } 8731objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8732 matches [i f:12] 8733</pre></td></tr> 8734 8735 8736<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> 8737<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8738call expression. 8739 8740Example matches y in x(y) 8741 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8742 void x(int) { int y; x(y); } 8743</pre></td></tr> 8744 8745 8746<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> 8747<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8748and the inner matcher matches on that instance. 8749 8750For example the method call in 8751 NSString *x = @"hello"; 8752 [x containsString:@"h"]; 8753is matched by 8754objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8755</pre></td></tr> 8756 8757 8758<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> 8759<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8760 8761Example 8762matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8763matches the [webView ...] message invocation. 8764 NSString *webViewJavaScript = ... 8765 UIWebView *webView = ... 8766 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8767</pre></td></tr> 8768 8769 8770<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> 8771<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8772block. 8773 8774Does not match the 'this' parameter of a method. 8775 8776Given 8777 class X { void f(int x, int y, int z) {} }; 8778cxxMethodDecl(hasAnyParameter(hasName("y"))) 8779 matches f(int x, int y, int z) {} 8780with hasAnyParameter(...) 8781 matching int y 8782 8783For ObjectiveC, given 8784 @interface I - (void) f:(int) y; @end 8785 8786the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8787matches the declaration of method f with hasParameter 8788matching y. 8789 8790For blocks, given 8791 b = ^(int y) { printf("%d", y) }; 8792 8793the matcher blockDecl(hasAnyParameter(hasName("y"))) 8794matches the declaration of the block b with hasParameter 8795matching y. 8796</pre></td></tr> 8797 8798 8799<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> 8800<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8801declaration or a block. 8802 8803Given 8804 class X { void f(int x) {} }; 8805cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8806 matches f(int x) {} 8807with hasParameter(...) 8808 matching int x 8809 8810For ObjectiveC, given 8811 @interface I - (void) f:(int) y; @end 8812 8813the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8814matches the declaration of method f with hasParameter 8815matching y. 8816</pre></td></tr> 8817 8818 8819<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 8820<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. 8821 8822Examples: 8823 int x; 8824declaratorDecl(hasTypeLoc(loc(asString("int")))) 8825 matches int x 8826 8827auto x = int(3); 8828cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8829 matches int(3) 8830 8831struct Foo { Foo(int, int); }; 8832auto x = Foo(1, 2); 8833cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8834 matches Foo(1, 2) 8835 8836Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 8837 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 8838 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 8839 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8840 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 8841 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 8842 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 8843 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8844</pre></td></tr> 8845 8846 8847<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> 8848<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8849or opaque value's source expression matches the given matcher. 8850 8851Example 1: matches "a string" 8852(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8853class URL { URL(string); }; 8854URL url = "a string"; 8855 8856Example 2: matches 'b' (matcher = 8857opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8858int a = b ?: 1; 8859</pre></td></tr> 8860 8861 8862<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> 8863<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8864overloads matches the given matcher. 8865 8866Given 8867 template <typename T> void foo(T); 8868 template <typename T> void bar(T); 8869 template <typename T> void baz(T t) { 8870 foo(t); 8871 bar(t); 8872 } 8873unresolvedLookupExpr(hasAnyDeclaration( 8874 functionTemplateDecl(hasName("foo")))) 8875 matches foo in foo(t); but not bar in bar(t); 8876</pre></td></tr> 8877 8878 8879<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> 8880<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8881 8882Given 8883 int (*ptr_to_array)[4]; 8884 int (*ptr_to_func)(int); 8885 8886varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8887ptr_to_func but not ptr_to_array. 8888 8889Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8890</pre></td></tr> 8891 8892 8893<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>></td><td class="name" onclick="toggle('hasPointeeLoc0')"><a name="hasPointeeLoc0Anchor">hasPointeeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> PointeeMatcher</td></tr> 8894<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching 8895`PointeeMatcher`. 8896 8897Given 8898 int* x; 8899pointerTypeLoc(hasPointeeLoc(loc(asString("int")))) 8900 matches `int*`. 8901</pre></td></tr> 8902 8903 8904<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> 8905<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8906pointee matches a given matcher. 8907 8908Given 8909 int *a; 8910 int const *b; 8911 float const *f; 8912pointerType(pointee(isConstQualified(), isInteger())) 8913 matches "int const *b" 8914 8915Usable 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>>, 8916 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>> 8917</pre></td></tr> 8918 8919 8920<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> 8921<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8922 8923Given: 8924 typedef int &int_ref; 8925 int a; 8926 int_ref b = a; 8927 8928varDecl(hasType(qualType(referenceType()))))) will not match the 8929declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8930</pre></td></tr> 8931 8932 8933<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> 8934<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8935matches the given matcher. 8936 8937The associated declaration is: 8938- for type nodes, the declaration of the underlying type 8939- for CallExpr, the declaration of the callee 8940- for MemberExpr, the declaration of the referenced member 8941- for CXXConstructExpr, the declaration of the constructor 8942- for CXXNewExpr, the declaration of the operator new 8943- for ObjCIvarExpr, the declaration of the ivar 8944 8945For type nodes, hasDeclaration will generally match the declaration of the 8946sugared type. Given 8947 class X {}; 8948 typedef X Y; 8949 Y y; 8950in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8951typedefDecl. A common use case is to match the underlying, desugared type. 8952This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8953 varDecl(hasType(hasUnqualifiedDesugaredType( 8954 recordType(hasDeclaration(decl()))))) 8955In this matcher, the decl will match the CXXRecordDecl of class X. 8956 8957Usable 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>>, 8958 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>>, 8959 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>>, 8960 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>>, 8961 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>>, 8962 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>>, 8963 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8964</pre></td></tr> 8965 8966 8967<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> 8968<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8969 8970Given 8971 void (*fp)(void); 8972The matcher 8973 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8974would match the declaration for fp. 8975</pre></td></tr> 8976 8977 8978<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> 8979<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8980</pre></td></tr> 8981 8982 8983<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> 8984<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8985matches the specified matcher. 8986 8987Example matches y->x() 8988 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8989 cxxRecordDecl(hasName("Y"))))))) 8990 class Y { public: void x(); }; 8991 void z() { Y *y; y->x(); } 8992</pre></td></tr> 8993 8994 8995<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> 8996<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8997</pre></td></tr> 8998 8999 9000<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> 9001<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 9002type matches the specified matcher. 9003 9004Example matches X &x and const X &y 9005 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 9006 class X { 9007 void a(X b) { 9008 X &x = b; 9009 const X &y = b; 9010 } 9011 }; 9012</pre></td></tr> 9013 9014 9015<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>></td><td class="name" onclick="toggle('hasUnqualifiedLoc0')"><a name="hasUnqualifiedLoc0Anchor">hasUnqualifiedLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 9016<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching 9017`InnerMatcher`. 9018 9019Given 9020 int* const x; 9021 const int y; 9022qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc())) 9023 matches the `TypeLoc` of the variable declaration of `x`, but not `y`. 9024</pre></td></tr> 9025 9026 9027<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> 9028<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 9029matches the given matcher. 9030 9031The associated declaration is: 9032- for type nodes, the declaration of the underlying type 9033- for CallExpr, the declaration of the callee 9034- for MemberExpr, the declaration of the referenced member 9035- for CXXConstructExpr, the declaration of the constructor 9036- for CXXNewExpr, the declaration of the operator new 9037- for ObjCIvarExpr, the declaration of the ivar 9038 9039For type nodes, hasDeclaration will generally match the declaration of the 9040sugared type. Given 9041 class X {}; 9042 typedef X Y; 9043 Y y; 9044in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9045typedefDecl. A common use case is to match the underlying, desugared type. 9046This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9047 varDecl(hasType(hasUnqualifiedDesugaredType( 9048 recordType(hasDeclaration(decl()))))) 9049In this matcher, the decl will match the CXXRecordDecl of class X. 9050 9051Usable 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>>, 9052 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>>, 9053 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>>, 9054 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>>, 9055 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>>, 9056 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>>, 9057 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9058</pre></td></tr> 9059 9060 9061<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>></td><td class="name" onclick="toggle('hasReferentLoc0')"><a name="hasReferentLoc0Anchor">hasReferentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> ReferentMatcher</td></tr> 9062<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching 9063`ReferentMatcher`. 9064 9065Given 9066 int x = 3; 9067 int& xx = x; 9068referenceTypeLoc(hasReferentLoc(loc(asString("int")))) 9069 matches `int&`. 9070</pre></td></tr> 9071 9072 9073<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> 9074<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 9075pointee matches a given matcher. 9076 9077Given 9078 int *a; 9079 int const *b; 9080 float const *f; 9081pointerType(pointee(isConstQualified(), isInteger())) 9082 matches "int const *b" 9083 9084Usable 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>>, 9085 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>> 9086</pre></td></tr> 9087 9088 9089<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> 9090<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 9091 9092Given 9093 return a + b; 9094hasReturnValue(binaryOperator()) 9095 matches 'return a + b' 9096with binaryOperator() 9097 matching 'a + b' 9098</pre></td></tr> 9099 9100 9101<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> 9102<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 9103a given matcher. Also matches StmtExprs that have CompoundStmt as children. 9104 9105Given 9106 { {}; 1+2; } 9107hasAnySubstatement(compoundStmt()) 9108 matches '{ {}; 1+2; }' 9109with compoundStmt() 9110 matching '{}' 9111</pre></td></tr> 9112 9113 9114<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> 9115<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9116alignof. 9117</pre></td></tr> 9118 9119 9120<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9121<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement 9122belongs to. 9123 9124Given: 9125F& operator=(const F& o) { 9126 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9127 return *this; 9128} 9129returnStmt(forCallable(functionDecl(hasName("operator=")))) 9130 matches 'return *this' 9131 but does not match 'return v > 0' 9132 9133Given: 9134-(void) foo { 9135 int x = 1; 9136 dispatch_sync(queue, ^{ int y = 2; }); 9137} 9138declStmt(forCallable(objcMethodDecl())) 9139 matches 'int x = 1' 9140 but does not match 'int y = 2'. 9141whereas declStmt(forCallable(blockDecl())) 9142 matches 'int y = 2' 9143 but does not match 'int x = 1'. 9144</pre></td></tr> 9145 9146 9147<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> 9148<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to. 9149 9150Deprecated. Use forCallable() to correctly handle the situation when 9151the declaration is not a function (but a block or an Objective-C method). 9152forFunction() not only fails to take non-functions into account but also 9153may match the wrong declaration in their presence. 9154 9155Given: 9156F& operator=(const F& o) { 9157 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9158 return *this; 9159} 9160returnStmt(forFunction(hasName("operator="))) 9161 matches 'return *this' 9162 but does not match 'return v > 0' 9163</pre></td></tr> 9164 9165 9166<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> 9167<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9168sizeof. 9169</pre></td></tr> 9170 9171 9172<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> 9173<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 9174type that matches the provided matcher. 9175 9176Given 9177 template <typename T> 9178 double F(T t); 9179 int i; 9180 double j = F(i); 9181 9182substTemplateTypeParmType(hasReplacementType(type())) matches int 9183</pre></td></tr> 9184 9185 9186<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> 9187<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 9188statement. This matcher may produce multiple matches. 9189 9190Given 9191 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 9192switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 9193 matches four times, with "c" binding each of "case 1:", "case 2:", 9194"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 9195"switch (1)", "switch (2)" and "switch (2)". 9196</pre></td></tr> 9197 9198 9199<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> 9200<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 9201switch statement or conditional operator. 9202 9203Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9204 if (true) {} 9205</pre></td></tr> 9206 9207 9208<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> 9209<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 9210 9211Given: 9212 void foo() { 9213 if (int i = foobar(); i > 0) {} 9214 switch (int i = foobar(); i) {} 9215 for (auto& a = get_range(); auto& x : a) {} 9216 } 9217 void bar() { 9218 if (foobar() > 0) {} 9219 switch (foobar()) {} 9220 for (auto& x : get_range()) {} 9221 } 9222ifStmt(hasInitStatement(anything())) 9223 matches the if statement in foo but not in bar. 9224switchStmt(hasInitStatement(anything())) 9225 matches the switch statement in foo but not in bar. 9226cxxForRangeStmt(hasInitStatement(anything())) 9227 matches the range for statement in foo but not in bar. 9228</pre></td></tr> 9229 9230 9231<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> 9232<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 9233matches the given matcher. 9234 9235The associated declaration is: 9236- for type nodes, the declaration of the underlying type 9237- for CallExpr, the declaration of the callee 9238- for MemberExpr, the declaration of the referenced member 9239- for CXXConstructExpr, the declaration of the constructor 9240- for CXXNewExpr, the declaration of the operator new 9241- for ObjCIvarExpr, the declaration of the ivar 9242 9243For type nodes, hasDeclaration will generally match the declaration of the 9244sugared type. Given 9245 class X {}; 9246 typedef X Y; 9247 Y y; 9248in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9249typedefDecl. A common use case is to match the underlying, desugared type. 9250This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9251 varDecl(hasType(hasUnqualifiedDesugaredType( 9252 recordType(hasDeclaration(decl()))))) 9253In this matcher, the decl will match the CXXRecordDecl of class X. 9254 9255Usable 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>>, 9256 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>>, 9257 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>>, 9258 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>>, 9259 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>>, 9260 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>>, 9261 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9262</pre></td></tr> 9263 9264 9265<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 9266<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. 9267 9268Examples: 9269 int x; 9270declaratorDecl(hasTypeLoc(loc(asString("int")))) 9271 matches int x 9272 9273auto x = int(3); 9274cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9275 matches int(3) 9276 9277struct Foo { Foo(int, int); }; 9278auto x = Foo(1, 2); 9279cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9280 matches Foo(1, 2) 9281 9282Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 9283 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 9284 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 9285 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9286 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 9287 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 9288 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 9289 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9290</pre></td></tr> 9291 9292 9293<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> 9294<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 9295 9296Given 9297 struct B { int next; }; 9298 template<int(B::*next_ptr)> struct A {}; 9299 A<&B::next> a; 9300templateSpecializationType(hasAnyTemplateArgument( 9301 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 9302 matches the specialization A<&B::next> with fieldDecl(...) matching 9303 B::next 9304</pre></td></tr> 9305 9306 9307<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> 9308<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 9309declaration. 9310 9311Given 9312 struct B { int next; }; 9313 template<int(B::*next_ptr)> struct A {}; 9314 A<&B::next> a; 9315classTemplateSpecializationDecl(hasAnyTemplateArgument( 9316 refersToDeclaration(fieldDecl(hasName("next"))))) 9317 matches the specialization A<&B::next> with fieldDecl(...) matching 9318 B::next 9319</pre></td></tr> 9320 9321 9322<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> 9323<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 9324 9325Given 9326 template<int T> struct C {}; 9327 C<42> c; 9328classTemplateSpecializationDecl( 9329 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 9330 matches the implicit instantiation of C in C<42>. 9331</pre></td></tr> 9332 9333 9334<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> 9335<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 9336 9337Given 9338 template<template <typename> class S> class X {}; 9339 template<typename T> class Y {}; 9340 X<Y> xi; 9341classTemplateSpecializationDecl(hasAnyTemplateArgument( 9342 refersToTemplate(templateName()))) 9343 matches the specialization X<Y> 9344</pre></td></tr> 9345 9346 9347<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> 9348<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 9349 9350Given 9351 struct X {}; 9352 template<typename T> struct A {}; 9353 A<X> a; 9354classTemplateSpecializationDecl(hasAnyTemplateArgument( 9355 refersToType(class(hasName("X"))))) 9356 matches the specialization A<X> 9357</pre></td></tr> 9358 9359 9360<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgumentLoc0')"><a name="hasAnyTemplateArgumentLoc0Anchor">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>> InnerMatcher</td></tr> 9361<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one 9362`TemplateArgumentLoc` matching the given `InnerMatcher`. 9363 9364Given 9365 template<typename T> class A {}; 9366 A<int> a; 9367varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( 9368 hasTypeLoc(loc(asString("int"))))))) 9369 matches `A<int> a`. 9370</pre></td></tr> 9371 9372 9373<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>></td><td class="name" onclick="toggle('hasTemplateArgumentLoc1')"><a name="hasTemplateArgumentLoc1Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>> InnerMatcher</td></tr> 9374<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th 9375`TemplateArgumentLoc` matches the given `InnerMatcher`. 9376 9377Given 9378 template<typename T, typename U> class A {}; 9379 A<double, int> b; 9380 A<int, double> c; 9381varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 9382 hasTypeLoc(loc(asString("double"))))))) 9383 matches `A<double, int> b`, but not `A<int, double> c`. 9384</pre></td></tr> 9385 9386 9387<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> 9388<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9389functionDecl that have at least one TemplateArgument matching the given 9390InnerMatcher. 9391 9392Given 9393 template<typename T> class A {}; 9394 template<> class A<double> {}; 9395 A<int> a; 9396 9397 template<typename T> f() {}; 9398 void func() { f<int>(); }; 9399 9400classTemplateSpecializationDecl(hasAnyTemplateArgument( 9401 refersToType(asString("int")))) 9402 matches the specialization A<int> 9403 9404functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 9405 matches the specialization f<int> 9406</pre></td></tr> 9407 9408 9409<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> 9410<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 9411matches the given matcher. 9412 9413The associated declaration is: 9414- for type nodes, the declaration of the underlying type 9415- for CallExpr, the declaration of the callee 9416- for MemberExpr, the declaration of the referenced member 9417- for CXXConstructExpr, the declaration of the constructor 9418- for CXXNewExpr, the declaration of the operator new 9419- for ObjCIvarExpr, the declaration of the ivar 9420 9421For type nodes, hasDeclaration will generally match the declaration of the 9422sugared type. Given 9423 class X {}; 9424 typedef X Y; 9425 Y y; 9426in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9427typedefDecl. A common use case is to match the underlying, desugared type. 9428This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9429 varDecl(hasType(hasUnqualifiedDesugaredType( 9430 recordType(hasDeclaration(decl()))))) 9431In this matcher, the decl will match the CXXRecordDecl of class X. 9432 9433Usable 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>>, 9434 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>>, 9435 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>>, 9436 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>>, 9437 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>>, 9438 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>>, 9439 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9440</pre></td></tr> 9441 9442 9443<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> 9444<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9445functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 9446 9447Given 9448 template<typename T, typename U> class A {}; 9449 A<bool, int> b; 9450 A<int, bool> c; 9451 9452 template<typename T> void f() {} 9453 void func() { f<int>(); }; 9454classTemplateSpecializationDecl(hasTemplateArgument( 9455 1, refersToType(asString("int")))) 9456 matches the specialization A<bool, int> 9457 9458functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 9459 matches the specialization f<int> 9460</pre></td></tr> 9461 9462 9463<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> 9464<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 9465matches the given matcher. 9466 9467The associated declaration is: 9468- for type nodes, the declaration of the underlying type 9469- for CallExpr, the declaration of the callee 9470- for MemberExpr, the declaration of the referenced member 9471- for CXXConstructExpr, the declaration of the constructor 9472- for CXXNewExpr, the declaration of the operator new 9473- for ObjCIvarExpr, the declaration of the ivar 9474 9475For type nodes, hasDeclaration will generally match the declaration of the 9476sugared type. Given 9477 class X {}; 9478 typedef X Y; 9479 Y y; 9480in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9481typedefDecl. A common use case is to match the underlying, desugared type. 9482This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9483 varDecl(hasType(hasUnqualifiedDesugaredType( 9484 recordType(hasDeclaration(decl()))))) 9485In this matcher, the decl will match the CXXRecordDecl of class X. 9486 9487Usable 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>>, 9488 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>>, 9489 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>>, 9490 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>>, 9491 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>>, 9492 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>>, 9493 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9494</pre></td></tr> 9495 9496 9497<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> 9498<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 9499QualType-matcher matches. 9500</pre></td></tr> 9501 9502 9503<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 9504<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. 9505 9506Examples: 9507 int x; 9508declaratorDecl(hasTypeLoc(loc(asString("int")))) 9509 matches int x 9510 9511auto x = int(3); 9512cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9513 matches int(3) 9514 9515struct Foo { Foo(int, int); }; 9516auto x = Foo(1, 2); 9517cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9518 matches Foo(1, 2) 9519 9520Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 9521 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 9522 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 9523 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9524 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 9525 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 9526 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 9527 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9528</pre></td></tr> 9529 9530 9531<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> 9532<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 9533matcher. 9534 9535Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9536 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9537 and U (matcher = typedefDecl(hasType(asString("int"))) 9538 and friend class X (matcher = friendDecl(hasType("X")) 9539 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9540 asString("class X"))) 9541 class X {}; 9542 void y(X &x) { x; X z; } 9543 typedef int U; 9544 class Y { friend class X; }; 9545 class Z : public virtual X {}; 9546</pre></td></tr> 9547 9548 9549<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> 9550<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 9551matches the given matcher. 9552 9553The associated declaration is: 9554- for type nodes, the declaration of the underlying type 9555- for CallExpr, the declaration of the callee 9556- for MemberExpr, the declaration of the referenced member 9557- for CXXConstructExpr, the declaration of the constructor 9558- for CXXNewExpr, the declaration of the operator new 9559- for ObjCIvarExpr, the declaration of the ivar 9560 9561For type nodes, hasDeclaration will generally match the declaration of the 9562sugared type. Given 9563 class X {}; 9564 typedef X Y; 9565 Y y; 9566in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9567typedefDecl. A common use case is to match the underlying, desugared type. 9568This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9569 varDecl(hasType(hasUnqualifiedDesugaredType( 9570 recordType(hasDeclaration(decl()))))) 9571In this matcher, the decl will match the CXXRecordDecl of class X. 9572 9573Usable 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>>, 9574 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>>, 9575 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>>, 9576 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>>, 9577 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>>, 9578 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>>, 9579 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9580</pre></td></tr> 9581 9582 9583<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> 9584<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 9585type of the matched node. 9586 9587For example, in: 9588 class A {}; 9589 using B = A; 9590The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 9591both B and A. 9592</pre></td></tr> 9593 9594 9595<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> 9596<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 9597 9598Given 9599 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 9600unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 9601 matches sizeof(a) and alignof(c) 9602</pre></td></tr> 9603 9604 9605<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> 9606<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 9607 9608Example matches true (matcher = hasUnaryOperand( 9609 cxxBoolLiteral(equals(true)))) 9610 !true 9611</pre></td></tr> 9612 9613 9614<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> 9615<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 9616given matcher. Implicit object expressions are included; that is, it matches 9617use of implicit `this`. 9618 9619Given 9620 struct X { 9621 int m; 9622 int f(X x) { x.m; return m; } 9623 }; 9624memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 9625 matches `x.m`, but not `m`; however, 9626memberExpr(hasObjectExpression(hasType(pointsTo( 9627 cxxRecordDecl(hasName("X")))))) 9628 matches `m` (aka. `this->m`), but not `x.m`. 9629</pre></td></tr> 9630 9631 9632<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> 9633<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 9634matches the given matcher. 9635 9636The associated declaration is: 9637- for type nodes, the declaration of the underlying type 9638- for CallExpr, the declaration of the callee 9639- for MemberExpr, the declaration of the referenced member 9640- for CXXConstructExpr, the declaration of the constructor 9641- for CXXNewExpr, the declaration of the operator new 9642- for ObjCIvarExpr, the declaration of the ivar 9643 9644For type nodes, hasDeclaration will generally match the declaration of the 9645sugared type. Given 9646 class X {}; 9647 typedef X Y; 9648 Y y; 9649in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9650typedefDecl. A common use case is to match the underlying, desugared type. 9651This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9652 varDecl(hasType(hasUnqualifiedDesugaredType( 9653 recordType(hasDeclaration(decl()))))) 9654In this matcher, the decl will match the CXXRecordDecl of class X. 9655 9656Usable 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>>, 9657 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>>, 9658 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>>, 9659 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>>, 9660 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>>, 9661 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>>, 9662 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9663</pre></td></tr> 9664 9665 9666<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> 9667<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 9668matched by the given matcher. 9669 9670Given 9671 namespace X { int a; void b(); } 9672 using X::a; 9673 using X::b; 9674usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 9675 matches using X::b but not using X::a </pre></td></tr> 9676 9677 9678<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>></td><td class="name" onclick="toggle('hasUnderlyingType1')"><a name="hasUnderlyingType1Anchor">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 9679<tr><td colspan="4" class="doc" id="hasUnderlyingType1"><pre>Matches DecltypeType or UsingType nodes to find the underlying type. 9680 9681Given 9682 decltype(1) a = 1; 9683 decltype(2.0) b = 2.0; 9684decltypeType(hasUnderlyingType(isInteger())) 9685 matches the type of "a" 9686 9687Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 9688</pre></td></tr> 9689 9690 9691<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>></td><td class="name" onclick="toggle('throughUsingDecl1')"><a name="throughUsingDecl1Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> Inner</td></tr> 9692<tr><td colspan="4" class="doc" id="throughUsingDecl1"><pre>Matches if a node refers to a declaration through a specific 9693using shadow declaration. 9694 9695Examples: 9696 namespace a { int f(); } 9697 using a::f; 9698 int x = f(); 9699declRefExpr(throughUsingDecl(anything())) 9700 matches f 9701 9702 namespace a { class X{}; } 9703 using a::X; 9704 X x; 9705typeLoc(loc(usingType(throughUsingDecl(anything())))) 9706 matches X 9707 9708Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 9709</pre></td></tr> 9710 9711 9712<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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> 9713<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 9714declaration's type. 9715 9716In case of a value declaration (for example a variable declaration), 9717this resolves one layer of indirection. For example, in the value 9718declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 9719X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 9720declaration of x. 9721 9722Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9723 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9724 and friend class X (matcher = friendDecl(hasType("X")) 9725 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9726 cxxRecordDecl(hasName("X")))) 9727 class X {}; 9728 void y(X &x) { x; X z; } 9729 class Y { friend class X; }; 9730 class Z : public virtual X {}; 9731 9732Example matches class Derived 9733(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 9734class Base {}; 9735class Derived : Base {}; 9736 9737Usable 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>>, 9738Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 9739</pre></td></tr> 9740 9741 9742<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> 9743<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 9744matcher. 9745 9746Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9747 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9748 and U (matcher = typedefDecl(hasType(asString("int"))) 9749 and friend class X (matcher = friendDecl(hasType("X")) 9750 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9751 asString("class X"))) 9752 class X {}; 9753 void y(X &x) { x; X z; } 9754 typedef int U; 9755 class Y { friend class X; }; 9756 class Z : public virtual X {}; 9757</pre></td></tr> 9758 9759 9760<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> 9761<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 9762that matches the given matcher. 9763 9764Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 9765 bool y() { return true; } 9766 bool x = y(); 9767</pre></td></tr> 9768 9769 9770<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> 9771<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9772expression. 9773 9774Given 9775 void f(int b) { 9776 int a[b]; 9777 } 9778variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9779 varDecl(hasName("b"))))))) 9780 matches "int a[b]" 9781</pre></td></tr> 9782 9783 9784<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> 9785<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9786 9787 9788<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> 9789<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9790switch statement or conditional operator. 9791 9792Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9793 if (true) {} 9794</pre></td></tr> 9795 9796<!--END_TRAVERSAL_MATCHERS --> 9797</table> 9798 9799</div> 9800</body> 9801</html> 9802 9803 9804