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