1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5<title>AST Matcher Reference</title> 6<link type="text/css" rel="stylesheet" href="../menu.css" /> 7<link type="text/css" rel="stylesheet" href="../content.css" /> 8<style type="text/css"> 9td { 10 padding: .33em; 11} 12td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15} 16td.name:hover { 17 color: blue; 18 cursor: pointer; 19} 20span.mono { font-family: monospace; } 21 22.traverse_compare, .traverse_compare td, .traverse_compare th { 23 border: 1px solid black; 24 border-collapse: collapse; 25} 26</style> 27<script type="text/javascript"> 28function toggle(id) { 29 if (!id) return; 30 row = document.getElementById(id); 31 if (row.style.display != 'table-cell') 32 row.style.display = 'table-cell'; 33 else 34 row.style.display = 'none'; 35} 36</script> 37</head> 38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 39 40<!--#include virtual="../menu.html.incl"--> 41 42<div id="content"> 43 44<h1>AST Matcher Reference</h1> 45 46<p>This document shows all currently implemented matchers. The matchers are grouped 47by category and node type they match. You can click on matcher names to show the 48matcher's source documentation.</p> 49 50<p>There are three different basic categories of matchers: 51<ul> 52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 55</ul> 56</p> 57 58<p>Within each category the matchers are ordered by node type they match on. 59Note that if a matcher can match multiple node types, it will appear 60multiple times. This means that by searching for Matcher<Stmt> you can 61find all matchers that can be used to match on Stmt nodes.</p> 62 63<p>The exception to that rule are matchers that can match on any node. Those 64are marked with a * and are listed in the beginning of each category.</p> 65 66<p>Note that the categorization of matchers is a great help when you combine 67them into matcher expressions. You will usually want to form matcher expressions 68that read like english sentences by alternating between node matchers and 69narrowing or traversal matchers, like this: 70<pre> 71recordDecl(hasDescendant( 72 ifStmt(hasTrueExpression( 73 expr(hasDescendant( 74 ifStmt())))))) 75</pre> 76</p> 77 78<!-- ======================================================================= --> 79<h2 id="traverse-mode">Traverse Mode</h2> 80<!-- ======================================================================= --> 81 82<p>The default mode of operation of AST Matchers visits all nodes in the AST, 83even if they are not spelled in the source. This is 84<span class="mono">AsIs</span> mode. This mode requires writing AST matchers 85that explicitly traverse or ignore implicit nodes, such as parentheses 86surrounding an expression or expressions with cleanups. These implicit 87nodes are not always obvious from the syntax of the source code, and so this 88mode requires careful consideration and testing to get the desired behavior 89from an AST matcher. 90</p> 91 92<p>In addition, because template instantiations are matched in the default mode, 93transformations can be accidentally made to template declarations. Finally, 94because implicit nodes are matched by default, transformations can be made on 95entirely incorrect places in the code.</p> 96 97<p>For these reasons, it is possible to ignore AST nodes which are not spelled 98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span> 99mode. This is likely to be far less error-prone for users who are not already 100very familiar with where implicit nodes appear in the AST. It is also likely 101to be less error-prone for experienced AST users, as difficult cases do not 102need to be encountered and matcher expressions adjusted for these cases.</p> 103 104<p>In clang-query, the mode can be changed with 105<pre> 106set traversal IgnoreUnlessSpelledInSource 107</pre> 108</p> 109This affects both matchers and AST dump output in results. 110 111<p>When using the C++ API such as in clang-tidy checks, the 112<span class="mono">traverse()</span> matcher is used to set the mode: 113<pre> 114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource, 115 returnStmt(hasReturnArgument(integerLiteral(equals(0)))) 116 ), this); 117</pre> 118</p> 119<p>The following table compares the <span class="mono">AsIs</span> mode with 120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p> 121 122<table class="traverse_compare"> 123<tr> 124<th></th> 125<th><span class="mono">AsIs</span></th> 126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th> 127</tr> 128<tr> 129 <td>AST dump of <span class="mono">func1</span>: 130<pre> 131struct B { 132 B(int); 133}; 134 135B func1() { return 42; } 136</pre> 137 138 </td> 139 <td> 140C++98 dialect: 141<pre> 142FunctionDecl 143`-CompoundStmt 144 `-ReturnStmt 145 `-ExprWithCleanups 146 `-CXXConstructExpr 147 `-MaterializeTemporaryExpr 148 `-ImplicitCastExpr 149 `-ImplicitCastExpr 150 `-CXXConstructExpr 151 `-IntegerLiteral 'int' 42 152</pre> 153C++11, C++14 dialect: 154<pre> 155FunctionDecl 156`-CompoundStmt 157 `-ReturnStmt 158 `-ExprWithCleanups 159 `-CXXConstructExpr 160 `-MaterializeTemporaryExpr 161 `-ImplicitCastExpr 162 `-CXXConstructExpr 163 `-IntegerLiteral 'int' 42 164</pre> 165C++17, C++20 dialect: 166<pre> 167FunctionDecl 168`-CompoundStmt 169 `-ReturnStmt 170 `-ImplicitCastExpr 171 `-CXXConstructExpr 172 `-IntegerLiteral 'int' 42 173</pre> 174</td> 175 <td> 176All dialects: 177 <pre> 178FunctionDecl 179`-CompoundStmt 180 `-ReturnStmt 181 `-IntegerLiteral 'int' 42 182</pre></td> 183</tr> 184 185<tr> 186<td>Matcher for returned <span class="mono">42</span>: 187<pre> 188struct B { 189 B(int); 190}; 191 192B func1() { return 42; } 193</pre> 194 195 </td> 196 <td> 197All dialects: 198<pre> 199returnStmt(hasReturnValue( 200 ignoringImplicit( 201 ignoringElidableConstructorCall( 202 ignoringImplicit( 203 cxxConstructExpr(hasArgument(0, 204 ignoringImplicit( 205 integerLiteral().bind("returnVal") 206 ) 207 )) 208 ) 209 ) 210 ) 211 )) 212</pre></td> 213 <td> 214All dialects: 215<pre> 216returnStmt(hasReturnValue( 217 integerLiteral().bind("returnVal") 218)) 219</pre></td> 220</tr> 221<tr> 222<td>Match result for 223<pre>implicitCastExpr()</pre> 224given: 225<pre> 226struct B { 227 B(int); 228}; 229 230B func1() { return 42; } 231</pre> 232 233</td> 234<td> 235Match found.</td> 236 <td> 237No match.</td> 238</tr> 239<tr> 240 <td>Match result for: 241<pre> 242cxxConstructorDecl( 243 isCopyConstructor() 244 ).bind("prepend_explicit") 245</pre> 246given: 247<pre> 248struct Other {}; 249struct Copyable { 250 Other m_o; 251 Copyable(); 252}; 253</pre> 254</td> 255<td> 256Match found. Insertion produces incorrect output: 257<pre> 258struct Other {}; 259struct explicit Copyable { 260 Other m_o; 261 Copyable(); 262}; 263</pre> 264</td> 265<td> 266No match found. Incorrect replacement not possible. 267</td> 268</tr> 269<tr> 270 <td>Replacement of <span class="mono">begin()</span> 271 with <span class="mono">cbegin()</span>: 272<pre> 273cxxMemberCallExpr( 274 on(ConstContainerExpr), 275 callee(cxxMethodDecl(hasName("begin"))) 276 ).bind("replace_with_cbegin") 277</pre> 278given: 279<pre> 280void foo() { 281 const Container c; 282 c.begin(); 283 284 for (auto i : c) { 285 } 286} 287</pre> 288</td> 289<td> 2902 matches found. Replacement produces incorrect output: 291<pre> 292void foo() { 293 const Container c; 294 c.cbegin(); 295 296 for (auto i :.cbegin() c) { 297 } 298} 299</pre> 300</td> 301<td> 3021 match found. Replacement produces correct output: 303<pre> 304void foo() { 305 const Container c; 306 c.cbegin(); 307 308 for (auto i : c) { 309 } 310} 311</pre> 312</td> 313</tr> 314<tr> 315 <td>Replacement of <span class="mono">int</span> member 316 with <span class="mono">safe_int</span>: 317<pre> 318fieldDecl( 319 hasType(asString("int")) 320 ).bind("use_safe_int") 321</pre> 322given: 323<pre> 324struct S { 325 int m_i; 326}; 327 328template <typename T> struct TemplStruct { 329 TemplStruct() {} 330 ~TemplStruct() {} 331 332private: 333 T m_t; 334}; 335 336void instantiate() { TemplStruct<int> ti; } 337</pre> 338</td> 339<td> 3402 matches found. Replacement produces incorrect output: 341<pre> 342struct S { 343 safe_int m_i; 344}; 345 346template <typename T> struct TemplStruct { 347 TemplStruct() {} 348 ~TemplStruct() {} 349 350private: 351 safe_int m_t; 352}; 353 354void instantiate() { TemplStruct<int> ti; } 355</pre> 356</td> 357<td> 3581 match found. Replacement produces correct output: 359<pre> 360struct S { 361 safe_int m_i; 362}; 363 364template <typename T> struct TemplStruct { 365 TemplStruct() {} 366 ~TemplStruct() {} 367 368private: 369 T m_t; 370}; 371 372void instantiate() { TemplStruct<int> ti; } 373</pre> 374</td> 375</tr> 376<tr> 377 <td>Add prefix to member initializer 378<pre> 379cxxCtorInitializer( 380 forField(fieldDecl()) 381 ).bind("add_prefix") 382</pre> 383given: 384<pre> 385struct Simple {}; 386 387struct Record { 388 Record() : i(42) {} 389private: 390 int i; 391 Simple s; 392}; 393</pre> 394</td> 395<td> 3962 matches found. Replacement produces incorrect output: 397<pre> 398struct Simple {}; 399 400struct Record { 401 m_Record() : m_i(42) {} 402private: 403 int i; 404 Simple s; 405}; 406</pre> 407</td> 408<td> 4091 match found. Replacement produces correct output: 410<pre> 411struct Simple {}; 412 413struct Record { 414 Record() : m_i(42) {} 415private: 416 int i; 417 Simple s; 418}; 419</pre> 420</td> 421</tr> 422<tr> 423 <td>Ignored default arguments 424<pre> 425callExpr( 426 callee(functionDecl( 427 hasName("hasDefaultArg") 428 )), 429 argumentCountIs(1) 430 ).bind("add_prefix") 431</pre> 432given: 433<pre> 434void hasDefaultArg(int i, int j = 0) {} 435void callDefaultArg() { hasDefaultArg(42); } 436</pre> 437</td> 438<td> 439No match. 440</td> 441<td> 4421 match found. 443</td> 444</tr> 445<tr> 446 <td>Lambda fields 447<pre> 448fieldDecl( 449 hasType(asString("int")) 450 ).bind("make_safe") 451</pre> 452given: 453<pre> 454struct S { 455 int m_i; 456}; 457 458void func() { 459 int a = 0; 460 int c = 0; 461 462 auto l = [a, b = c](int d) { int e = d; }; 463 l(43); 464} 465</pre> 466</td> 467<td> 4682 matches found. Replacement produces incorrect output: 469<pre> 470struct S { 471 safe_int m_i; 472}; 473 474void func() { 475 int a = 0; 476 int c = 0; 477 478 auto l = [safe_a, safe_b = c](int d) { int e = d; }; 479 l(43); 480} 481</pre> 482</td> 483<td> 4841 match found. Replacement produces correct output: 485<pre> 486struct S { 487 safe_int m_i; 488}; 489 490void func() { 491 int a = 0; 492 int c = 0; 493 494 auto l = [a, b = c](int d) { int e = d; }; 495 l(43); 496} 497</pre> 498</td> 499 500</tr> 501 502 503 504 505 506<tr> 507 <td>Rewritten binary operators 508<pre> 509binaryOperator( 510 hasOperatorName("<"), 511 hasRHS(hasDescendant(integerLiteral(equals(0)))) 512 ) 513</pre> 514given: 515<pre> 516#include <compare> 517 518class HasSpaceship { 519public: 520 int x; 521 bool operator==(const HasSpaceship&) const = default; 522 std::strong_ordering operator<=>(const HasSpaceship&) const = default; 523}; 524 525bool isLess(const HasSpaceship& a, const HasSpaceship& b) { 526 return a < b; 527} 528</pre> 529</td> 530<td> 5311 match found. 532 533<pre> 534 return a < b; 535 ^~~~~ 536</pre> 537 538</td> 539<td> 540No match found. 541</td> 542</tr> 543</table> 544 545<!-- ======================================================================= --> 546<h2 id="decl-matchers">Node Matchers</h2> 547<!-- ======================================================================= --> 548 549<p>Node matchers are at the core of matcher expressions - they specify the type 550of node that is expected. Every match expression starts with a node matcher, 551which can then be further refined with a narrowing or traversal matcher. All 552traversal matchers take node matchers as their arguments.</p> 553 554<p>For convenience, all node matchers take an arbitrary number of arguments 555and implicitly act as allOf matchers.</p> 556 557<p>Node matchers are the only matchers that support the bind("id") call to 558bind the matched node to the given string, to be later retrieved from the 559match callback.</p> 560 561<p>It is important to remember that the arguments to node matchers are 562predicates on the same node, just with additional information about the type. 563This is often useful to make matcher expression more readable by inlining bind 564calls into redundant node matchers inside another node matcher: 565<pre> 566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 567// the same node. 568recordDecl(decl().bind("id"), hasName("::MyClass")) 569</pre> 570</p> 571 572<table> 573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 574<!-- START_DECL_MATCHERS --> 575 576<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>></td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>>...</td></tr> 577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes. 578Attributes may be attached with a variety of different syntaxes (including 579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``, 580and ``#pragma``s). They may also be implicit. 581 582Given 583 struct [[nodiscard]] Foo{}; 584 void bar(int * __attribute__((nonnull)) ); 585 __declspec(noinline) void baz(); 586 587 #pragma omp declare simd 588 int min(); 589attr() 590 matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line. 591</pre></td></tr> 592 593 594<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>...</td></tr> 595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases. 596 597Examples matches public virtual B. 598 class B {}; 599 class C : public virtual B {}; 600</pre></td></tr> 601 602 603<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 605 606Examples matches i(42). 607 class C { 608 C() : i(42) {} 609 int i; 610 }; 611</pre></td></tr> 612 613 614<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 616 617Given 618 class C { 619 public: 620 int a; 621 }; 622accessSpecDecl() 623 matches 'public:' 624</pre></td></tr> 625 626 627<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>>...</td></tr> 628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 629Example matches foo and bar 630(matcher = bindingDecl() 631 632 auto [foo, bar] = std::make_pair{42, 42}; 633</pre></td></tr> 634 635 636<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 638 639Example matches the declaration of the nameless block printing an input 640integer. 641 642 myFunc(^(int p) { 643 printf("%d", p); 644 }) 645</pre></td></tr> 646 647 648<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 650 651Example matches Z 652 template<class T> class Z {}; 653</pre></td></tr> 654 655 656<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 658 659Given 660 template<class T1, class T2, int I> 661 class A {}; 662 663 template<class T, int I> 664 class A<T, T*, I> {}; 665 666 template<> 667 class A<int, int, 1> {}; 668classTemplatePartialSpecializationDecl() 669 matches the specialization A<T,T*,I> but not A<int,int,1> 670</pre></td></tr> 671 672 673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 675 676Given 677 template<typename T> class A {}; 678 template<> class A<double> {}; 679 A<int> a; 680classTemplateSpecializationDecl() 681 matches the specializations A<int> and A<double> 682</pre></td></tr> 683 684 685<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 687 688Example matches Foo::Foo() and Foo::Foo(int) 689 class Foo { 690 public: 691 Foo(); 692 Foo(int); 693 int DoSomething(); 694 }; 695</pre></td></tr> 696 697 698<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 700 701Example matches the operator. 702 class X { operator int() const; }; 703</pre></td></tr> 704 705 706<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 708 709Example matches the deduction guide. 710 template<typename T> 711 class X { X(int) }; 712 X(int) -> X<int>; 713</pre></td></tr> 714 715 716<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 718 719Example matches Foo::~Foo() 720 class Foo { 721 public: 722 virtual ~Foo(); 723 }; 724</pre></td></tr> 725 726 727<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 729 730Example matches y 731 class X { void y(); }; 732</pre></td></tr> 733 734 735<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 737 738Example matches X, Z 739 class X; 740 template<class T> class Z {}; 741</pre></td></tr> 742 743 744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 746 747Examples matches X, C, and the friend declaration inside C; 748 void X(); 749 class C { 750 friend X; 751 }; 752</pre></td></tr> 753 754 755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 757and non-type template parameter declarations). 758 759Given 760 class X { int y; }; 761declaratorDecl() 762 matches int y. 763</pre></td></tr> 764 765 766<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 768 769Examples matches the declaration node with foo and bar, but not 770number. 771(matcher = declStmt(has(decompositionDecl()))) 772 773 int number = 42; 774 auto [foo, bar] = std::make_pair{42, 42}; 775</pre></td></tr> 776 777 778<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 780 781Example matches A, B, C 782 enum X { 783 A, B, C 784 }; 785</pre></td></tr> 786 787 788<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 790 791Example matches X 792 enum X { 793 A, B, C 794 }; 795</pre></td></tr> 796 797 798<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 800 801Given 802 class X { int m; }; 803fieldDecl() 804 matches 'm'. 805</pre></td></tr> 806 807 808<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 810 811Given 812 class X { friend void foo(); }; 813friendDecl() 814 matches 'friend void foo()'. 815</pre></td></tr> 816 817 818<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 820 821Example matches f 822 void f(); 823</pre></td></tr> 824 825 826<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 828 829Example matches f 830 template<class T> void f(T t) {} 831</pre></td></tr> 832 833 834<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 836 837Given 838 struct X { struct { int a; }; }; 839indirectFieldDecl() 840 matches 'a'. 841</pre></td></tr> 842 843 844<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 846 847Given 848 goto FOO; 849 FOO: bar(); 850labelDecl() 851 matches 'FOO:' 852</pre></td></tr> 853 854 855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 857 858Given 859 extern "C" {} 860linkageSpecDecl() 861 matches "extern "C" {}" 862</pre></td></tr> 863 864 865<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 867 868Example matches X, S, the anonymous union type, i, and U; 869 typedef int X; 870 struct S { 871 union { 872 int i; 873 } U; 874 }; 875</pre></td></tr> 876 877 878<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 880 881Given 882 namespace test {} 883 namespace alias = ::test; 884namespaceAliasDecl() 885 matches "namespace alias" but not "namespace test" 886</pre></td></tr> 887 888 889<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 891 892Given 893 namespace {} 894 namespace test {} 895namespaceDecl() 896 matches "namespace {}" and "namespace test {}" 897</pre></td></tr> 898 899 900<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 902 903Given 904 template <typename T, int N> struct C {}; 905nonTypeTemplateParmDecl() 906 matches 'N', but not 'T'. 907</pre></td></tr> 908 909 910<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 912 913Example matches Foo (Additions) 914 @interface Foo (Additions) 915 @end 916</pre></td></tr> 917 918 919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 921 922Example matches Foo (Additions) 923 @implementation Foo (Additions) 924 @end 925</pre></td></tr> 926 927 928<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 930 931Example matches Foo 932 @implementation Foo 933 @end 934</pre></td></tr> 935 936 937<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 939 940Example matches Foo 941 @interface Foo 942 @end 943</pre></td></tr> 944 945 946<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 948 949Example matches _enabled 950 @implementation Foo { 951 BOOL _enabled; 952 } 953 @end 954</pre></td></tr> 955 956 957<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 959 960Example matches both declaration and definition of -[Foo method] 961 @interface Foo 962 - (void)method; 963 @end 964 965 @implementation Foo 966 - (void)method {} 967 @end 968</pre></td></tr> 969 970 971<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 973 974Example matches enabled 975 @interface Foo 976 @property BOOL enabled; 977 @end 978</pre></td></tr> 979 980 981<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 983 984Example matches FooDelegate 985 @protocol FooDelegate 986 @end 987</pre></td></tr> 988 989 990<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 992 993Given 994 void f(int x); 995parmVarDecl() 996 matches int x. 997</pre></td></tr> 998 999 1000<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 1002 1003Example matches X, Z, U, and S 1004 class X; 1005 template<class T> class Z {}; 1006 struct S {}; 1007 union U {}; 1008</pre></td></tr> 1009 1010 1011<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 1013 1014Example: 1015 staticAssertExpr() 1016matches 1017 static_assert(sizeof(S) == sizeof(int)) 1018in 1019 struct S { 1020 int x; 1021 }; 1022 static_assert(sizeof(S) == sizeof(int)); 1023</pre></td></tr> 1024 1025 1026<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 1028 1029Example matches X, Z, U, S, E 1030 class X; 1031 template<class T> class Z {}; 1032 struct S {}; 1033 union U {}; 1034 enum E { 1035 A, B, C 1036 }; 1037</pre></td></tr> 1038 1039 1040<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1042 1043Given 1044 template <template <typename> class Z, int N> struct C {}; 1045templateTypeParmDecl() 1046 matches 'Z', but not 'N'. 1047</pre></td></tr> 1048 1049 1050<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1052 1053Given 1054 template <typename T, int N> struct C {}; 1055templateTypeParmDecl() 1056 matches 'T', but not 'N'. 1057</pre></td></tr> 1058 1059 1060<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1062 1063Given 1064 int X; 1065 namespace NS { 1066 int Y; 1067 } // namespace NS 1068decl(hasDeclContext(translationUnitDecl())) 1069 matches "int X", but not "int Y". 1070</pre></td></tr> 1071 1072 1073<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1075 1076Given 1077 typedef int X; 1078 using Y = int; 1079typeAliasDecl() 1080 matches "using Y = int", but not "typedef int X" 1081</pre></td></tr> 1082 1083 1084<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1086 1087typeAliasTemplateDecl() matches 1088 template <typename T> 1089 using Y = X<T>; 1090</pre></td></tr> 1091 1092 1093<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1095 1096Given 1097 typedef int X; 1098 using Y = int; 1099typedefDecl() 1100 matches "typedef int X", but not "using Y = int" 1101</pre></td></tr> 1102 1103 1104<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1106 1107Given 1108 typedef int X; 1109 using Y = int; 1110typedefNameDecl() 1111 matches "typedef int X" and "using Y = int" 1112</pre></td></tr> 1113 1114 1115<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1117typename. 1118 1119Given 1120 template <typename T> 1121 struct Base { typedef T Foo; }; 1122 1123 template<typename T> 1124 struct S : private Base<T> { 1125 using typename Base<T>::Foo; 1126 }; 1127unresolvedUsingTypenameDecl() 1128 matches using Base<T>::Foo </pre></td></tr> 1129 1130 1131<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1133 1134Given 1135 template<typename X> 1136 class C : private X { 1137 using X::x; 1138 }; 1139unresolvedUsingValueDecl() 1140 matches using X::x </pre></td></tr> 1141 1142 1143<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1145 1146Given 1147 namespace X { int x; } 1148 using X::x; 1149usingDecl() 1150 matches using X::x </pre></td></tr> 1151 1152 1153<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1155 1156Given 1157 namespace X { int x; } 1158 using namespace X; 1159usingDirectiveDecl() 1160 matches using namespace X </pre></td></tr> 1161 1162 1163<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>>...</td></tr> 1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations. 1165 1166Given 1167 namespace X { enum x {...}; } 1168 using enum X::x; 1169usingEnumDecl() 1170 matches using enum X::x </pre></td></tr> 1171 1172 1173<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1175 1176Example matches A, B, C and F 1177 enum X { A, B, C }; 1178 void F(); 1179</pre></td></tr> 1180 1181 1182<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1184 1185Note: this does not match declarations of member variables, which are 1186"field" declarations in Clang parlance. 1187 1188Example matches a 1189 int a; 1190</pre></td></tr> 1191 1192 1193<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('lambdaCapture0')"><a name="lambdaCapture0Anchor">lambdaCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>>...</td></tr> 1194<tr><td colspan="4" class="doc" id="lambdaCapture0"><pre>Matches lambda captures. 1195 1196Given 1197 int main() { 1198 int x; 1199 auto f = [x](){}; 1200 auto g = [x = 1](){}; 1201 } 1202In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`, 1203`lambdaCapture()` matches `x` and `x=1`. 1204</pre></td></tr> 1205 1206 1207<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 1208<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1209</pre></td></tr> 1210 1211 1212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 1213<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1214 1215Given 1216 namespace ns { 1217 struct A { static void f(); }; 1218 void A::f() {} 1219 void g() { A::f(); } 1220 } 1221 ns::A a; 1222nestedNameSpecifier() 1223 matches "ns::" and both "A::" 1224</pre></td></tr> 1225 1226 1227<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr> 1228<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1229 1230Given 1231 1232 #pragma omp parallel default(none) 1233 #pragma omp parallel default(shared) 1234 #pragma omp parallel default(firstprivate) 1235 #pragma omp parallel 1236 1237``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1238``default(firstprivate)`` 1239</pre></td></tr> 1240 1241 1242<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 1243<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1244</pre></td></tr> 1245 1246 1247<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1248<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1249 1250Given 1251 FOO: bar(); 1252 void *ptr = &&FOO; 1253 goto *bar; 1254addrLabelExpr() 1255 matches '&&FOO' 1256</pre></td></tr> 1257 1258 1259<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 1260<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1261 1262Given 1263 int i = a[1]; 1264arraySubscriptExpr() 1265 matches "a[1]" 1266</pre></td></tr> 1267 1268 1269<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 1270<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1271 1272 int i = 100; 1273 __asm("mov al, 2"); 1274asmStmt() 1275 matches '__asm("mov al, 2")' 1276</pre></td></tr> 1277 1278 1279<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 1280<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1281Example matches __atomic_load_n(ptr, 1) 1282 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1283</pre></td></tr> 1284 1285 1286<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 1287<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1288 1289Given 1290 @autoreleasepool { 1291 int x = 0; 1292 } 1293autoreleasePoolStmt(stmt()) matches the declaration of "x" 1294inside the autorelease pool. 1295</pre></td></tr> 1296 1297 1298<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 1299<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1300 1301Example matches a ?: b 1302 (a ?: b) + 42; 1303</pre></td></tr> 1304 1305 1306<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 1307<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1308 1309Example matches a || b 1310 !(a || b) 1311See also the binaryOperation() matcher for more-general matching. 1312</pre></td></tr> 1313 1314 1315<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 1316<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1317 1318Example: matches "^{}": 1319 void f() { ^{}(); } 1320</pre></td></tr> 1321 1322 1323<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1324<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1325 1326Given 1327 while (true) { break; } 1328breakStmt() 1329 matches 'break' 1330</pre></td></tr> 1331 1332 1333<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 1334<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1335 1336Example: Matches (int) 2.2f in 1337 int i = (int) 2.2f; 1338</pre></td></tr> 1339 1340 1341<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 1342<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1343 1344Example matches x.y() and y() 1345 X x; 1346 x.y(); 1347 y(); 1348</pre></td></tr> 1349 1350 1351<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 1352<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1353 1354Given 1355 switch(a) { case 42: break; default: break; } 1356caseStmt() 1357 matches 'case 42:'. 1358</pre></td></tr> 1359 1360 1361<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 1362<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1363 1364Example: castExpr() matches each of the following: 1365 (int) 3; 1366 const_cast<Expr *>(SubExpr); 1367 char c = 0; 1368but does not match 1369 int i = (0); 1370 int k = 0; 1371</pre></td></tr> 1372 1373 1374<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 1375<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1376 1377Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1378though. 1379 1380Example matches 'a', L'a' 1381 char ch = 'a'; 1382 wchar_t chw = L'a'; 1383</pre></td></tr> 1384 1385 1386<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1387<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1388</pre></td></tr> 1389 1390 1391<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>>...</td></tr> 1392<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions. 1393 1394Given 1395 co_await 1; 1396coawaitExpr() 1397 matches 'co_await 1' 1398</pre></td></tr> 1399 1400 1401<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 1402<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1403 1404Example match: {1}, (1, 2) 1405 int array[4] = {1}; 1406 vector int myvec = (vector int)(1, 2); 1407</pre></td></tr> 1408 1409 1410<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 1411<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1412 1413Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1414 for (;;) {{}} 1415</pre></td></tr> 1416 1417 1418<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 1419<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1420 1421Example matches a ? b : c 1422 (a ? b : c) + 42 1423</pre></td></tr> 1424 1425 1426<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 1427<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1428 1429Example matches the constant in the case statement: 1430 (matcher = constantExpr()) 1431 switch (a) { 1432 case 37: break; 1433 } 1434</pre></td></tr> 1435 1436 1437<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1438<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1439 1440Given 1441 while (true) { continue; } 1442continueStmt() 1443 matches 'continue' 1444</pre></td></tr> 1445 1446 1447<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>>...</td></tr> 1448<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements. 1449 1450Given 1451 while (true) { co_return; } 1452coreturnStmt() 1453 matches 'co_return' 1454</pre></td></tr> 1455 1456 1457<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>>...</td></tr> 1458<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions. 1459 1460Given 1461 co_yield 1; 1462coyieldExpr() 1463 matches 'co_yield 1' 1464</pre></td></tr> 1465 1466 1467<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 1468<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1469 1470Example matches, 1471 kernel<<<i,j>>>(); 1472</pre></td></tr> 1473 1474 1475<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1476<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1477 1478Example matches FunctionTakesString(GetStringByValue()) 1479 (matcher = cxxBindTemporaryExpr()) 1480 FunctionTakesString(GetStringByValue()); 1481 FunctionTakesStringByPointer(GetStringPointer()); 1482</pre></td></tr> 1483 1484 1485<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 1486<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1487 1488Example matches true 1489 true 1490</pre></td></tr> 1491 1492 1493<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 1494<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1495 1496 try {} catch(int i) {} 1497cxxCatchStmt() 1498 matches 'catch(int i)' 1499</pre></td></tr> 1500 1501 1502<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 1503<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1504 1505Example: Matches const_cast<int*>(&r) in 1506 int n = 42; 1507 const int &r(n); 1508 int* p = const_cast<int*>(&r); 1509</pre></td></tr> 1510 1511 1512<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 1513<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1514 1515Example matches string(ptr, n) and ptr within arguments of f 1516 (matcher = cxxConstructExpr()) 1517 void f(const string &a, const string &b); 1518 char *ptr; 1519 int n; 1520 f(string(ptr, n), ptr); 1521</pre></td></tr> 1522 1523 1524<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 1525<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1526 1527Example matches the CXXDefaultArgExpr placeholder inserted for the 1528 default value of the second parameter in the call expression f(42) 1529 (matcher = cxxDefaultArgExpr()) 1530 void f(int x, int y = 0); 1531 f(42); 1532</pre></td></tr> 1533 1534 1535<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 1536<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1537 1538Given 1539 delete X; 1540cxxDeleteExpr() 1541 matches 'delete X'. 1542</pre></td></tr> 1543 1544 1545<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> 1546<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1547resolved because the base expression or the member name was dependent. 1548 1549Given 1550 template <class T> void f() { T t; t.g(); } 1551cxxDependentScopeMemberExpr() 1552 matches t.g 1553</pre></td></tr> 1554 1555 1556<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 1557<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1558 1559Example: 1560 cxxDynamicCastExpr() 1561matches 1562 dynamic_cast<D*>(&b); 1563in 1564 struct B { virtual ~B() {} }; struct D : B {}; 1565 B b; 1566 D* p = dynamic_cast<D*>(&b); 1567</pre></td></tr> 1568 1569 1570<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 1571<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1572 1573cxxForRangeStmt() matches 'for (auto a : i)' 1574 int i[] = {1, 2, 3}; for (auto a : i); 1575 for(int j = 0; j < 5; ++j); 1576</pre></td></tr> 1577 1578 1579<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1580<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1581 1582Example: Matches Foo(bar); 1583 Foo f = bar; 1584 Foo g = (Foo) bar; 1585 Foo h = Foo(bar); 1586</pre></td></tr> 1587 1588 1589<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1590<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1591 1592Example matches x.y() 1593 X x; 1594 x.y(); 1595</pre></td></tr> 1596 1597 1598<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1599<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1600 1601Given 1602 new X; 1603cxxNewExpr() 1604 matches 'new X'. 1605</pre></td></tr> 1606 1607 1608<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1609<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1610 1611Given 1612 bool a() noexcept; 1613 bool b() noexcept(true); 1614 bool c() noexcept(false); 1615 bool d() noexcept(noexcept(a())); 1616 bool e = noexcept(b()) || noexcept(c()); 1617cxxNoexceptExpr() 1618 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1619 doesn't match the noexcept specifier in the declarations a, b, c or d. 1620</pre></td></tr> 1621 1622 1623<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1624<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1625</pre></td></tr> 1626 1627 1628<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1629<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1630 1631Note that if an operator isn't overloaded, it won't match. Instead, use 1632binaryOperator matcher. 1633Currently it does not match operators such as new delete. 1634FIXME: figure out why these do not match? 1635 1636Example matches both operator<<((o << b), c) and operator<<(o, b) 1637 (matcher = cxxOperatorCallExpr()) 1638 ostream &operator<< (ostream &out, int i) { }; 1639 ostream &o; int b = 1, c = 1; 1640 o << b << c; 1641See also the binaryOperation() matcher for more-general matching of binary 1642uses of this AST node. 1643</pre></td></tr> 1644 1645 1646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1647<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1648 1649Either the source expression or the destination type can be matched 1650using has(), but hasDestinationType() is more specific and can be 1651more readable. 1652 1653Example matches reinterpret_cast<char*>(&p) in 1654 void* p = reinterpret_cast<char*>(&p); 1655</pre></td></tr> 1656 1657 1658<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>>...</td></tr> 1659<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1660 1661Example matches use of "<": 1662 #include <compare> 1663 struct HasSpaceshipMem { 1664 int a; 1665 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1666 }; 1667 void compare() { 1668 HasSpaceshipMem hs1, hs2; 1669 if (hs1 < hs2) 1670 return; 1671 } 1672See also the binaryOperation() matcher for more-general matching 1673of this AST node. 1674</pre></td></tr> 1675 1676 1677<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1678<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1679 1680See also: hasDestinationType 1681See also: reinterpretCast 1682 1683Example: 1684 cxxStaticCastExpr() 1685matches 1686 static_cast<long>(8) 1687in 1688 long eight(static_cast<long>(8)); 1689</pre></td></tr> 1690 1691 1692<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1693<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1694 1695Given 1696 std::vector<int> a({ 1, 2, 3 }); 1697 std::vector<int> b = { 4, 5 }; 1698 int c[] = { 6, 7 }; 1699 std::pair<int, int> d = { 8, 9 }; 1700cxxStdInitializerListExpr() 1701 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1702</pre></td></tr> 1703 1704 1705<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1706<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1707 1708Example: Matches Foo(bar, bar) 1709 Foo h = Foo(bar, bar); 1710</pre></td></tr> 1711 1712 1713<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1714<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1715 1716Example matches the implicit this expression in "return i". 1717 (matcher = cxxThisExpr()) 1718struct foo { 1719 int i; 1720 int f() { return i; } 1721}; 1722</pre></td></tr> 1723 1724 1725<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1726<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1727 1728 try { throw 5; } catch(int i) {} 1729cxxThrowExpr() 1730 matches 'throw 5' 1731</pre></td></tr> 1732 1733 1734<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1735<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1736 1737 try {} catch(int i) {} 1738cxxTryStmt() 1739 matches 'try {}' 1740</pre></td></tr> 1741 1742 1743<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1744<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1745 1746Example matches T(t) in return statement of f 1747 (matcher = cxxUnresolvedConstructExpr()) 1748 template <typename T> 1749 void f(const T& t) { return T(t); } 1750</pre></td></tr> 1751 1752 1753<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1754<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1755 1756Example matches x in if (x) 1757 bool x; 1758 if (x) {} 1759</pre></td></tr> 1760 1761 1762<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1763<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1764 1765Given 1766 int a; 1767declStmt() 1768 matches 'int a'. 1769</pre></td></tr> 1770 1771 1772<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1773<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1774 1775Given 1776 switch(a) { case 42: break; default: break; } 1777defaultStmt() 1778 matches 'default:'. 1779</pre></td></tr> 1780 1781 1782<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>>...</td></tr> 1783<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent 1784</pre></td></tr> 1785 1786 1787<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1788<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1789 1790Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1791 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1792</pre></td></tr> 1793 1794 1795<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1796<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1797 1798Given 1799 do {} while (true); 1800doStmt() 1801 matches 'do {} while(true)' 1802</pre></td></tr> 1803 1804 1805<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 1806<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1807 1808Matches any cast expression written in user code, whether it be a 1809C-style cast, a functional-style cast, or a keyword cast. 1810 1811Does not match implicit conversions. 1812 1813Note: the name "explicitCast" is chosen to match Clang's terminology, as 1814Clang uses the term "cast" to apply to implicit conversions as well as to 1815actual cast expressions. 1816 1817See also: hasDestinationType. 1818 1819Example: matches all five of the casts in 1820 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1821but does not match the implicit conversion in 1822 long ell = 42; 1823</pre></td></tr> 1824 1825 1826<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1827<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1828 1829Example matches x() 1830 void f() { x(); } 1831</pre></td></tr> 1832 1833 1834<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1835<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1836of the sub-expression's evaluation. 1837 1838Example matches std::string() 1839 const std::string str = std::string(); 1840</pre></td></tr> 1841 1842 1843<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1844<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1845</pre></td></tr> 1846 1847 1848<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1849<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 18501.0, 1.0f, 1.0L and 1e10. 1851 1852Does not match implicit conversions such as 1853 float a = 10; 1854</pre></td></tr> 1855 1856 1857<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1858<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1859 1860Example matches 'for (;;) {}' 1861 for (;;) {} 1862 int i[] = {1, 2, 3}; for (auto a : i); 1863</pre></td></tr> 1864 1865 1866<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>>...</td></tr> 1867<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1868</pre></td></tr> 1869 1870 1871<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1872<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1873</pre></td></tr> 1874 1875 1876<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1877<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1878 1879Given 1880 goto FOO; 1881 FOO: bar(); 1882gotoStmt() 1883 matches 'goto FOO' 1884</pre></td></tr> 1885 1886 1887<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1888<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1889 1890Example matches 'if (x) {}' 1891 if (x) {} 1892</pre></td></tr> 1893 1894 1895<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1896<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1897point literals e.g.: 1i, 1.0i 1898</pre></td></tr> 1899 1900 1901<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1902<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1903 1904This matches many different places, including function call return value 1905eliding, as well as any type conversions. 1906</pre></td></tr> 1907 1908 1909<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1910<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1911 1912Given 1913 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1914implicitValueInitExpr() 1915 matches "[0].y" (implicitly) 1916</pre></td></tr> 1917 1918 1919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1920<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1921 1922Given 1923 int a[] = { 1, 2 }; 1924 struct B { int x, y; }; 1925 B b = { 5, 6 }; 1926initListExpr() 1927 matches "{ 1, 2 }" and "{ 5, 6 }" 1928</pre></td></tr> 1929 1930 1931<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1932<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 19331, 1L, 0x1 and 1U. 1934 1935Does not match character-encoded integers such as L'a'. 1936</pre></td></tr> 1937 1938 1939<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1940<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1941 1942Given 1943 goto FOO; 1944 FOO: bar(); 1945labelStmt() 1946 matches 'FOO:' 1947</pre></td></tr> 1948 1949 1950<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1951<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1952 1953Example matches [&](){return 5;} 1954 [&](){return 5;} 1955</pre></td></tr> 1956 1957 1958<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1959<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1960 1961Example: Given 1962 struct T {void func();}; 1963 T f(); 1964 void g(T); 1965materializeTemporaryExpr() matches 'f()' in these statements 1966 T u(f()); 1967 g(f()); 1968 f().func(); 1969but does not match 1970 f(); 1971</pre></td></tr> 1972 1973 1974<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1975<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1976 1977Given 1978 class Y { 1979 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1980 int a; static int b; 1981 }; 1982memberExpr() 1983 matches this->x, x, y.x, a, this->b 1984</pre></td></tr> 1985 1986 1987<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1988<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1989 1990 foo();; 1991nullStmt() 1992 matches the second ';' 1993</pre></td></tr> 1994 1995 1996<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1997<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1998 1999Example matches @catch 2000 @try {} 2001 @catch (...) {} 2002</pre></td></tr> 2003 2004 2005<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 2006<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 2007 2008Example matches @finally 2009 @try {} 2010 @finally {} 2011</pre></td></tr> 2012 2013 2014<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr> 2015<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 2016 2017Example: matches "a" in "init" method: 2018@implementation A { 2019 NSString *a; 2020} 2021- (void) init { 2022 a = @"hello"; 2023} 2024</pre></td></tr> 2025 2026 2027<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 2028<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 2029 2030The innermost message send invokes the "alloc" class method on the 2031NSString class, while the outermost message send invokes the 2032"initWithString" instance method on the object returned from 2033NSString's "alloc". This matcher should match both message sends. 2034 [[NSString alloc] initWithString:@"Hello"] 2035</pre></td></tr> 2036 2037 2038<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 2039<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 2040 2041Example matches @throw obj; 2042</pre></td></tr> 2043 2044 2045<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 2046<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 2047 2048Example matches @try 2049 @try {} 2050 @catch (...) {} 2051</pre></td></tr> 2052 2053 2054<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 2055<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 2056 2057Given 2058 2059 #pragma omp parallel 2060 #pragma omp parallel default(none) 2061 #pragma omp taskyield 2062 2063``ompExecutableDirective()`` matches ``omp parallel``, 2064``omp parallel default(none)`` and ``omp taskyield``. 2065</pre></td></tr> 2066 2067 2068<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 2069<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 2070to reference another expressions and can be met 2071in BinaryConditionalOperators, for example. 2072 2073Example matches 'a' 2074 (a ?: c) + 42; 2075</pre></td></tr> 2076 2077 2078<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 2079<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 2080 2081Example matches (foo() + 1) 2082 int foo() { return 1; } 2083 int a = (foo() + 1); 2084</pre></td></tr> 2085 2086 2087<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 2088<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 2089ParenListExprs don't have a predefined type and are used for late parsing. 2090In the final AST, they can be met in template declarations. 2091 2092Given 2093 template<typename T> class X { 2094 void f() { 2095 X x(*this); 2096 int a = 0, b = 1; int i = (a, b); 2097 } 2098 }; 2099parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2100has a predefined type and is a ParenExpr, not a ParenListExpr. 2101</pre></td></tr> 2102 2103 2104<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 2105<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2106 2107Example: Matches __func__ 2108 printf("%s", __func__); 2109</pre></td></tr> 2110 2111 2112<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 2113<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2114 2115Given 2116 return 1; 2117returnStmt() 2118 matches 'return 1' 2119</pre></td></tr> 2120 2121 2122<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 2123<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2124 2125Given 2126 { ++a; } 2127stmt() 2128 matches both the compound statement '{ ++a; }' and '++a'. 2129</pre></td></tr> 2130 2131 2132<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 2133<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2134 2135Example match: ({ int X = 4; X; }) 2136 int C = ({ int X = 4; X; }); 2137</pre></td></tr> 2138 2139 2140<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 2141<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2142 2143Example matches "abcd", L"abcd" 2144 char *s = "abcd"; 2145 wchar_t *ws = L"abcd"; 2146</pre></td></tr> 2147 2148 2149<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 2150<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2151 2152Given 2153 template <int N> 2154 struct A { static const int n = N; }; 2155 struct B : public A<42> {}; 2156substNonTypeTemplateParmExpr() 2157 matches "N" in the right-hand side of "static const int n = N;" 2158</pre></td></tr> 2159 2160 2161<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 2162<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2163 2164Given 2165 switch(a) { case 42: break; default: break; } 2166switchCase() 2167 matches 'case 42:' and 'default:'. 2168</pre></td></tr> 2169 2170 2171<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 2172<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2173 2174Given 2175 switch(a) { case 42: break; default: break; } 2176switchStmt() 2177 matches 'switch(a)'. 2178</pre></td></tr> 2179 2180 2181<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 2182<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2183 2184Given 2185 Foo x = bar; 2186 int y = sizeof(x) + alignof(x); 2187unaryExprOrTypeTraitExpr() 2188 matches sizeof(x) and alignof(x) 2189</pre></td></tr> 2190 2191 2192<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 2193<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2194 2195Example matches !a 2196 !a || b 2197</pre></td></tr> 2198 2199 2200<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 2201<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2202but could not be resolved to a specific declaration. 2203 2204Given 2205 template<typename T> 2206 T foo() { T a; return a; } 2207 template<typename T> 2208 void bar() { 2209 foo<T>(); 2210 } 2211unresolvedLookupExpr() 2212 matches foo<T>() </pre></td></tr> 2213 2214 2215<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 2216<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2217 2218Given 2219 struct X { 2220 template <class T> void f(); 2221 void g(); 2222 }; 2223 template <class T> void h() { X x; x.f<T>(); x.g(); } 2224unresolvedMemberExpr() 2225 matches x.f<T> 2226</pre></td></tr> 2227 2228 2229<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 2230<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2231 2232Example match: "foo"_suffix 2233</pre></td></tr> 2234 2235 2236<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 2237<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2238 2239Given 2240 while (true) {} 2241whileStmt() 2242 matches 'while (true) {}'. 2243</pre></td></tr> 2244 2245 2246<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr> 2247<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2248 2249Given 2250 template <typename T> struct C {}; 2251 C<int> c; 2252templateArgumentLoc() 2253 matches 'int' in C<int>. 2254</pre></td></tr> 2255 2256 2257<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 2258<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2259 2260Given 2261 template <typename T> struct C {}; 2262 C<int> c; 2263templateArgument() 2264 matches 'int' in C<int>. 2265</pre></td></tr> 2266 2267 2268<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 2269<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2270 2271Given 2272 template <typename T> class X { }; 2273 X<int> xi; 2274templateName() 2275 matches 'X' in X<int>. 2276</pre></td></tr> 2277 2278 2279<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>>...</td></tr> 2280<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s. 2281 2282Given 2283 struct s {}; 2284 struct s ss; 2285elaboratedTypeLoc() 2286 matches the `TypeLoc` of the variable declaration of `ss`. 2287</pre></td></tr> 2288 2289 2290<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>>...</td></tr> 2291<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s. 2292 2293Given 2294 int* x; 2295pointerTypeLoc() 2296 matches `int*`. 2297</pre></td></tr> 2298 2299 2300<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('qualifiedTypeLoc0')"><a name="qualifiedTypeLoc0Anchor">qualifiedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>>...</td></tr> 2301<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST. 2302 2303Given 2304 const int x = 0; 2305qualifiedTypeLoc() 2306 matches `const int`. 2307</pre></td></tr> 2308 2309 2310<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>>...</td></tr> 2311<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s. 2312 2313Given 2314 int x = 3; 2315 int& l = x; 2316 int&& r = 3; 2317referenceTypeLoc() 2318 matches `int&` and `int&&`. 2319</pre></td></tr> 2320 2321 2322<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>>...</td></tr> 2323<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s. 2324 2325Given 2326 template <typename T> class C {}; 2327 C<char> var; 2328varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc()))) 2329 matches `C<char> var`. 2330</pre></td></tr> 2331 2332 2333<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 2334<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2335</pre></td></tr> 2336 2337 2338<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 2339<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2340 2341Given 2342 int a[] = { 2, 3 }; 2343 int b[4]; 2344 void f() { int c[a[0]]; } 2345arrayType() 2346 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2347</pre></td></tr> 2348 2349 2350<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 2351<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2352 2353Given 2354 _Atomic(int) i; 2355atomicType() 2356 matches "_Atomic(int) i" 2357</pre></td></tr> 2358 2359 2360<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 2361<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2362 2363Given: 2364 auto n = 4; 2365 int v[] = { 2, 3 } 2366 for (auto i : v) { } 2367autoType() 2368 matches "auto n" and "auto i" 2369</pre></td></tr> 2370 2371 2372<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 2373<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2374"void (^)(int)". 2375 2376The pointee is always required to be a FunctionType. 2377</pre></td></tr> 2378 2379 2380<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 2381<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2382 2383Given 2384 struct A {}; 2385 A a; 2386 int b; 2387 float c; 2388 bool d; 2389builtinType() 2390 matches "int b", "float c" and "bool d" 2391</pre></td></tr> 2392 2393 2394<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 2395<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2396 2397Given 2398 _Complex float f; 2399complexType() 2400 matches "_Complex float f" 2401</pre></td></tr> 2402 2403 2404<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 2405<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2406 2407Given 2408 void() { 2409 int a[2]; 2410 int b[] = { 2, 3 }; 2411 int c[b[0]]; 2412 } 2413constantArrayType() 2414 matches "int a[2]" 2415</pre></td></tr> 2416 2417 2418<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 2419<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2420Example matches i[] in declaration of f. 2421 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2422Example matches i[1]. 2423 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2424 void f(int i[]) { 2425 i[1] = 0; 2426 } 2427</pre></td></tr> 2428 2429 2430<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr> 2431<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2432 2433Given: 2434 short i = 1; 2435 int j = 42; 2436 decltype(i + j) result = i + j; 2437decltypeType() 2438 matches "decltype(i + j)" 2439</pre></td></tr> 2440 2441 2442<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 2443<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2444template types. 2445 2446Given 2447 template <typename T> 2448 class C { public: C(T); }; 2449 2450 C c(123); 2451deducedTemplateSpecializationType() matches the type in the declaration 2452of the variable c. 2453</pre></td></tr> 2454 2455 2456<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 2457<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2458 2459Given 2460 template<typename T, int Size> 2461 class array { 2462 T data[Size]; 2463 }; 2464dependentSizedArrayType 2465 matches "T data[Size]" 2466</pre></td></tr> 2467 2468 2469<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 2470<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2471qualified name. 2472 2473Given 2474 namespace N { 2475 namespace M { 2476 class D {}; 2477 } 2478 } 2479 class C {}; 2480 2481 class C c; 2482 N::M::D d; 2483 2484elaboratedType() matches the type of the variable declarations of both 2485c and d. 2486</pre></td></tr> 2487 2488 2489<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 2490<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2491 2492Given 2493 enum C { Green }; 2494 enum class S { Red }; 2495 2496 C c; 2497 S s; 2498 2499enumType() matches the type of the variable declarations of both c and 2500s. 2501</pre></td></tr> 2502 2503 2504<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 2505<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2506 2507Given 2508 int (*f)(int); 2509 void g(); 2510functionProtoType() 2511 matches "int (*f)(int)" and the type of "g" in C++ mode. 2512 In C mode, "g" is not matched because it does not contain a prototype. 2513</pre></td></tr> 2514 2515 2516<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 2517<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2518 2519Given 2520 int (*f)(int); 2521 void g(); 2522functionType() 2523 matches "int (*f)(int)" and the type of "g". 2524</pre></td></tr> 2525 2526 2527<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 2528<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2529 2530Given 2531 int a[] = { 2, 3 }; 2532 int b[42]; 2533 void f(int c[]) { int d[a[0]]; }; 2534incompleteArrayType() 2535 matches "int a[]" and "int c[]" 2536</pre></td></tr> 2537 2538 2539<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 2540<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2541 2542Example matches S s, but not S<T> s. 2543 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2544 template <typename T> struct S { 2545 void f(S s); 2546 void g(S<T> s); 2547 }; 2548</pre></td></tr> 2549 2550 2551<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 2552<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2553 2554Given: 2555 int *a; 2556 int &b = *a; 2557 int &&c = 1; 2558 auto &d = b; 2559 auto &&e = c; 2560 auto &&f = 2; 2561 int g = 5; 2562 2563lValueReferenceType() matches the types of b, d, and e. e is 2564matched since the type is deduced as int& by reference collapsing rules. 2565</pre></td></tr> 2566 2567 2568<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 2569<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2570Given 2571 struct A { int i; } 2572 A::* ptr = A::i; 2573memberPointerType() 2574 matches "A::* ptr" 2575</pre></td></tr> 2576 2577 2578<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 2579<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2580a pointer type, despite being syntactically similar. 2581 2582Given 2583 int *a; 2584 2585 @interface Foo 2586 @end 2587 Foo *f; 2588pointerType() 2589 matches "Foo *f", but does not match "int *a". 2590</pre></td></tr> 2591 2592 2593<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 2594<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2595 2596Given 2597 int (*ptr_to_array)[4]; 2598 int *array_of_ptrs[4]; 2599 2600varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2601array_of_ptrs. 2602</pre></td></tr> 2603 2604 2605<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 2606<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2607types. 2608 2609Given 2610 int *a; 2611 int &b = *a; 2612 int c = 5; 2613 2614 @interface Foo 2615 @end 2616 Foo *f; 2617pointerType() 2618 matches "int *a", but does not match "Foo *f". 2619</pre></td></tr> 2620 2621 2622<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 2623<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2624 2625Given: 2626 int *a; 2627 int &b = *a; 2628 int &&c = 1; 2629 auto &d = b; 2630 auto &&e = c; 2631 auto &&f = 2; 2632 int g = 5; 2633 2634rValueReferenceType() matches the types of c and f. e is not 2635matched as it is deduced to int& by reference collapsing rules. 2636</pre></td></tr> 2637 2638 2639<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 2640<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2641 2642Given 2643 class C {}; 2644 struct S {}; 2645 2646 C c; 2647 S s; 2648 2649recordType() matches the type of the variable declarations of both c 2650and s. 2651</pre></td></tr> 2652 2653 2654<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2655<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2656 2657Given 2658 int *a; 2659 int &b = *a; 2660 int &&c = 1; 2661 auto &d = b; 2662 auto &&e = c; 2663 auto &&f = 2; 2664 int g = 5; 2665 2666referenceType() matches the types of b, c, d, e, and f. 2667</pre></td></tr> 2668 2669 2670<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2671<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2672template type parameter. 2673 2674Given 2675 template <typename T> 2676 void F(T t) { 2677 int i = 1 + t; 2678 } 2679 2680substTemplateTypeParmType() matches the type of 't' but not '1' 2681</pre></td></tr> 2682 2683 2684<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 2685<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2686 2687Given 2688 enum E {}; 2689 class C {}; 2690 2691 E e; 2692 C c; 2693 2694tagType() matches the type of the variable declarations of both e 2695and c. 2696</pre></td></tr> 2697 2698 2699<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2700<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2701 2702Given 2703 template <typename T> 2704 class C { }; 2705 2706 template class C<int>; // A 2707 C<char> var; // B 2708 2709templateSpecializationType() matches the type of the explicit 2710instantiation in A and the type of the variable declaration in B. 2711</pre></td></tr> 2712 2713 2714<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2715<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2716 2717Example matches T, but not int. 2718 (matcher = templateTypeParmType()) 2719 template <typename T> void f(int i); 2720</pre></td></tr> 2721 2722 2723<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2724<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2725</pre></td></tr> 2726 2727 2728<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 2729<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2730 2731Given 2732 typedef int X; 2733typedefType() 2734 matches "typedef int X" 2735</pre></td></tr> 2736 2737 2738<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2739<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2740 2741Given: 2742 typedef __underlying_type(T) type; 2743unaryTransformType() 2744 matches "__underlying_type(T)" 2745</pre></td></tr> 2746 2747 2748<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2749<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2750integer-constant-expression. 2751 2752Given 2753 void f() { 2754 int a[] = { 2, 3 } 2755 int b[42]; 2756 int c[a[0]]; 2757 } 2758variableArrayType() 2759 matches "int c[a[0]]" 2760</pre></td></tr> 2761 2762<!--END_DECL_MATCHERS --> 2763</table> 2764 2765<!-- ======================================================================= --> 2766<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2767<!-- ======================================================================= --> 2768 2769<p>Narrowing matchers match certain attributes on the current node, thus 2770narrowing down the set of nodes of the current type to match on.</p> 2771 2772<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2773which allow users to create more powerful match expressions.</p> 2774 2775<table> 2776<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2777<!-- START_NARROWING_MATCHERS --> 2778 2779<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2780<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2781 2782Usable as: Any Matcher 2783</pre></td></tr> 2784 2785 2786<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2787<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2788 2789Usable as: Any Matcher 2790</pre></td></tr> 2791 2792 2793<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2794<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2795 2796Useful when another matcher requires a child matcher, but there's no 2797additional constraint. This will often be used with an explicit conversion 2798to an internal::Matcher<> type such as TypeMatcher. 2799 2800Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2801"int* p" and "void f()" in 2802 int* p; 2803 void f(); 2804 2805Usable as: Any Matcher 2806</pre></td></tr> 2807 2808 2809<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2810<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2811 2812Given 2813 if (true); 2814 for (; true; ); 2815with the matcher 2816 mapAnyOf(ifStmt, forStmt).with( 2817 hasCondition(cxxBoolLiteralExpr(equals(true))) 2818 ).bind("trueCond") 2819matches the if and the for. It is equivalent to: 2820 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2821 anyOf( 2822 ifStmt(trueCond).bind("trueCond"), 2823 forStmt(trueCond).bind("trueCond") 2824 ); 2825 2826The with() chain-call accepts zero or more matchers which are combined 2827as-if with allOf() in each of the node matchers. 2828Usable as: Any Matcher 2829</pre></td></tr> 2830 2831 2832<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2833<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2834 2835Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2836 class X {}; 2837 class Y {}; 2838 2839Usable as: Any Matcher 2840</pre></td></tr> 2841 2842 2843<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> 2844<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 2845implicit default/copy constructors). 2846</pre></td></tr> 2847 2848 2849<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> 2850<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2851specified names. 2852 2853 hasAnyOperatorName("+", "-") 2854 Is equivalent to 2855 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2856</pre></td></tr> 2857 2858 2859<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> 2860<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2861unary). 2862 2863Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2864 !(a || b) 2865</pre></td></tr> 2866 2867 2868<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> 2869<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2870 2871Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2872 if (a == b) 2873 a += b; 2874 2875Example 2: matches s1 = s2 2876 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2877 struct S { S& operator=(const S&); }; 2878 void x() { S s1, s2; s1 = s2; } 2879</pre></td></tr> 2880 2881 2882<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> 2883<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2884 2885Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2886 if (a == b) 2887 a += b; 2888 2889Example 2: matches s1 < s2 2890 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2891 struct S { bool operator<(const S& other); }; 2892 void x(S s1, S s2) { bool b1 = s1 < s2; } 2893</pre></td></tr> 2894 2895 2896<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> 2897<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2898inheritance. 2899 2900Examples: 2901 class C { 2902 public: int a; 2903 protected: int b; 2904 private: int c; // fieldDecl(isPrivate()) matches 'c' 2905 }; 2906 2907 struct Base {}; 2908 struct Derived1 : private Base {}; // matches 'Base' 2909 class Derived2 : Base {}; // matches 'Base' 2910</pre></td></tr> 2911 2912 2913<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> 2914<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2915protected inheritance. 2916 2917Examples: 2918 class C { 2919 public: int a; 2920 protected: int b; // fieldDecl(isProtected()) matches 'b' 2921 private: int c; 2922 }; 2923 2924 class Base {}; 2925 class Derived : protected Base {}; // matches 'Base' 2926</pre></td></tr> 2927 2928 2929<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> 2930<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2931inheritance. 2932 2933Examples: 2934 class C { 2935 public: int a; // fieldDecl(isPublic()) matches 'a' 2936 protected: int b; 2937 private: int c; 2938 }; 2939 2940 class Base {}; 2941 class Derived1 : public Base {}; // matches 'Base' 2942 struct Derived2 : Base {}; // matches 'Base' 2943</pre></td></tr> 2944 2945 2946<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> 2947<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2948virtual inheritance. 2949 2950Example: 2951 class A { 2952 public: 2953 virtual void x(); // matches x 2954 }; 2955 2956Example: 2957 class Base {}; 2958 class DirectlyDerived : virtual Base {}; // matches Base 2959 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2960 2961Usable 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>> 2962</pre></td></tr> 2963 2964 2965<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> 2966<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2967 2968 2969<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> 2970<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2971 2972Given 2973 f('false, 3.14, 42); 2974characterLiteral(equals(0)) 2975 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2976 match false 2977floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2978 match 3.14 2979integerLiteral(equals(42)) 2980 matches 42 2981 2982Note that you cannot directly match a negative numeric literal because the 2983minus sign is not part of the literal: It is a unary operator whose operand 2984is the positive numeric literal. Instead, you must use a unaryOperator() 2985matcher to match the minus sign: 2986 2987unaryOperator(hasOperatorName("-"), 2988 hasUnaryOperand(integerLiteral(equals(13)))) 2989 2990Usable 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>>, 2991 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>> 2992</pre></td></tr> 2993 2994 2995<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> 2996<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2997 2998 2999<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> 3000<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 3001 3002 3003<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> 3004<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 3005 3006Given 3007 try { 3008 // ... 3009 } catch (int) { 3010 // ... 3011 } catch (...) { 3012 // ... 3013 } 3014cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 3015</pre></td></tr> 3016 3017 3018<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> 3019<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 3020a specific number of arguments (including absent default arguments). 3021 3022Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3023 void f(int x, int y); 3024 f(0, 0); 3025</pre></td></tr> 3026 3027 3028<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> 3029<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 3030</pre></td></tr> 3031 3032 3033<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> 3034<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 3035zero initialization. 3036 3037Given 3038void foo() { 3039 struct point { double x; double y; }; 3040 point pt[2] = { { 1.0, 2.0 } }; 3041} 3042initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 3043will match the implicit array filler for pt[1]. 3044</pre></td></tr> 3045 3046 3047<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> 3048<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 3049 3050Given 3051 struct S { 3052 S(); // #1 3053 S(const S &); // #2 3054 S(S &&); // #3 3055 }; 3056cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 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('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 3061<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 3062 3063Given 3064 struct S { 3065 S(); // #1 3066 S(const S &); // #2 3067 S(S &&); // #3 3068 }; 3069cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 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('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 3074<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 3075 3076Given 3077 struct S { 3078 S(); // #1 3079 S(int) {} // #2 3080 S(S &&) : S() {} // #3 3081 }; 3082 S::S() : S(0) {} // #4 3083cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 3084#1 or #2. 3085</pre></td></tr> 3086 3087 3088<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> 3089<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 3090that have an explicit specifier if this explicit specifier is resolved to 3091true. 3092 3093Given 3094 template<bool b> 3095 struct S { 3096 S(int); // #1 3097 explicit S(double); // #2 3098 operator int(); // #3 3099 explicit operator bool(); // #4 3100 explicit(false) S(bool) // # 7 3101 explicit(true) S(char) // # 8 3102 explicit(b) S(S) // # 9 3103 }; 3104 S(int) -> S<true> // #5 3105 explicit S(double) -> S<false> // #6 3106cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3107cxxConversionDecl(isExplicit()) will match #4, but not #3. 3108cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3109</pre></td></tr> 3110 3111 3112<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> 3113<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr> 3114 3115 3116<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> 3117<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3118 3119Given 3120 struct S { 3121 S(); // #1 3122 S(const S &); // #2 3123 S(S &&); // #3 3124 }; 3125cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3126</pre></td></tr> 3127 3128 3129<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> 3130<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3131that have an explicit specifier if this explicit specifier is resolved to 3132true. 3133 3134Given 3135 template<bool b> 3136 struct S { 3137 S(int); // #1 3138 explicit S(double); // #2 3139 operator int(); // #3 3140 explicit operator bool(); // #4 3141 explicit(false) S(bool) // # 7 3142 explicit(true) S(char) // # 8 3143 explicit(b) S(S) // # 9 3144 }; 3145 S(int) -> S<true> // #5 3146 explicit S(double) -> S<false> // #6 3147cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3148cxxConversionDecl(isExplicit()) will match #4, but not #3. 3149cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3150</pre></td></tr> 3151 3152 3153<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> 3154<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3155opposed to a member. 3156 3157Given 3158 struct B {}; 3159 struct D : B { 3160 int I; 3161 D(int i) : I(i) {} 3162 }; 3163 struct E : B { 3164 E() : B() {} 3165 }; 3166cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3167 will match E(), but not match D(int). 3168</pre></td></tr> 3169 3170 3171<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> 3172<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3173opposed to a base. 3174 3175Given 3176 struct B {}; 3177 struct D : B { 3178 int I; 3179 D(int i) : I(i) {} 3180 }; 3181 struct E : B { 3182 E() : B() {} 3183 }; 3184cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3185 will match D(int), but not match E(). 3186</pre></td></tr> 3187 3188 3189<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> 3190<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3191code (as opposed to implicitly added by the compiler). 3192 3193Given 3194 struct Foo { 3195 Foo() { } 3196 Foo(int) : foo_("A") { } 3197 string foo_; 3198 }; 3199cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3200 will match Foo(int), but not Foo() 3201</pre></td></tr> 3202 3203 3204<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> 3205<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3206that have an explicit specifier if this explicit specifier is resolved to 3207true. 3208 3209Given 3210 template<bool b> 3211 struct S { 3212 S(int); // #1 3213 explicit S(double); // #2 3214 operator int(); // #3 3215 explicit operator bool(); // #4 3216 explicit(false) S(bool) // # 7 3217 explicit(true) S(char) // # 8 3218 explicit(b) S(S) // # 9 3219 }; 3220 S(int) -> S<true> // #5 3221 explicit S(double) -> S<false> // #6 3222cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3223cxxConversionDecl(isExplicit()) will match #4, but not #3. 3224cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3225</pre></td></tr> 3226 3227 3228<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> 3229<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3230 3231In template declarations, dependent members are not resolved and so can 3232not be matched to particular named declarations. 3233 3234This matcher allows to match on the known name of members. 3235 3236Given 3237 template <typename T> 3238 struct S { 3239 void mem(); 3240 }; 3241 template <typename T> 3242 void x() { 3243 S<T> s; 3244 s.mem(); 3245 } 3246cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3247</pre></td></tr> 3248 3249 3250<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> 3251<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3252to '.'. 3253 3254Member calls on the implicit this pointer match as called with '->'. 3255 3256Given 3257 class Y { 3258 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3259 template <class T> void f() { this->f<T>(); f<T>(); } 3260 int a; 3261 static int b; 3262 }; 3263 template <class T> 3264 class Z { 3265 void x() { this->m; } 3266 }; 3267memberExpr(isArrow()) 3268 matches this->x, x, y.x, a, this->b 3269cxxDependentScopeMemberExpr(isArrow()) 3270 matches this->m 3271unresolvedMemberExpr(isArrow()) 3272 matches this->f<T>, f<T> 3273</pre></td></tr> 3274 3275 3276<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> 3277<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3278node 3279 3280In template declarations, dependent members are not resolved and so can 3281not be matched to particular named declarations. 3282 3283This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3284and CXXMethodDecl nodes. 3285 3286Given 3287 template <typename T> 3288 struct S { 3289 void mem(); 3290 }; 3291 template <typename T> 3292 void x() { 3293 S<T> s; 3294 s.mem(); 3295 } 3296The matcher 3297@code 3298cxxDependentScopeMemberExpr( 3299 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3300 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3301 cxxMethodDecl(hasName("mem")).bind("templMem") 3302 ))))) 3303 )))), 3304 memberHasSameNameAsBoundNode("templMem") 3305 ) 3306@endcode 3307first matches and binds the @c mem member of the @c S template, then 3308compares its name to the usage in @c s.mem() in the @c x function template 3309</pre></td></tr> 3310 3311 3312<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> 3313<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3314 3315Given 3316struct A { 3317 void foo() const; 3318 void bar(); 3319}; 3320 3321cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 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('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 3326<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3327operator. 3328 3329Given 3330struct A { 3331 A &operator=(const A &); 3332 A &operator=(A &&); 3333}; 3334 3335cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3336the second one. 3337</pre></td></tr> 3338 3339 3340<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> 3341<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3342 3343Given: 3344 class A final {}; 3345 3346 struct B { 3347 virtual void f(); 3348 }; 3349 3350 struct C : B { 3351 void f() final; 3352 }; 3353matches A and C::f, but not B, C, or B::f 3354</pre></td></tr> 3355 3356 3357<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> 3358<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3359operator. 3360 3361Given 3362struct A { 3363 A &operator=(const A &); 3364 A &operator=(A &&); 3365}; 3366 3367cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3368the first one. 3369</pre></td></tr> 3370 3371 3372<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> 3373<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3374 3375Given 3376 class A { 3377 public: 3378 virtual void x(); 3379 }; 3380 class B : public A { 3381 public: 3382 virtual void x(); 3383 }; 3384 matches B::x 3385</pre></td></tr> 3386 3387 3388<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> 3389<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3390 3391Given 3392 class A { 3393 public: 3394 virtual void x() = 0; 3395 }; 3396 matches A::x 3397</pre></td></tr> 3398 3399 3400<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 3401<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3402 3403Given 3404 struct S { 3405 S(); // #1 3406 S(const S &) = default; // #2 3407 S(S &&) = delete; // #3 3408 }; 3409cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 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('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr> 3414<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3415virtual inheritance. 3416 3417Example: 3418 class A { 3419 public: 3420 virtual void x(); // matches x 3421 }; 3422 3423Example: 3424 class Base {}; 3425 class DirectlyDerived : virtual Base {}; // matches Base 3426 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3427 3428Usable 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>> 3429</pre></td></tr> 3430 3431 3432<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> 3433<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3434 3435Given 3436 class A { 3437 public: 3438 virtual void x(); 3439 }; 3440 class B : public A { 3441 public: 3442 void x(); 3443 }; 3444 matches A::x but not B::x 3445</pre></td></tr> 3446 3447 3448<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> 3449<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3450 3451Given: 3452 MyClass *p1 = new MyClass[10]; 3453cxxNewExpr(isArray()) 3454 matches the expression 'new MyClass[10]'. 3455</pre></td></tr> 3456 3457 3458<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> 3459<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3460specified names. 3461 3462 hasAnyOperatorName("+", "-") 3463 Is equivalent to 3464 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3465</pre></td></tr> 3466 3467 3468<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> 3469<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3470 3471Matches overloaded operator names specified in strings without the 3472"operator" prefix: e.g. "<<". 3473 3474 hasAnyOverloadedOperatorName("+", "-") 3475Is equivalent to 3476 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3477</pre></td></tr> 3478 3479 3480<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3481<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3482unary). 3483 3484Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3485 !(a || b) 3486</pre></td></tr> 3487 3488 3489<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> 3490<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3491 3492Matches overloaded operator names specified in strings without the 3493"operator" prefix: e.g. "<<". 3494 3495Given: 3496 class A { int operator*(); }; 3497 const A &operator<<(const A &a, const A &b); 3498 A a; 3499 a << a; // <-- This matches 3500 3501cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3502specified line and 3503cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3504matches the declaration of A. 3505 3506Usable 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>> 3507</pre></td></tr> 3508 3509 3510<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> 3511<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3512 3513Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3514 if (a == b) 3515 a += b; 3516 3517Example 2: matches s1 = s2 3518 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3519 struct S { S& operator=(const S&); }; 3520 void x() { S s1, s2; s1 = s2; } 3521</pre></td></tr> 3522 3523 3524<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> 3525<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3526 3527Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3528 if (a == b) 3529 a += b; 3530 3531Example 2: matches s1 < s2 3532 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3533 struct S { bool operator<(const S& other); }; 3534 void x(S s1, S s2) { bool b1 = s1 < s2; } 3535</pre></td></tr> 3536 3537 3538<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> 3539<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3540 3541Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3542class x {}; 3543class y; 3544</pre></td></tr> 3545 3546 3547<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> 3548<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3549</pre></td></tr> 3550 3551 3552<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> 3553<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3554</pre></td></tr> 3555 3556 3557<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> 3558<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3559static member variable template instantiations. 3560 3561Given 3562 template<typename T> void A(T t) { } 3563 template<> void A(int N) { } 3564functionDecl(isExplicitTemplateSpecialization()) 3565 matches the specialization A<int>(). 3566 3567Usable 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>> 3568</pre></td></tr> 3569 3570 3571<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> 3572<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3573 3574Given: 3575 class A final {}; 3576 3577 struct B { 3578 virtual void f(); 3579 }; 3580 3581 struct C : B { 3582 void f() final; 3583 }; 3584matches A and C::f, but not B, C, or B::f 3585</pre></td></tr> 3586 3587 3588<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> 3589<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3590 3591Given: 3592 auto x = []{}; 3593 3594cxxRecordDecl(isLambda()) matches the implicit class declaration of 3595decltype(x) 3596</pre></td></tr> 3597 3598 3599<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> 3600<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3601isSameOrDerivedFrom(hasName(...)). 3602</pre></td></tr> 3603 3604 3605<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> 3606<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3607member variable template instantiations. 3608 3609Given 3610 template <typename T> class X {}; class A {}; X<A> x; 3611or 3612 template <typename T> class X {}; class A {}; template class X<A>; 3613or 3614 template <typename T> class X {}; class A {}; extern template class X<A>; 3615cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3616 matches the template instantiation of X<A>. 3617 3618But given 3619 template <typename T> class X {}; class A {}; 3620 template <> class X<A> {}; X<A> x; 3621cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3622 does not match, as X<A> is an explicit template specialization. 3623 3624Usable 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>> 3625</pre></td></tr> 3626 3627 3628<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> 3629<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3630specified names. 3631 3632 hasAnyOperatorName("+", "-") 3633 Is equivalent to 3634 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3635</pre></td></tr> 3636 3637 3638<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> 3639<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3640unary). 3641 3642Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3643 !(a || b) 3644</pre></td></tr> 3645 3646 3647<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> 3648<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3649 3650Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3651 if (a == b) 3652 a += b; 3653 3654Example 2: matches s1 = s2 3655 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3656 struct S { S& operator=(const S&); }; 3657 void x() { S s1, s2; s1 = s2; } 3658</pre></td></tr> 3659 3660 3661<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> 3662<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3663 3664Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3665 if (a == b) 3666 a += b; 3667 3668Example 2: matches s1 < s2 3669 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3670 struct S { bool operator<(const S& other); }; 3671 void x(S s1, S s2) { bool b1 = s1 < s2; } 3672</pre></td></tr> 3673 3674 3675<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> 3676<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3677a specific number of arguments (including absent default arguments). 3678 3679Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3680 void f(int x, int y); 3681 f(0, 0); 3682</pre></td></tr> 3683 3684 3685<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> 3686<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3687a specific number of arguments (including absent default arguments). 3688 3689Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3690 void f(int x, int y); 3691 f(0, 0); 3692</pre></td></tr> 3693 3694 3695<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> 3696<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3697 3698Example matches y(x) but not y(42) or NS::y(x). 3699 namespace NS { 3700 struct X {}; 3701 void y(X); 3702 } 3703 3704 void y(...); 3705 3706 void test() { 3707 NS::X x; 3708 y(x); // Matches 3709 NS::y(x); // Doesn't match 3710 y(42); // Doesn't match 3711 using NS::y; 3712 y(x); // Found by both unqualified lookup and ADL, doesn't match 3713 } 3714</pre></td></tr> 3715 3716 3717<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> 3718<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3719 3720Example: matches the implicit cast around 0 3721(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3722 int *p = 0; 3723 3724If the matcher is use from clang-query, CastKind parameter 3725should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3726</pre></td></tr> 3727 3728 3729<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> 3730<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3731 3732 3733<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> 3734<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3735 3736Given 3737 f('false, 3.14, 42); 3738characterLiteral(equals(0)) 3739 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3740 match false 3741floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3742 match 3.14 3743integerLiteral(equals(42)) 3744 matches 42 3745 3746Note that you cannot directly match a negative numeric literal because the 3747minus sign is not part of the literal: It is a unary operator whose operand 3748is the positive numeric literal. Instead, you must use a unaryOperator() 3749matcher to match the minus sign: 3750 3751unaryOperator(hasOperatorName("-"), 3752 hasUnaryOperand(integerLiteral(equals(13)))) 3753 3754Usable 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>>, 3755 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>> 3756</pre></td></tr> 3757 3758 3759<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> 3760<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3761 3762 3763<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> 3764<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3765 3766 3767<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> 3768<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3769 3770Given 3771 template<typename T> struct C {}; 3772 C<int> c; 3773classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3774 matches C<int>. 3775</pre></td></tr> 3776 3777 3778<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> 3779<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3780child statements. 3781 3782Example: Given 3783 { for (;;) {} } 3784compoundStmt(statementCountIs(0))) 3785 matches '{}' 3786 but does not match the outer compound statement. 3787</pre></td></tr> 3788 3789 3790<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> 3791<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3792 3793Given 3794 int a[42]; 3795 int b[2 * 21]; 3796 int c[41], d[43]; 3797 char *s = "abcd"; 3798 wchar_t *ws = L"abcd"; 3799 char *w = "a"; 3800constantArrayType(hasSize(42)) 3801 matches "int a[42]" and "int b[2 * 21]" 3802stringLiteral(hasSize(4)) 3803 matches "abcd", L"abcd" 3804</pre></td></tr> 3805 3806 3807<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> 3808<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3809declarations. 3810 3811Example: Given 3812 int a, b; 3813 int c; 3814 int d = 2, e; 3815declCountIs(2) 3816 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3817</pre></td></tr> 3818 3819 3820<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> 3821<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3822 3823Matches a node if it equals the node previously bound to ID. 3824 3825Given 3826 class X { int a; int b; }; 3827cxxRecordDecl( 3828 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3829 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3830 matches the class X, as a and b have the same type. 3831 3832Note that when multiple matches are involved via forEach* matchers, 3833equalsBoundNodes acts as a filter. 3834For example: 3835compoundStmt( 3836 forEachDescendant(varDecl().bind("d")), 3837 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3838will trigger a match for each combination of variable declaration 3839and reference to that variable declaration within a compound statement. 3840</pre></td></tr> 3841 3842 3843<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 3844<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3845 3846Decl has pointer identity in the AST. 3847</pre></td></tr> 3848 3849 3850<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> 3851<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3852 3853Given 3854 __attribute__((device)) void f() { ... } 3855decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3856f. If the matcher is used from clang-query, attr::Kind parameter should be 3857passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3858</pre></td></tr> 3859 3860 3861<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> 3862<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3863Does not match if only part of the statement is expanded from that macro or 3864if different parts of the statement are expanded from different 3865appearances of the macro. 3866</pre></td></tr> 3867 3868 3869<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> 3870<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3871partially matching a given regex. 3872 3873Example matches Y but not X 3874 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3875 #include "ASTMatcher.h" 3876 class X {}; 3877ASTMatcher.h: 3878 class Y {}; 3879 3880Usable 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>> 3881 3882If the matcher is used in clang-query, RegexFlags parameter 3883should be passed as a quoted string. e.g: "NoFlags". 3884Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3885</pre></td></tr> 3886 3887 3888<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> 3889<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3890 3891Example matches X but not Y 3892 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3893 #include <Y.h> 3894 class X {}; 3895Y.h: 3896 class Y {}; 3897 3898Usable 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>> 3899</pre></td></tr> 3900 3901 3902<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> 3903<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3904 3905Example matches Y but not X 3906 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3907 #include <SystemHeader.h> 3908 class X {}; 3909SystemHeader.h: 3910 class Y {}; 3911 3912Usable 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>> 3913</pre></td></tr> 3914 3915 3916<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> 3917<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 3918implicit default/copy constructors). 3919</pre></td></tr> 3920 3921 3922<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> 3923<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3924 3925Given 3926 class vector {}; 3927 namespace foo { 3928 class vector {}; 3929 namespace std { 3930 class vector {}; 3931 } 3932 } 3933 namespace std { 3934 inline namespace __1 { 3935 class vector {}; // #1 3936 namespace experimental { 3937 class vector {}; 3938 } 3939 } 3940 } 3941cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3942</pre></td></tr> 3943 3944 3945<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> 3946<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3947template instantiations. 3948 3949Given 3950 template<typename T> void A(T t) { T i; } 3951 A(0); 3952 A(0U); 3953functionDecl(isInstantiated()) 3954 matches 'A(int) {...};' and 'A(unsigned) {...}'. 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('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr> 3959<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3960inheritance. 3961 3962Examples: 3963 class C { 3964 public: int a; 3965 protected: int b; 3966 private: int c; // fieldDecl(isPrivate()) matches 'c' 3967 }; 3968 3969 struct Base {}; 3970 struct Derived1 : private Base {}; // matches 'Base' 3971 class Derived2 : Base {}; // matches 'Base' 3972</pre></td></tr> 3973 3974 3975<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> 3976<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3977protected inheritance. 3978 3979Examples: 3980 class C { 3981 public: int a; 3982 protected: int b; // fieldDecl(isProtected()) matches 'b' 3983 private: int c; 3984 }; 3985 3986 class Base {}; 3987 class Derived : protected Base {}; // matches 'Base' 3988</pre></td></tr> 3989 3990 3991<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> 3992<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3993inheritance. 3994 3995Examples: 3996 class C { 3997 public: int a; // fieldDecl(isPublic()) matches 'a' 3998 protected: int b; 3999 private: int c; 4000 }; 4001 4002 class Base {}; 4003 class Derived1 : public Base {}; // matches 'Base' 4004 struct Derived2 : Base {}; // matches 'Base' 4005</pre></td></tr> 4006 4007 4008<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> 4009<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 4010a specific number of designators. 4011 4012Example: Given 4013 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 4014 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 4015designatorCountIs(2) 4016 matches '{ [2].y = 1.0, [0].x = 1.0 }', 4017 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 4018</pre></td></tr> 4019 4020 4021<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> 4022<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 4023 4024Example matches Y (matcher = enumDecl(isScoped())) 4025enum X {}; 4026enum class Y {}; 4027</pre></td></tr> 4028 4029 4030<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> 4031<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 4032neither type- nor value-dependent. 4033 4034In the following example, the expression sizeof(sizeof(T() + T())) 4035is instantiation-dependent (since it involves a template parameter T), 4036but is neither type- nor value-dependent, since the type of the inner 4037sizeof is known (std::size_t) and therefore the size of the outer 4038sizeof is known. 4039 template<typename T> 4040 void f(T x, T y) { sizeof(sizeof(T() + T()); } 4041expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 4042</pre></td></tr> 4043 4044 4045<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> 4046<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 4047is not yet instantiated. 4048 4049For example, the expressions "x" and "x + y" are type-dependent in 4050the following code, but "y" is not type-dependent: 4051 template<typename T> 4052 void add(T x, int y) { 4053 x + y; 4054 } 4055expr(isTypeDependent()) matches x + y 4056</pre></td></tr> 4057 4058 4059<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> 4060<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 4061non-type template parameter. 4062 4063For example, the array bound of "Chars" in the following example is 4064value-dependent. 4065 template<int Size> int f() { return Size; } 4066expr(isValueDependent()) matches return Size 4067</pre></td></tr> 4068 4069 4070<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> 4071<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 4072GNU's __null, C++11's nullptr, or C's NULL macro. 4073 4074Given: 4075 void *v1 = NULL; 4076 void *v2 = nullptr; 4077 void *v3 = __null; // GNU extension 4078 char *cp = (char *)0; 4079 int *ip = 0; 4080 int i = 0; 4081expr(nullPointerConstant()) 4082 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 4083 initializer for i. 4084</pre></td></tr> 4085 4086 4087<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> 4088<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 4089bit width. 4090 4091Given 4092 class C { 4093 int a : 2; 4094 int b : 4; 4095 int c : 2; 4096 }; 4097fieldDecl(hasBitWidth(2)) 4098 matches 'int a;' and 'int c;' but not 'int b;'. 4099</pre></td></tr> 4100 4101 4102<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> 4103<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 4104 4105Given 4106 class C { 4107 int a : 2; 4108 int b; 4109 }; 4110fieldDecl(isBitField()) 4111 matches 'int a;' but not 'int b;'. 4112</pre></td></tr> 4113 4114 4115<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> 4116<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4117 4118Given 4119 f('false, 3.14, 42); 4120characterLiteral(equals(0)) 4121 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4122 match false 4123floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4124 match 3.14 4125integerLiteral(equals(42)) 4126 matches 42 4127 4128Note that you cannot directly match a negative numeric literal because the 4129minus sign is not part of the literal: It is a unary operator whose operand 4130is the positive numeric literal. Instead, you must use a unaryOperator() 4131matcher to match the minus sign: 4132 4133unaryOperator(hasOperatorName("-"), 4134 hasUnaryOperand(integerLiteral(equals(13)))) 4135 4136Usable 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>>, 4137 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>> 4138</pre></td></tr> 4139 4140 4141<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> 4142<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 4143 4144 4145<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> 4146<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4147 4148Matches overloaded operator names specified in strings without the 4149"operator" prefix: e.g. "<<". 4150 4151 hasAnyOverloadedOperatorName("+", "-") 4152Is equivalent to 4153 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4154</pre></td></tr> 4155 4156 4157<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 4158<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4159 4160Given: 4161 void f(); 4162 void g() noexcept; 4163 void h() noexcept(true); 4164 void i() noexcept(false); 4165 void j() throw(); 4166 void k() throw(int); 4167 void l() throw(...); 4168functionDecl(hasDynamicExceptionSpec()) and 4169 functionProtoType(hasDynamicExceptionSpec()) 4170 match the declarations of j, k, and l, but not f, g, h, or i. 4171</pre></td></tr> 4172 4173 4174<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> 4175<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4176 4177Matches overloaded operator names specified in strings without the 4178"operator" prefix: e.g. "<<". 4179 4180Given: 4181 class A { int operator*(); }; 4182 const A &operator<<(const A &a, const A &b); 4183 A a; 4184 a << a; // <-- This matches 4185 4186cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4187specified line and 4188cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4189matches the declaration of A. 4190 4191Usable 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>> 4192</pre></td></tr> 4193 4194 4195<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> 4196<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4197 4198Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4199int X() {} 4200auto Y() -> int {} 4201</pre></td></tr> 4202 4203 4204<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> 4205<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4206 and if constexpr. 4207 4208Given: 4209 constexpr int foo = 42; 4210 constexpr int bar(); 4211 void baz() { if constexpr(1 > 0) {} } 4212varDecl(isConstexpr()) 4213 matches the declaration of foo. 4214functionDecl(isConstexpr()) 4215 matches the declaration of bar. 4216ifStmt(isConstexpr()) 4217 matches the if statement in baz. 4218</pre></td></tr> 4219 4220 4221<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> 4222<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4223 4224Given: 4225 class A { ~A(); }; 4226 class B { ~B() = default; }; 4227functionDecl(isDefaulted()) 4228 matches the declaration of ~B, but not ~A. 4229</pre></td></tr> 4230 4231 4232<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr> 4233<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4234 4235Example matches A, va, fa 4236 class A {}; 4237 class B; // Doesn't match, as it has no body. 4238 int va; 4239 extern int vb; // Doesn't match, as it doesn't define the variable. 4240 void fa() {} 4241 void fb(); // Doesn't match, as it has no body. 4242 @interface X 4243 - (void)ma; // Doesn't match, interface is declaration. 4244 @end 4245 @implementation X 4246 - (void)ma {} 4247 @end 4248 4249Usable 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>>, 4250 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4251</pre></td></tr> 4252 4253 4254<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> 4255<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4256 4257Given: 4258 void Func(); 4259 void DeletedFunc() = delete; 4260functionDecl(isDeleted()) 4261 matches the declaration of DeletedFunc, but not Func. 4262</pre></td></tr> 4263 4264 4265<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> 4266<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4267static member variable template instantiations. 4268 4269Given 4270 template<typename T> void A(T t) { } 4271 template<> void A(int N) { } 4272functionDecl(isExplicitTemplateSpecialization()) 4273 matches the specialization A<int>(). 4274 4275Usable 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>> 4276</pre></td></tr> 4277 4278 4279<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> 4280<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4281 4282Given: 4283 extern "C" void f() {} 4284 extern "C" { void g() {} } 4285 void h() {} 4286 extern "C" int x = 1; 4287 extern "C" int y = 2; 4288 int z = 3; 4289functionDecl(isExternC()) 4290 matches the declaration of f and g, but not the declaration of h. 4291varDecl(isExternC()) 4292 matches the declaration of x and y, but not the declaration of z. 4293</pre></td></tr> 4294 4295 4296<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> 4297<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4298the inline keyword. 4299 4300Given 4301 inline void f(); 4302 void g(); 4303 namespace n { 4304 inline namespace m {} 4305 } 4306functionDecl(isInline()) will match ::f(). 4307namespaceDecl(isInline()) will match n::m. 4308</pre></td></tr> 4309 4310 4311<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> 4312<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4313into an executable program. 4314</pre></td></tr> 4315 4316 4317<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> 4318<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4319 4320Given 4321 void nope(); 4322 [[noreturn]] void a(); 4323 __attribute__((noreturn)) void b(); 4324 struct c { [[noreturn]] c(); }; 4325functionDecl(isNoReturn()) 4326 matches all of those except 4327 void nope(); 4328</pre></td></tr> 4329 4330 4331<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> 4332<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4333 4334Given: 4335 void f(); 4336 void g() noexcept; 4337 void h() throw(); 4338 void i() throw(int); 4339 void j() noexcept(false); 4340functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4341 match the declarations of g, and h, but not f, i or j. 4342</pre></td></tr> 4343 4344 4345<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> 4346<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4347class specifier ("static" keyword) written in the source. 4348 4349Given: 4350 static void f() {} 4351 static int i = 0; 4352 extern int j; 4353 int k; 4354functionDecl(isStaticStorageClass()) 4355 matches the function declaration f. 4356varDecl(isStaticStorageClass()) 4357 matches the variable declaration i. 4358</pre></td></tr> 4359 4360 4361<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> 4362<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4363member variable template instantiations. 4364 4365Given 4366 template <typename T> class X {}; class A {}; X<A> x; 4367or 4368 template <typename T> class X {}; class A {}; template class X<A>; 4369or 4370 template <typename T> class X {}; class A {}; extern template class X<A>; 4371cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4372 matches the template instantiation of X<A>. 4373 4374But given 4375 template <typename T> class X {}; class A {}; 4376 template <> class X<A> {}; X<A> x; 4377cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4378 does not match, as X<A> is an explicit template specialization. 4379 4380Usable 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>> 4381</pre></td></tr> 4382 4383 4384<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> 4385<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4386 4387Example matches f, but not g or h. The function i will not match, even when 4388compiled in C mode. 4389 void f(...); 4390 void g(int); 4391 template <typename... Ts> void h(Ts...); 4392 void i(); 4393</pre></td></tr> 4394 4395 4396<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> 4397<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4398 4399Given: 4400 void foo() __attribute__((__weakref__("__foo"))); 4401 void bar(); 4402functionDecl(isWeak()) 4403 matches the weak declaration "foo", but not "bar". 4404</pre></td></tr> 4405 4406 4407<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> 4408<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4409specific parameter count. 4410 4411Given 4412 void f(int i) {} 4413 void g(int i, int j) {} 4414 void h(int i, int j); 4415 void j(int i); 4416 void k(int x, int y, int z, ...); 4417functionDecl(parameterCountIs(2)) 4418 matches g and h 4419functionProtoType(parameterCountIs(2)) 4420 matches g and h 4421functionProtoType(parameterCountIs(3)) 4422 matches k 4423</pre></td></tr> 4424 4425 4426<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> 4427<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4428 4429Given: 4430 void f(); 4431 void g() noexcept; 4432 void h() noexcept(true); 4433 void i() noexcept(false); 4434 void j() throw(); 4435 void k() throw(int); 4436 void l() throw(...); 4437functionDecl(hasDynamicExceptionSpec()) and 4438 functionProtoType(hasDynamicExceptionSpec()) 4439 match the declarations of j, k, and l, but not f, g, h, or i. 4440</pre></td></tr> 4441 4442 4443<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> 4444<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4445 4446Given: 4447 void f(); 4448 void g() noexcept; 4449 void h() throw(); 4450 void i() throw(int); 4451 void j() noexcept(false); 4452functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4453 match the declarations of g, and h, but not f, i or j. 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('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4458<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4459specific parameter count. 4460 4461Given 4462 void f(int i) {} 4463 void g(int i, int j) {} 4464 void h(int i, int j); 4465 void j(int i); 4466 void k(int x, int y, int z, ...); 4467functionDecl(parameterCountIs(2)) 4468 matches g and h 4469functionProtoType(parameterCountIs(2)) 4470 matches g and h 4471functionProtoType(parameterCountIs(3)) 4472 matches k 4473</pre></td></tr> 4474 4475 4476<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> 4477<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4478 and if constexpr. 4479 4480Given: 4481 constexpr int foo = 42; 4482 constexpr int bar(); 4483 void baz() { if constexpr(1 > 0) {} } 4484varDecl(isConstexpr()) 4485 matches the declaration of foo. 4486functionDecl(isConstexpr()) 4487 matches the declaration of bar. 4488ifStmt(isConstexpr()) 4489 matches the if statement in baz. 4490</pre></td></tr> 4491 4492 4493<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> 4494<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4495 4496 4497<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> 4498<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4499 4500Given 4501 f('false, 3.14, 42); 4502characterLiteral(equals(0)) 4503 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4504 match false 4505floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4506 match 3.14 4507integerLiteral(equals(42)) 4508 matches 42 4509 4510Note that you cannot directly match a negative numeric literal because the 4511minus sign is not part of the literal: It is a unary operator whose operand 4512is the positive numeric literal. Instead, you must use a unaryOperator() 4513matcher to match the minus sign: 4514 4515unaryOperator(hasOperatorName("-"), 4516 hasUnaryOperand(integerLiteral(equals(13)))) 4517 4518Usable 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>>, 4519 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>> 4520</pre></td></tr> 4521 4522 4523<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> 4524<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4525 4526 4527<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> 4528<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4529 4530 4531<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> 4532<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'. 4533 4534Given 4535class C { 4536 int cc; 4537 int f() { 4538 auto l = [this]() { return cc; }; 4539 return l(); 4540 } 4541}; 4542lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis()))) 4543 matches `[this]() { return cc; }`. 4544</pre></td></tr> 4545 4546 4547<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> 4548<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 4549implicit default/copy constructors). 4550</pre></td></tr> 4551 4552 4553<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>LambdaCaptureMatcher InnerMatcher</td></tr> 4554<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression. 4555 4556Given 4557 int main() { 4558 int x, y; 4559 float z; 4560 auto f = [=]() { return x + y + z; }; 4561 } 4562lambdaExpr(forEachLambdaCapture( 4563 lambdaCapture(capturesVar(varDecl(hasType(isInteger())))))) 4564will trigger two matches, binding for 'x' and 'y' respectively. 4565</pre></td></tr> 4566 4567 4568<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>LambdaCaptureMatcher InnerMatcher</td></tr> 4569<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression. 4570 4571Given 4572 void foo() { 4573 int t = 5; 4574 auto f = [=](){ return t; }; 4575 } 4576lambdaExpr(hasAnyCapture(lambdaCapture())) and 4577lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t"))))) 4578 both match `[=](){ return t; }`. 4579</pre></td></tr> 4580 4581 4582<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> 4583<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4584to '.'. 4585 4586Member calls on the implicit this pointer match as called with '->'. 4587 4588Given 4589 class Y { 4590 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4591 template <class T> void f() { this->f<T>(); f<T>(); } 4592 int a; 4593 static int b; 4594 }; 4595 template <class T> 4596 class Z { 4597 void x() { this->m; } 4598 }; 4599memberExpr(isArrow()) 4600 matches this->x, x, y.x, a, this->b 4601cxxDependentScopeMemberExpr(isArrow()) 4602 matches this->m 4603unresolvedMemberExpr(isArrow()) 4604 matches this->f<T>, f<T> 4605</pre></td></tr> 4606 4607 4608<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> 4609<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4610 4611This matcher is only provided as a performance optimization of hasName. 4612 hasAnyName(a, b, c) 4613 is equivalent to, but faster than 4614 anyOf(hasName(a), hasName(b), hasName(c)) 4615</pre></td></tr> 4616 4617 4618<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> 4619<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4620 4621Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4622void f() { 4623 int x; 4624 static int y; 4625} 4626int z; 4627 4628Example matches f() because it has external formal linkage despite being 4629unique to the translation unit as though it has internal likage 4630(matcher = functionDecl(hasExternalFormalLinkage())) 4631 4632namespace { 4633void f() {} 4634} 4635</pre></td></tr> 4636 4637 4638<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> 4639<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4640 4641Supports specifying enclosing namespaces or classes by prefixing the name 4642with '<enclosing>::'. 4643Does not match typedefs of an underlying type with the given name. 4644 4645Example matches X (Name == "X") 4646 class X; 4647 4648Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4649 namespace a { namespace b { class X; } } 4650</pre></td></tr> 4651 4652 4653<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4654<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4655a substring matched by the given RegExp. 4656 4657Supports specifying enclosing namespaces or classes by 4658prefixing the name with '<enclosing>::'. Does not match typedefs 4659of an underlying type with the given name. 4660 4661Example matches X (regexp == "::X") 4662 class X; 4663 4664Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4665 namespace foo { namespace bar { class X; } } 4666 4667If the matcher is used in clang-query, RegexFlags parameter 4668should be passed as a quoted string. e.g: "NoFlags". 4669Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4670</pre></td></tr> 4671 4672 4673<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> 4674<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4675 4676Given 4677 namespace n { 4678 namespace {} // #1 4679 } 4680namespaceDecl(isAnonymous()) will match #1 but not ::n. 4681</pre></td></tr> 4682 4683 4684<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> 4685<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4686the inline keyword. 4687 4688Given 4689 inline void f(); 4690 void g(); 4691 namespace n { 4692 inline namespace m {} 4693 } 4694functionDecl(isInline()) will match ::f(). 4695namespaceDecl(isInline()) will match n::m. 4696</pre></td></tr> 4697 4698 4699<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> 4700<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4701specified. 4702 4703Given 4704 4705 #pragma omp parallel 4706 #pragma omp parallel default(none) 4707 #pragma omp parallel default(shared) 4708 #pragma omp parallel default(firstprivate) 4709 4710``ompDefaultClause(isFirstPrivateKind())`` matches only 4711``default(firstprivate)``. 4712</pre></td></tr> 4713 4714 4715<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> 4716<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4717 4718Given 4719 4720 #pragma omp parallel 4721 #pragma omp parallel default(none) 4722 #pragma omp parallel default(shared) 4723 #pragma omp parallel default(firstprivate) 4724 4725``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4726</pre></td></tr> 4727 4728 4729<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> 4730<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4731 4732Given 4733 4734 #pragma omp parallel 4735 #pragma omp parallel default(none) 4736 #pragma omp parallel default(shared) 4737 #pragma omp parallel default(firstprivate) 4738 4739``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4740</pre></td></tr> 4741 4742 4743<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> 4744<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4745clause kind. 4746 4747Given 4748 4749 #pragma omp parallel 4750 #pragma omp parallel for 4751 #pragma omp for 4752 4753`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4754``omp parallel`` and ``omp parallel for``. 4755 4756If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4757should be passed as a quoted string. e.g., 4758``isAllowedToContainClauseKind("OMPC_default").`` 4759</pre></td></tr> 4760 4761 4762<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> 4763<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4764i.e., directives that can't have a structured block. 4765 4766Given 4767 4768 #pragma omp parallel 4769 {} 4770 #pragma omp taskyield 4771 4772``ompExecutableDirective(isStandaloneDirective()))`` matches 4773``omp taskyield``. 4774</pre></td></tr> 4775 4776 4777<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> 4778<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4779</pre></td></tr> 4780 4781 4782<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> 4783<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4784</pre></td></tr> 4785 4786 4787<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> 4788<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4789isSameOrDerivedFrom(hasName(...)). 4790</pre></td></tr> 4791 4792 4793<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> 4794<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4795a specific number of arguments (including absent default arguments). 4796 4797Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4798 void f(int x, int y); 4799 f(0, 0); 4800</pre></td></tr> 4801 4802 4803<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> 4804<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4805Selector.getAsString() 4806 4807 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4808 matches both of the expressions below: 4809 [myObj methodA:argA]; 4810 [myObj methodB:argB]; 4811</pre></td></tr> 4812 4813 4814<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> 4815<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4816 4817objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4818message expression in 4819 4820 UIWebView *webView = ...; 4821 CGRect bodyFrame = webView.frame; 4822 bodyFrame.size.height = self.bodyContentHeight; 4823 webView.frame = bodyFrame; 4824 // ^---- matches here 4825</pre></td></tr> 4826 4827 4828<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> 4829<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4830 4831Matches only when the selector of the objCMessageExpr is NULL. This may 4832represent an error condition in the tree! 4833</pre></td></tr> 4834 4835 4836<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> 4837<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4838 4839 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4840 matches the outer message expr in the code below, but NOT the message 4841 invocation for self.bodyView. 4842 [self.bodyView loadHTMLString:html baseURL:NULL]; 4843</pre></td></tr> 4844 4845 4846<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> 4847<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4848 4849 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4850 matches self.bodyView in the code below, but NOT the outer message 4851 invocation of "loadHTMLString:baseURL:". 4852 [self.bodyView loadHTMLString:html baseURL:NULL]; 4853</pre></td></tr> 4854 4855 4856<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> 4857<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4858 4859Example 4860matcher = objcMessageExpr(isClassMessage()) 4861matches 4862 [NSString stringWithFormat:@"format"]; 4863but not 4864 NSString *x = @"hello"; 4865 [x containsString:@"h"]; 4866</pre></td></tr> 4867 4868 4869<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> 4870<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4871 4872Example 4873matcher = objcMessageExpr(isInstanceMessage()) 4874matches 4875 NSString *x = @"hello"; 4876 [x containsString:@"h"]; 4877but not 4878 [NSString stringWithFormat:@"format"]; 4879</pre></td></tr> 4880 4881 4882<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> 4883<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4884a substring matched by the given RegExp. 4885 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4886 invocation for self.bodyView. 4887 [self.bodyView loadHTMLString:html baseURL:NULL]; 4888 4889If the matcher is used in clang-query, RegexFlags parameter 4890should be passed as a quoted string. e.g: "NoFlags". 4891Flags can be combined with '|' example "IgnoreCase | BasicRegex" 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('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr> 4896<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4897 4898 matcher = objCMessageExpr(numSelectorArgs(0)); 4899 matches self.bodyView in the code below 4900 4901 matcher = objCMessageExpr(numSelectorArgs(2)); 4902 matches the invocation of "loadHTMLString:baseURL:" but not that 4903 of self.bodyView 4904 [self.bodyView loadHTMLString:html baseURL:NULL]; 4905</pre></td></tr> 4906 4907 4908<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> 4909<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4910 4911Example 4912matcher = objcMethodDecl(isClassMethod()) 4913matches 4914@interface I + (void)foo; @end 4915but not 4916@interface I - (void)bar; @end 4917</pre></td></tr> 4918 4919 4920<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> 4921<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4922 4923Example matches A, va, fa 4924 class A {}; 4925 class B; // Doesn't match, as it has no body. 4926 int va; 4927 extern int vb; // Doesn't match, as it doesn't define the variable. 4928 void fa() {} 4929 void fb(); // Doesn't match, as it has no body. 4930 @interface X 4931 - (void)ma; // Doesn't match, interface is declaration. 4932 @end 4933 @implementation X 4934 - (void)ma {} 4935 @end 4936 4937Usable 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>>, 4938 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4939</pre></td></tr> 4940 4941 4942<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> 4943<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4944 4945Example 4946matcher = objcMethodDecl(isInstanceMethod()) 4947matches 4948@interface I - (void)bar; @end 4949but not 4950@interface I + (void)foo; @end 4951</pre></td></tr> 4952 4953 4954<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> 4955<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4956 4957Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4958void x(int val) {} 4959void y(int val = 0) {} 4960 4961Deprecated. Use hasInitializer() instead to be able to 4962match on the contents of the default argument. For example: 4963 4964void x(int val = 7) {} 4965void y(int val = 42) {} 4966parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4967 matches the parameter of y 4968 4969A matcher such as 4970 parmVarDecl(hasInitializer(anything())) 4971is equivalent to parmVarDecl(hasDefaultArgument()). 4972</pre></td></tr> 4973 4974 4975<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> 4976<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4977list. The parameter list could be that of either a block, function, or 4978objc-method. 4979 4980 4981Given 4982 4983void f(int a, int b, int c) { 4984} 4985 4986``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4987 4988``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4989</pre></td></tr> 4990 4991 4992<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> 4993<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4994 4995Given 4996 class Y { public: void x(); }; 4997 void z() { Y* y; y->x(); } 4998cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4999 matches y->x() 5000</pre></td></tr> 5001 5002 5003<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> 5004<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 5005 5006Matches a node if it equals the node previously bound to ID. 5007 5008Given 5009 class X { int a; int b; }; 5010cxxRecordDecl( 5011 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5012 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5013 matches the class X, as a and b have the same type. 5014 5015Note that when multiple matches are involved via forEach* matchers, 5016equalsBoundNodes acts as a filter. 5017For example: 5018compoundStmt( 5019 forEachDescendant(varDecl().bind("d")), 5020 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5021will trigger a match for each combination of variable declaration 5022and reference to that variable declaration within a compound statement. 5023</pre></td></tr> 5024 5025 5026<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> 5027<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 5028the node, not hidden within a typedef. 5029 5030Given 5031 typedef const int const_int; 5032 const_int i; 5033 int *const j; 5034 int *volatile k; 5035 int m; 5036varDecl(hasType(hasLocalQualifiers())) matches only j and k. 5037i is const-qualified but the qualifier is not local. 5038</pre></td></tr> 5039 5040 5041<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 5042<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 5043 5044Given 5045 void a(char); 5046 void b(wchar_t); 5047 void c(double); 5048functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 5049matches "a(char)", "b(wchar_t)", but not "c(double)". 5050</pre></td></tr> 5051 5052 5053<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> 5054<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 5055the Objective-C object pointer type, which is different despite being 5056syntactically similar. 5057 5058Given 5059 int *i = nullptr; 5060 5061 @interface Foo 5062 @end 5063 Foo *f; 5064 5065 int j; 5066varDecl(hasType(isAnyPointer())) 5067 matches "int *i" and "Foo *f", but not "int j". 5068</pre></td></tr> 5069 5070 5071<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> 5072<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 5073include "top-level" const. 5074 5075Given 5076 void a(int); 5077 void b(int const); 5078 void c(const int); 5079 void d(const int*); 5080 void e(int const) {}; 5081functionDecl(hasAnyParameter(hasType(isConstQualified()))) 5082 matches "void b(int const)", "void c(const int)" and 5083 "void e(int const) {}". It does not match d as there 5084 is no top-level const on the parameter type "const int *". 5085</pre></td></tr> 5086 5087 5088<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> 5089<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 5090 5091Given 5092 void a(int); 5093 void b(long); 5094 void c(double); 5095functionDecl(hasAnyParameter(hasType(isInteger()))) 5096matches "a(int)", "b(long)", but not "c(double)". 5097</pre></td></tr> 5098 5099 5100<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> 5101<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 5102 5103Given 5104 void a(int); 5105 void b(unsigned long); 5106 void c(double); 5107functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 5108matches "a(int)", but not "b(unsigned long)" and "c(double)". 5109</pre></td></tr> 5110 5111 5112<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> 5113<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 5114 5115Given 5116 void a(int); 5117 void b(unsigned long); 5118 void c(double); 5119functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 5120matches "b(unsigned long)", but not "a(int)" and "c(double)". 5121</pre></td></tr> 5122 5123 5124<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> 5125<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 5126include "top-level" volatile. 5127 5128Given 5129 void a(int); 5130 void b(int volatile); 5131 void c(volatile int); 5132 void d(volatile int*); 5133 void e(int volatile) {}; 5134functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 5135 matches "void b(int volatile)", "void c(volatile int)" and 5136 "void e(int volatile) {}". It does not match d as there 5137 is no top-level volatile on the parameter type "volatile int *". 5138</pre></td></tr> 5139 5140 5141<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> 5142<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 5143 5144Matches a node if it equals the node previously bound to ID. 5145 5146Given 5147 class X { int a; int b; }; 5148cxxRecordDecl( 5149 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5150 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5151 matches the class X, as a and b have the same type. 5152 5153Note that when multiple matches are involved via forEach* matchers, 5154equalsBoundNodes acts as a filter. 5155For example: 5156compoundStmt( 5157 forEachDescendant(varDecl().bind("d")), 5158 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5159will trigger a match for each combination of variable declaration 5160and reference to that variable declaration within a compound statement. 5161</pre></td></tr> 5162 5163 5164<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> 5165<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5166 5167Stmt has pointer identity in the AST. 5168</pre></td></tr> 5169 5170 5171<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> 5172<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5173Does not match if only part of the statement is expanded from that macro or 5174if different parts of the statement are expanded from different 5175appearances of the macro. 5176</pre></td></tr> 5177 5178 5179<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 5180<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5181partially matching a given regex. 5182 5183Example matches Y but not X 5184 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5185 #include "ASTMatcher.h" 5186 class X {}; 5187ASTMatcher.h: 5188 class Y {}; 5189 5190Usable 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>> 5191 5192If the matcher is used in clang-query, RegexFlags parameter 5193should be passed as a quoted string. e.g: "NoFlags". 5194Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5195</pre></td></tr> 5196 5197 5198<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> 5199<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5200 5201Example matches X but not Y 5202 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5203 #include <Y.h> 5204 class X {}; 5205Y.h: 5206 class Y {}; 5207 5208Usable 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>> 5209</pre></td></tr> 5210 5211 5212<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> 5213<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5214 5215Example matches Y but not X 5216 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5217 #include <SystemHeader.h> 5218 class X {}; 5219SystemHeader.h: 5220 class Y {}; 5221 5222Usable 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>> 5223</pre></td></tr> 5224 5225 5226<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> 5227<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5228 5229Given 5230 int j; 5231 template<typename T> void A(T t) { T i; j += 42;} 5232 A(0); 5233 A(0U); 5234declStmt(isInTemplateInstantiation()) 5235 matches 'int i;' and 'unsigned i'. 5236unless(stmt(isInTemplateInstantiation())) 5237 will NOT match j += 42; as it's shared between the template definition and 5238 instantiation. 5239</pre></td></tr> 5240 5241 5242<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> 5243<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5244 5245Given 5246 int a[42]; 5247 int b[2 * 21]; 5248 int c[41], d[43]; 5249 char *s = "abcd"; 5250 wchar_t *ws = L"abcd"; 5251 char *w = "a"; 5252constantArrayType(hasSize(42)) 5253 matches "int a[42]" and "int b[2 * 21]" 5254stringLiteral(hasSize(4)) 5255 matches "abcd", L"abcd" 5256</pre></td></tr> 5257 5258 5259<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> 5260<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5261 5262Example matches C, but not S, U or E. 5263 struct S {}; 5264 class C {}; 5265 union U {}; 5266 enum E {}; 5267</pre></td></tr> 5268 5269 5270<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> 5271<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5272 5273Example matches A, va, fa 5274 class A {}; 5275 class B; // Doesn't match, as it has no body. 5276 int va; 5277 extern int vb; // Doesn't match, as it doesn't define the variable. 5278 void fa() {} 5279 void fb(); // Doesn't match, as it has no body. 5280 @interface X 5281 - (void)ma; // Doesn't match, interface is declaration. 5282 @end 5283 @implementation X 5284 - (void)ma {} 5285 @end 5286 5287Usable 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>>, 5288 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5289</pre></td></tr> 5290 5291 5292<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> 5293<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5294 5295Example matches E, but not C, S or U. 5296 struct S {}; 5297 class C {}; 5298 union U {}; 5299 enum E {}; 5300</pre></td></tr> 5301 5302 5303<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> 5304<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5305 5306Example matches S, but not C, U or E. 5307 struct S {}; 5308 class C {}; 5309 union U {}; 5310 enum E {}; 5311</pre></td></tr> 5312 5313 5314<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> 5315<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5316 5317Example matches U, but not C, S or E. 5318 struct S {}; 5319 class C {}; 5320 union U {}; 5321 enum E {}; 5322</pre></td></tr> 5323 5324 5325<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> 5326<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5327 5328Note that 'Value' is a string as the template argument's value is 5329an arbitrary precision integer. 'Value' must be euqal to the canonical 5330representation of that integral value in base 10. 5331 5332Given 5333 template<int T> struct C {}; 5334 C<42> c; 5335classTemplateSpecializationDecl( 5336 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5337 matches the implicit instantiation of C in C<42>. 5338</pre></td></tr> 5339 5340 5341<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> 5342<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5343 5344Given 5345 template<int T> struct C {}; 5346 C<42> c; 5347classTemplateSpecializationDecl( 5348 hasAnyTemplateArgument(isIntegral())) 5349 matches the implicit instantiation of C in C<42> 5350 with isIntegral() matching 42. 5351</pre></td></tr> 5352 5353 5354<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> 5355<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5356 5357Given 5358 template<typename T> struct C {}; 5359 C<int> c; 5360classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5361 matches C<int>. 5362</pre></td></tr> 5363 5364 5365<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> 5366<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5367Does not match if only part of the statement is expanded from that macro or 5368if different parts of the statement are expanded from different 5369appearances of the macro. 5370</pre></td></tr> 5371 5372 5373<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> 5374<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5375partially matching a given regex. 5376 5377Example matches Y but not X 5378 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5379 #include "ASTMatcher.h" 5380 class X {}; 5381ASTMatcher.h: 5382 class Y {}; 5383 5384Usable 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>> 5385 5386If the matcher is used in clang-query, RegexFlags parameter 5387should be passed as a quoted string. e.g: "NoFlags". 5388Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5389</pre></td></tr> 5390 5391 5392<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> 5393<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5394 5395Example matches X but not Y 5396 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5397 #include <Y.h> 5398 class X {}; 5399Y.h: 5400 class Y {}; 5401 5402Usable 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>> 5403</pre></td></tr> 5404 5405 5406<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> 5407<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5408 5409Example matches Y but not X 5410 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5411 #include <SystemHeader.h> 5412 class X {}; 5413SystemHeader.h: 5414 class Y {}; 5415 5416Usable 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>> 5417</pre></td></tr> 5418 5419 5420<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> 5421<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5422 5423Given 5424 struct S { bool func(); }; 5425functionDecl(returns(booleanType())) 5426 matches "bool func();" 5427</pre></td></tr> 5428 5429 5430<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> 5431<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5432 5433Matches a node if it equals the node previously bound to ID. 5434 5435Given 5436 class X { int a; int b; }; 5437cxxRecordDecl( 5438 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5439 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5440 matches the class X, as a and b have the same type. 5441 5442Note that when multiple matches are involved via forEach* matchers, 5443equalsBoundNodes acts as a filter. 5444For example: 5445compoundStmt( 5446 forEachDescendant(varDecl().bind("d")), 5447 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5448will trigger a match for each combination of variable declaration 5449and reference to that variable declaration within a compound statement. 5450</pre></td></tr> 5451 5452 5453<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> 5454<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5455 5456Type has pointer identity in the AST. 5457</pre></td></tr> 5458 5459 5460<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> 5461<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5462 5463Given 5464 int i; 5465 float f; 5466realFloatingPointType() 5467 matches "float f" but not "int i" 5468</pre></td></tr> 5469 5470 5471<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> 5472<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5473 5474Given 5475 struct S { void func(); }; 5476functionDecl(returns(voidType())) 5477 matches "void func();" 5478</pre></td></tr> 5479 5480 5481<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> 5482<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5483 5484Given 5485 int x; 5486 int s = sizeof(x) + alignof(x) 5487unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5488 matches sizeof(x) 5489 5490If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5491should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5492</pre></td></tr> 5493 5494 5495<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> 5496<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5497specified names. 5498 5499 hasAnyOperatorName("+", "-") 5500 Is equivalent to 5501 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5502</pre></td></tr> 5503 5504 5505<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> 5506<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5507unary). 5508 5509Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5510 !(a || b) 5511</pre></td></tr> 5512 5513 5514<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> 5515<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5516to '.'. 5517 5518Member calls on the implicit this pointer match as called with '->'. 5519 5520Given 5521 class Y { 5522 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5523 template <class T> void f() { this->f<T>(); f<T>(); } 5524 int a; 5525 static int b; 5526 }; 5527 template <class T> 5528 class Z { 5529 void x() { this->m; } 5530 }; 5531memberExpr(isArrow()) 5532 matches this->x, x, y.x, a, this->b 5533cxxDependentScopeMemberExpr(isArrow()) 5534 matches this->m 5535unresolvedMemberExpr(isArrow()) 5536 matches this->f<T>, f<T> 5537</pre></td></tr> 5538 5539 5540<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr> 5541<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5542 5543Example matches x, but not y, z, or a. 5544(matcher = varDecl(hasAutomaticStorageDuration()) 5545void f() { 5546 int x; 5547 static int y; 5548 thread_local int z; 5549} 5550int a; 5551</pre></td></tr> 5552 5553 5554<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> 5555<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5556 5557Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5558void f() { 5559 int x; 5560 static int y; 5561} 5562int z; 5563</pre></td></tr> 5564 5565 5566<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> 5567<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5568non-static local variable. 5569 5570Example matches x (matcher = varDecl(hasLocalStorage()) 5571void f() { 5572 int x; 5573 static int y; 5574} 5575int z; 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('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr> 5580<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5581It includes the variable declared at namespace scope and those declared 5582with "static" and "extern" storage class specifiers. 5583 5584void f() { 5585 int x; 5586 static int y; 5587 thread_local int z; 5588} 5589int a; 5590static int b; 5591extern int c; 5592varDecl(hasStaticStorageDuration()) 5593 matches the function declaration y, a, b and c. 5594</pre></td></tr> 5595 5596 5597<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> 5598<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5599 5600Example matches z, but not x, z, or a. 5601(matcher = varDecl(hasThreadStorageDuration()) 5602void f() { 5603 int x; 5604 static int y; 5605 thread_local int z; 5606} 5607int a; 5608</pre></td></tr> 5609 5610 5611<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> 5612<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5613 and if constexpr. 5614 5615Given: 5616 constexpr int foo = 42; 5617 constexpr int bar(); 5618 void baz() { if constexpr(1 > 0) {} } 5619varDecl(isConstexpr()) 5620 matches the declaration of foo. 5621functionDecl(isConstexpr()) 5622 matches the declaration of bar. 5623ifStmt(isConstexpr()) 5624 matches the if statement in baz. 5625</pre></td></tr> 5626 5627 5628<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> 5629<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5630 5631Example matches A, va, fa 5632 class A {}; 5633 class B; // Doesn't match, as it has no body. 5634 int va; 5635 extern int vb; // Doesn't match, as it doesn't define the variable. 5636 void fa() {} 5637 void fb(); // Doesn't match, as it has no body. 5638 @interface X 5639 - (void)ma; // Doesn't match, interface is declaration. 5640 @end 5641 @implementation X 5642 - (void)ma {} 5643 @end 5644 5645Usable 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>>, 5646 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</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('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr> 5651<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5652a C++ catch block, or an Objective-C statement. 5653 5654Example matches x (matcher = varDecl(isExceptionVariable()) 5655void f(int y) { 5656 try { 5657 } catch (int x) { 5658 } 5659} 5660</pre></td></tr> 5661 5662 5663<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> 5664<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5665static member variable template instantiations. 5666 5667Given 5668 template<typename T> void A(T t) { } 5669 template<> void A(int N) { } 5670functionDecl(isExplicitTemplateSpecialization()) 5671 matches the specialization A<int>(). 5672 5673Usable 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>> 5674</pre></td></tr> 5675 5676 5677<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> 5678<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5679 5680Given: 5681 extern "C" void f() {} 5682 extern "C" { void g() {} } 5683 void h() {} 5684 extern "C" int x = 1; 5685 extern "C" int y = 2; 5686 int z = 3; 5687functionDecl(isExternC()) 5688 matches the declaration of f and g, but not the declaration of h. 5689varDecl(isExternC()) 5690 matches the declaration of x and y, but not the declaration of z. 5691</pre></td></tr> 5692 5693 5694<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> 5695<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init- 5696capture. 5697 5698Example matches x (matcher = varDecl(isInitCapture())) 5699auto f = [x=3]() { return x; }; 5700</pre></td></tr> 5701 5702 5703<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> 5704<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5705 5706Example matches y (matcher = varDecl(isStaticLocal())) 5707void f() { 5708 int x; 5709 static int y; 5710} 5711static int z; 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('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr> 5716<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5717class specifier ("static" keyword) written in the source. 5718 5719Given: 5720 static void f() {} 5721 static int i = 0; 5722 extern int j; 5723 int k; 5724functionDecl(isStaticStorageClass()) 5725 matches the function declaration f. 5726varDecl(isStaticStorageClass()) 5727 matches the variable declaration i. 5728</pre></td></tr> 5729 5730 5731<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr> 5732<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5733member variable template instantiations. 5734 5735Given 5736 template <typename T> class X {}; class A {}; X<A> x; 5737or 5738 template <typename T> class X {}; class A {}; template class X<A>; 5739or 5740 template <typename T> class X {}; class A {}; extern template class X<A>; 5741cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5742 matches the template instantiation of X<A>. 5743 5744But given 5745 template <typename T> class X {}; class A {}; 5746 template <> class X<A> {}; X<A> x; 5747cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5748 does not match, as X<A> is an explicit template specialization. 5749 5750Usable 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>> 5751</pre></td></tr> 5752 5753<!--END_NARROWING_MATCHERS --> 5754</table> 5755 5756<!-- ======================================================================= --> 5757<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5758<!-- ======================================================================= --> 5759 5760<p>Traversal matchers specify the relationship to other nodes that are 5761reachable from the current node.</p> 5762 5763<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5764forEachDescendant) which work on all nodes and allow users to write more generic 5765match expressions.</p> 5766 5767<table> 5768<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5769<!-- START_TRAVERSAL_MATCHERS --> 5770 5771<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5772<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5773 5774The code 5775 var1 != var2; 5776might be represented in the clang AST as a binaryOperator, a 5777cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5778 5779* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5780 least one is a class type (cxxOperatorCallExpr) 5781* whether the code appears in a template declaration, if at least one of the 5782 vars is a dependent-type (binaryOperator) 5783* whether the code relies on a rewritten binary operator, such as a 5784spaceship operator or an inverted equality operator 5785(cxxRewrittenBinaryOperator) 5786 5787This matcher elides details in places where the matchers for the nodes are 5788compatible. 5789 5790Given 5791 binaryOperation( 5792 hasOperatorName("!="), 5793 hasLHS(expr().bind("lhs")), 5794 hasRHS(expr().bind("rhs")) 5795 ) 5796matches each use of "!=" in: 5797 struct S{ 5798 bool operator!=(const S&) const; 5799 }; 5800 5801 void foo() 5802 { 5803 1 != 2; 5804 S() != S(); 5805 } 5806 5807 template<typename T> 5808 void templ() 5809 { 5810 1 != 2; 5811 T() != S(); 5812 } 5813 struct HasOpEq 5814 { 5815 bool operator==(const HasOpEq &) const; 5816 }; 5817 5818 void inverse() 5819 { 5820 HasOpEq s1; 5821 HasOpEq s2; 5822 if (s1 != s2) 5823 return; 5824 } 5825 5826 struct HasSpaceship 5827 { 5828 bool operator<=>(const HasOpEq &) const; 5829 }; 5830 5831 void use_spaceship() 5832 { 5833 HasSpaceship s1; 5834 HasSpaceship s2; 5835 if (s1 != s2) 5836 return; 5837 } 5838</pre></td></tr> 5839 5840 5841<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5842<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5843 5844Unlike anyOf, eachOf will generate a match result for each 5845matching submatcher. 5846 5847For example, in: 5848 class A { int a; int b; }; 5849The matcher: 5850 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5851 has(fieldDecl(hasName("b")).bind("v")))) 5852will generate two results binding "v", the first of which binds 5853the field declaration of a, the second the field declaration of 5854b. 5855 5856Usable as: Any Matcher 5857</pre></td></tr> 5858 5859 5860<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5861<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5862 5863Generates results for each match. 5864 5865For example, in: 5866 class A { class B {}; class C {}; }; 5867The matcher: 5868 cxxRecordDecl(hasName("::A"), 5869 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5870will generate results for A, B and C. 5871 5872Usable as: Any Matcher 5873</pre></td></tr> 5874 5875 5876<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5877<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5878provided matcher. 5879 5880Example matches X, A, A::X, B, B::C, B::C::X 5881 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5882 class X {}; 5883 class A { class X {}; }; // Matches A, because A::X is a class of name 5884 // X inside A. 5885 class B { class C { class X {}; }; }; 5886 5887DescendantT must be an AST base type. 5888 5889As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5890each result that matches instead of only on the first one. 5891 5892Note: Recursively combined ForEachDescendant can cause many matches: 5893 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5894 forEachDescendant(cxxRecordDecl()) 5895 ))) 5896will match 10 times (plus injected class name matches) on: 5897 class A { class B { class C { class D { class E {}; }; }; }; }; 5898 5899Usable as: Any Matcher 5900</pre></td></tr> 5901 5902 5903<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5904<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5905provided matcher. 5906 5907Example matches X, Y, Y::X, Z::Y, Z::Y::X 5908 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5909 class X {}; 5910 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5911 // inside Y. 5912 class Z { class Y { class X {}; }; }; // Does not match Z. 5913 5914ChildT must be an AST base type. 5915 5916As opposed to 'has', 'forEach' will cause a match for each result that 5917matches instead of only on the first one. 5918 5919Usable as: Any Matcher 5920</pre></td></tr> 5921 5922 5923<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5924<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5925matcher. 5926 5927Given 5928void f() { if (true) { int x = 42; } } 5929void g() { for (;;) { int x = 43; } } 5930expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5931 5932Usable as: Any Matcher 5933</pre></td></tr> 5934 5935 5936<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5937<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5938provided matcher. 5939 5940Example matches X, Y, Z 5941 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5942 class X {}; // Matches X, because X::X is a class of name X inside X. 5943 class Y { class X {}; }; 5944 class Z { class Y { class X {}; }; }; 5945 5946DescendantT must be an AST base type. 5947 5948Usable as: Any Matcher 5949</pre></td></tr> 5950 5951 5952<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5953<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5954provided matcher. 5955 5956Example matches X, Y 5957 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5958 class X {}; // Matches X, because X::X is a class of name X inside X. 5959 class Y { class X {}; }; 5960 class Z { class Y { class X {}; }; }; // Does not match Z. 5961 5962ChildT must be an AST base type. 5963 5964Usable as: Any Matcher 5965Note that has is direct matcher, so it also matches things like implicit 5966casts and paren casts. If you are matching with expr then you should 5967probably consider using ignoringParenImpCasts like: 5968has(ignoringParenImpCasts(expr())). 5969</pre></td></tr> 5970 5971 5972<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5973<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5974matcher. 5975 5976Given 5977void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5978compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5979 5980Usable as: Any Matcher 5981</pre></td></tr> 5982 5983 5984<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5985<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 5986 5987Because CallExpr and CXXConstructExpr do not share a common 5988base class with API accessing arguments etc, AST Matchers for code 5989which should match both are typically duplicated. This matcher 5990removes the need for duplication. 5991 5992Given code 5993struct ConstructorTakesInt 5994{ 5995 ConstructorTakesInt(int i) {} 5996}; 5997 5998void callTakesInt(int i) 5999{ 6000} 6001 6002void doCall() 6003{ 6004 callTakesInt(42); 6005} 6006 6007void doConstruct() 6008{ 6009 ConstructorTakesInt cti(42); 6010} 6011 6012The matcher 6013invocation(hasArgument(0, integerLiteral(equals(42)))) 6014matches the expression in both doCall and doConstruct 6015</pre></td></tr> 6016 6017 6018<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 6019<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 6020 6021However, optionally will retain any bindings generated by the submatcher. 6022Useful when additional information which may or may not present about a main 6023matching node is desired. 6024 6025For example, in: 6026 class Foo { 6027 int bar; 6028 } 6029The matcher: 6030 cxxRecordDecl( 6031 optionally(has( 6032 fieldDecl(hasName("bar")).bind("var") 6033 ))).bind("record") 6034will produce a result binding for both "record" and "var". 6035The matcher will produce a "record" binding for even if there is no data 6036member named "bar" in that class. 6037 6038Usable as: Any Matcher 6039</pre></td></tr> 6040 6041 6042<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 6043<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 6044 6045Given 6046 void foo() 6047 { 6048 int i = 3.0; 6049 } 6050The matcher 6051 traverse(TK_IgnoreUnlessSpelledInSource, 6052 varDecl(hasInitializer(floatLiteral().bind("init"))) 6053 ) 6054matches the variable declaration with "init" bound to the "3.0". 6055</pre></td></tr> 6056 6057 6058<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> 6059<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 6060switch statement or conditional operator. 6061 6062Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6063 if (true) {} 6064</pre></td></tr> 6065 6066 6067<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> 6068<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 6069(binary or ternary). 6070 6071Example matches b 6072 condition ? a : b 6073 condition ?: b 6074</pre></td></tr> 6075 6076 6077<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> 6078<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 6079 6080Example 1 (conditional ternary operator): matches a 6081 condition ? a : b 6082 6083Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 6084 condition ?: b 6085</pre></td></tr> 6086 6087 6088<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> 6089<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 6090matches the given matcher. 6091 6092The associated declaration is: 6093- for type nodes, the declaration of the underlying type 6094- for CallExpr, the declaration of the callee 6095- for MemberExpr, the declaration of the referenced member 6096- for CXXConstructExpr, the declaration of the constructor 6097- for CXXNewExpr, the declaration of the operator new 6098- for ObjCIvarExpr, the declaration of the ivar 6099 6100For type nodes, hasDeclaration will generally match the declaration of the 6101sugared type. Given 6102 class X {}; 6103 typedef X Y; 6104 Y y; 6105in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6106typedefDecl. A common use case is to match the underlying, desugared type. 6107This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6108 varDecl(hasType(hasUnqualifiedDesugaredType( 6109 recordType(hasDeclaration(decl()))))) 6110In this matcher, the decl will match the CXXRecordDecl of class X. 6111 6112Usable 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>>, 6113 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>>, 6114 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>>, 6115 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>>, 6116 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>>, 6117 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>>, 6118 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6119</pre></td></tr> 6120 6121 6122<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> 6123<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 6124 6125Given 6126 int i[5]; 6127 void f() { i[1] = 42; } 6128arraySubscriptExpression(hasBase(implicitCastExpr( 6129 hasSourceExpression(declRefExpr())))) 6130 matches i[1] with the declRefExpr() matching i 6131</pre></td></tr> 6132 6133 6134<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> 6135<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 6136 6137Given 6138 int i[5]; 6139 void f() { i[1] = 42; } 6140arraySubscriptExpression(hasIndex(integerLiteral())) 6141 matches i[1] with the integerLiteral() matching 1 6142</pre></td></tr> 6143 6144 6145<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> 6146<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 6147 6148Example matches a (matcher = binaryOperator(hasLHS())) 6149 a || b 6150</pre></td></tr> 6151 6152 6153<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> 6154<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 6155 6156Example matches b (matcher = binaryOperator(hasRHS())) 6157 a || b 6158</pre></td></tr> 6159 6160 6161<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> 6162<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 6163type. 6164 6165Given 6166 struct A {}; 6167 A a[7]; 6168 int b[7]; 6169arrayType(hasElementType(builtinType())) 6170 matches "int b[7]" 6171 6172Usable 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>> 6173</pre></td></tr> 6174 6175 6176<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> 6177<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6178 6179Given 6180 _Atomic(int) i; 6181 _Atomic(float) f; 6182atomicType(hasValueType(isInteger())) 6183 matches "_Atomic(int) i" 6184 6185Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6186</pre></td></tr> 6187 6188 6189<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> 6190<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6191 6192Note: There is no TypeLoc for the deduced type and thus no 6193getDeducedLoc() matcher. 6194 6195Given 6196 auto a = 1; 6197 auto b = 2.0; 6198autoType(hasDeducedType(isInteger())) 6199 matches "auto a" 6200 6201Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6202</pre></td></tr> 6203 6204 6205<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> 6206<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 6207 6208Given 6209 namespace X { void b(); } 6210 using X::b; 6211usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 6212 matches using X::b </pre></td></tr> 6213 6214 6215<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> 6216<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6217binary operator matches. 6218</pre></td></tr> 6219 6220 6221<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> 6222<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6223 6224Example matches a (matcher = binaryOperator(hasLHS())) 6225 a || b 6226</pre></td></tr> 6227 6228 6229<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> 6230<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6231 6232Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6233 integerLiteral(equals(2))) 6234 1 + 2 // Match 6235 2 + 1 // Match 6236 1 + 1 // No match 6237 2 + 2 // No match 6238</pre></td></tr> 6239 6240 6241<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> 6242<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6243 6244Example matches b (matcher = binaryOperator(hasRHS())) 6245 a || b 6246</pre></td></tr> 6247 6248 6249<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> 6250<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6251 6252For example, in: 6253void foo() 6254{ 6255 int arr[3]; 6256 auto &[f, s, t] = arr; 6257 6258 f = 42; 6259} 6260The matcher: 6261 bindingDecl(hasName("f"), 6262 forDecomposition(decompositionDecl()) 6263matches 'f' in 'auto &[f, s, t]'. 6264</pre></td></tr> 6265 6266 6267<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> 6268<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6269block. 6270 6271Does not match the 'this' parameter of a method. 6272 6273Given 6274 class X { void f(int x, int y, int z) {} }; 6275cxxMethodDecl(hasAnyParameter(hasName("y"))) 6276 matches f(int x, int y, int z) {} 6277with hasAnyParameter(...) 6278 matching int y 6279 6280For ObjectiveC, given 6281 @interface I - (void) f:(int) y; @end 6282 6283the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6284matches the declaration of method f with hasParameter 6285matching y. 6286 6287For blocks, given 6288 b = ^(int y) { printf("%d", y) }; 6289 6290the matcher blockDecl(hasAnyParameter(hasName("y"))) 6291matches the declaration of the block b with hasParameter 6292matching y. 6293</pre></td></tr> 6294 6295 6296<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> 6297<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6298declaration or a block. 6299 6300Given 6301 class X { void f(int x) {} }; 6302cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6303 matches f(int x) {} 6304with hasParameter(...) 6305 matching int x 6306 6307For ObjectiveC, given 6308 @interface I - (void) f:(int) y; @end 6309 6310the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6311matches the declaration of method f with hasParameter 6312matching y. 6313</pre></td></tr> 6314 6315 6316<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> 6317<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. 6318 6319Examples: 6320 int x; 6321declaratorDecl(hasTypeLoc(loc(asString("int")))) 6322 matches int x 6323 6324auto x = int(3); 6325cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6326 matches int(3) 6327 6328struct Foo { Foo(int, int); }; 6329auto x = Foo(1, 2); 6330cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6331 matches Foo(1, 2) 6332 6333Usable 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>>, 6334 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>>, 6335 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>>, 6336 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6337 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>>, 6338 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>>, 6339 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>>, 6340 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6341</pre></td></tr> 6342 6343 6344<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> 6345<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6346pointee matches a given matcher. 6347 6348Given 6349 int *a; 6350 int const *b; 6351 float const *f; 6352pointerType(pointee(isConstQualified(), isInteger())) 6353 matches "int const *b" 6354 6355Usable 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>>, 6356 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>> 6357</pre></td></tr> 6358 6359 6360<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> 6361<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. 6362 6363Examples: 6364 int x; 6365declaratorDecl(hasTypeLoc(loc(asString("int")))) 6366 matches int x 6367 6368auto x = int(3); 6369cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6370 matches int(3) 6371 6372struct Foo { Foo(int, int); }; 6373auto x = Foo(1, 2); 6374cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6375 matches Foo(1, 2) 6376 6377Usable 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>>, 6378 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>>, 6379 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>>, 6380 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6381 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>>, 6382 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>>, 6383 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>>, 6384 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6385</pre></td></tr> 6386 6387 6388<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('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> 6389<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6390declaration's type. 6391 6392In case of a value declaration (for example a variable declaration), 6393this resolves one layer of indirection. For example, in the value 6394declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6395X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6396declaration of x. 6397 6398Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6399 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6400 and friend class X (matcher = friendDecl(hasType("X")) 6401 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6402 cxxRecordDecl(hasName("X")))) 6403 class X {}; 6404 void y(X &x) { x; X z; } 6405 class Y { friend class X; }; 6406 class Z : public virtual X {}; 6407 6408Example matches class Derived 6409(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6410class Base {}; 6411class Derived : Base {}; 6412 6413Usable 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>>, 6414Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6415</pre></td></tr> 6416 6417 6418<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> 6419<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6420matcher. 6421 6422Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6423 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6424 and U (matcher = typedefDecl(hasType(asString("int"))) 6425 and friend class X (matcher = friendDecl(hasType("X")) 6426 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6427 asString("class X"))) 6428 class X {}; 6429 void y(X &x) { x; X z; } 6430 typedef int U; 6431 class Y { friend class X; }; 6432 class Z : public virtual X {}; 6433</pre></td></tr> 6434 6435 6436<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> 6437<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6438 6439Given 6440 void f(int i); 6441 int y; 6442 f(y); 6443callExpr( 6444 forEachArgumentWithParam( 6445 declRefExpr(to(varDecl(hasName("y")))), 6446 parmVarDecl(hasType(isInteger())) 6447)) 6448 matches f(y); 6449with declRefExpr(...) 6450 matching int y 6451and parmVarDecl(...) 6452 matching int i 6453</pre></td></tr> 6454 6455 6456<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> 6457<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6458CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6459it works on calls through function pointers as well. 6460 6461The difference is, that function pointers do not provide access to a 6462ParmVarDecl, but only the QualType for each argument. 6463 6464Given 6465 void f(int i); 6466 int y; 6467 f(y); 6468 void (*f_ptr)(int) = f; 6469 f_ptr(y); 6470callExpr( 6471 forEachArgumentWithParamType( 6472 declRefExpr(to(varDecl(hasName("y")))), 6473 qualType(isInteger()).bind("type) 6474)) 6475 matches f(y) and f_ptr(y) 6476with declRefExpr(...) 6477 matching int y 6478and qualType(...) 6479 matching int 6480</pre></td></tr> 6481 6482 6483<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> 6484<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6485expression, or an ObjC-message-send expression. 6486 6487Given 6488 void x(int, int, int) { int y; x(1, y, 42); } 6489callExpr(hasAnyArgument(declRefExpr())) 6490 matches x(1, y, 42) 6491with hasAnyArgument(...) 6492 matching y 6493 6494For ObjectiveC, given 6495 @interface I - (void) f:(int) y; @end 6496 void foo(I *i) { [i f:12]; } 6497objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6498 matches [i f:12] 6499</pre></td></tr> 6500 6501 6502<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> 6503<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6504call expression. 6505 6506Example matches y in x(y) 6507 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6508 void x(int) { int y; x(y); } 6509</pre></td></tr> 6510 6511 6512<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> 6513<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6514matches the given matcher. 6515 6516The associated declaration is: 6517- for type nodes, the declaration of the underlying type 6518- for CallExpr, the declaration of the callee 6519- for MemberExpr, the declaration of the referenced member 6520- for CXXConstructExpr, the declaration of the constructor 6521- for CXXNewExpr, the declaration of the operator new 6522- for ObjCIvarExpr, the declaration of the ivar 6523 6524For type nodes, hasDeclaration will generally match the declaration of the 6525sugared type. Given 6526 class X {}; 6527 typedef X Y; 6528 Y y; 6529in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6530typedefDecl. A common use case is to match the underlying, desugared type. 6531This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6532 varDecl(hasType(hasUnqualifiedDesugaredType( 6533 recordType(hasDeclaration(decl()))))) 6534In this matcher, the decl will match the CXXRecordDecl of class X. 6535 6536Usable 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>>, 6537 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>>, 6538 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>>, 6539 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>>, 6540 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>>, 6541 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>>, 6542 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6543</pre></td></tr> 6544 6545 6546<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> 6547<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6548 6549Given 6550 class A { A() : i(42), j(42) {} int i; int j; }; 6551cxxConstructorDecl(forEachConstructorInitializer( 6552 forField(decl().bind("x")) 6553)) 6554 will trigger two matches, binding for 'i' and 'j' respectively. 6555</pre></td></tr> 6556 6557 6558<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> 6559<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6560 6561Given 6562 struct Foo { 6563 Foo() : foo_(1) { } 6564 int foo_; 6565 }; 6566cxxRecordDecl(has(cxxConstructorDecl( 6567 hasAnyConstructorInitializer(anything()) 6568))) 6569 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6570</pre></td></tr> 6571 6572 6573<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> 6574<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6575 6576Given 6577 struct Foo { 6578 Foo() : foo_(1) { } 6579 int foo_; 6580 }; 6581cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6582 forField(hasName("foo_")))))) 6583 matches Foo 6584with forField matching foo_ 6585</pre></td></tr> 6586 6587 6588<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> 6589<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. 6590 6591Examples: 6592 int x; 6593declaratorDecl(hasTypeLoc(loc(asString("int")))) 6594 matches int x 6595 6596auto x = int(3); 6597cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6598 matches int(3) 6599 6600struct Foo { Foo(int, int); }; 6601auto x = Foo(1, 2); 6602cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6603 matches Foo(1, 2) 6604 6605Usable 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>>, 6606 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>>, 6607 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>>, 6608 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6609 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>>, 6610 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>>, 6611 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>>, 6612 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6613</pre></td></tr> 6614 6615 6616<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('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> 6617<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6618 6619Given 6620 struct Foo { 6621 Foo() : foo_(1) { } 6622 int foo_; 6623 }; 6624cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6625 withInitializer(integerLiteral(equals(1))))))) 6626 matches Foo 6627with withInitializer matching (1) 6628</pre></td></tr> 6629 6630 6631<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> 6632<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6633given matcher. Implicit object expressions are included; that is, it matches 6634use of implicit `this`. 6635 6636Given 6637 struct X { 6638 int m; 6639 int f(X x) { x.m; return m; } 6640 }; 6641memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6642 matches `x.m`, but not `m`; however, 6643memberExpr(hasObjectExpression(hasType(pointsTo( 6644 cxxRecordDecl(hasName("X")))))) 6645 matches `m` (aka. `this->m`), but not `x.m`. 6646</pre></td></tr> 6647 6648 6649<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> 6650<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6651 6652 6653<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> 6654<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6655 6656Given: 6657 void foo() { 6658 if (int i = foobar(); i > 0) {} 6659 switch (int i = foobar(); i) {} 6660 for (auto& a = get_range(); auto& x : a) {} 6661 } 6662 void bar() { 6663 if (foobar() > 0) {} 6664 switch (foobar()) {} 6665 for (auto& x : get_range()) {} 6666 } 6667ifStmt(hasInitStatement(anything())) 6668 matches the if statement in foo but not in bar. 6669switchStmt(hasInitStatement(anything())) 6670 matches the switch statement in foo but not in bar. 6671cxxForRangeStmt(hasInitStatement(anything())) 6672 matches the range for statement in foo but not in bar. 6673</pre></td></tr> 6674 6675 6676<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> 6677<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6678 6679Example: 6680 forStmt(hasLoopVariable(anything())) 6681matches 'int x' in 6682 for (int x : a) { } 6683</pre></td></tr> 6684 6685 6686<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> 6687<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6688 6689Example: 6690 forStmt(hasRangeInit(anything())) 6691matches 'a' in 6692 for (int x : a) { } 6693</pre></td></tr> 6694 6695 6696<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> 6697<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. 6698 6699Examples: 6700 int x; 6701declaratorDecl(hasTypeLoc(loc(asString("int")))) 6702 matches int x 6703 6704auto x = int(3); 6705cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6706 matches int(3) 6707 6708struct Foo { Foo(int, int); }; 6709auto x = Foo(1, 2); 6710cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6711 matches Foo(1, 2) 6712 6713Usable 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>>, 6714 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>>, 6715 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>>, 6716 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6717 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>>, 6718 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>>, 6719 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>>, 6720 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6721</pre></td></tr> 6722 6723 6724<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> 6725<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6726`on`, matches the argument directly without stripping away anything. 6727 6728Given 6729 class Y { public: void m(); }; 6730 Y g(); 6731 class X : public Y { void g(); }; 6732 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6733cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6734 cxxRecordDecl(hasName("Y"))))) 6735 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6736cxxMemberCallExpr(on(callExpr())) 6737 does not match `(g()).m()`, because the parens are not ignored. 6738 6739FIXME: Overload to allow directly matching types? 6740</pre></td></tr> 6741 6742 6743<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> 6744<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6745stripping off any parentheses or implicit casts. 6746 6747Given 6748 class Y { public: void m(); }; 6749 Y g(); 6750 class X : public Y {}; 6751 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6752cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6753 matches `y.m()` and `(g()).m()`. 6754cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6755 matches `x.m()`. 6756cxxMemberCallExpr(on(callExpr())) 6757 matches `(g()).m()`. 6758 6759FIXME: Overload to allow directly matching types? 6760</pre></td></tr> 6761 6762 6763<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> 6764<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6765</pre></td></tr> 6766 6767 6768<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> 6769<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6770matches the InnerMatcher, or is a pointer to a type that matches the 6771InnerMatcher. 6772 6773Given 6774 class Y { public: void m(); }; 6775 class X : public Y { void g(); }; 6776 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6777cxxMemberCallExpr(thisPointerType(hasDeclaration( 6778 cxxRecordDecl(hasName("Y"))))) 6779 matches `y.m()`, `p->m()` and `x.m()`. 6780cxxMemberCallExpr(thisPointerType(hasDeclaration( 6781 cxxRecordDecl(hasName("X"))))) 6782 matches `x.g()`. 6783</pre></td></tr> 6784 6785 6786<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> 6787<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6788produce multiple matches. 6789 6790Given 6791 class A { virtual void f(); }; 6792 class B : public A { void f(); }; 6793 class C : public B { void f(); }; 6794cxxMethodDecl(ofClass(hasName("C")), 6795 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6796 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6797 that B::f is not overridden by C::f). 6798 6799The check can produce multiple matches in case of multiple inheritance, e.g. 6800 class A1 { virtual void f(); }; 6801 class A2 { virtual void f(); }; 6802 class C : public A1, public A2 { void f(); }; 6803cxxMethodDecl(ofClass(hasName("C")), 6804 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6805 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6806 once with "b" binding "A2::f" and "d" binding "C::f". 6807</pre></td></tr> 6808 6809 6810<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> 6811<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6812belongs to. 6813 6814FIXME: Generalize this for other kinds of declarations. 6815FIXME: What other kind of declarations would we need to generalize 6816this to? 6817 6818Example matches A() in the last line 6819 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6820 ofClass(hasName("A")))))) 6821 class A { 6822 public: 6823 A(); 6824 }; 6825 A a = A(); 6826</pre></td></tr> 6827 6828 6829<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> 6830<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6831 6832Given: 6833 MyClass *p1 = new (Storage) MyClass(); 6834cxxNewExpr(hasAnyPlacementArg(anything())) 6835 matches the expression 'new (Storage, 16) MyClass()'. 6836</pre></td></tr> 6837 6838 6839<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> 6840<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6841 6842Given: 6843 MyClass *p1 = new MyClass[10]; 6844cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6845 matches the expression 'new MyClass[10]'. 6846</pre></td></tr> 6847 6848 6849<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> 6850<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6851matches the given matcher. 6852 6853The associated declaration is: 6854- for type nodes, the declaration of the underlying type 6855- for CallExpr, the declaration of the callee 6856- for MemberExpr, the declaration of the referenced member 6857- for CXXConstructExpr, the declaration of the constructor 6858- for CXXNewExpr, the declaration of the operator new 6859- for ObjCIvarExpr, the declaration of the ivar 6860 6861For type nodes, hasDeclaration will generally match the declaration of the 6862sugared type. Given 6863 class X {}; 6864 typedef X Y; 6865 Y y; 6866in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6867typedefDecl. A common use case is to match the underlying, desugared type. 6868This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6869 varDecl(hasType(hasUnqualifiedDesugaredType( 6870 recordType(hasDeclaration(decl()))))) 6871In this matcher, the decl will match the CXXRecordDecl of class X. 6872 6873Usable 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>>, 6874 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>>, 6875 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>>, 6876 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>>, 6877 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>>, 6878 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>>, 6879 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6880</pre></td></tr> 6881 6882 6883<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> 6884<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6885 6886Given: 6887 MyClass *p1 = new (Storage, 16) MyClass(); 6888cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6889 matches the expression 'new (Storage, 16) MyClass()'. 6890</pre></td></tr> 6891 6892 6893<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> 6894<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. 6895 6896Examples: 6897 int x; 6898declaratorDecl(hasTypeLoc(loc(asString("int")))) 6899 matches int x 6900 6901auto x = int(3); 6902cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6903 matches int(3) 6904 6905struct Foo { Foo(int, int); }; 6906auto x = Foo(1, 2); 6907cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6908 matches Foo(1, 2) 6909 6910Usable 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>>, 6911 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>>, 6912 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>>, 6913 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6914 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>>, 6915 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>>, 6916 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>>, 6917 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6918</pre></td></tr> 6919 6920 6921<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> 6922<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6923binary operator matches. 6924</pre></td></tr> 6925 6926 6927<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> 6928<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6929 6930Example matches a (matcher = binaryOperator(hasLHS())) 6931 a || b 6932</pre></td></tr> 6933 6934 6935<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> 6936<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6937 6938Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6939 integerLiteral(equals(2))) 6940 1 + 2 // Match 6941 2 + 1 // Match 6942 1 + 1 // No match 6943 2 + 2 // No match 6944</pre></td></tr> 6945 6946 6947<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> 6948<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6949 6950Example matches b (matcher = binaryOperator(hasRHS())) 6951 a || b 6952</pre></td></tr> 6953 6954 6955<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('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> 6956<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6957 6958Example matches true (matcher = hasUnaryOperand( 6959 cxxBoolLiteral(equals(true)))) 6960 !true 6961</pre></td></tr> 6962 6963 6964<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> 6965<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6966 6967Example: 6968matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6969 class Foo; 6970 class Bar : Foo {}; 6971 class Baz : Bar {}; 6972 class SpecialBase; 6973 class Proxy : SpecialBase {}; // matches Proxy 6974 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6975 6976FIXME: Refactor this and isDerivedFrom to reuse implementation. 6977</pre></td></tr> 6978 6979 6980<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> 6981<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6982 6983Example: 6984matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6985 class Foo; 6986 class Bar : Foo {}; 6987 class Baz : Bar {}; 6988 class SpecialBase; 6989 class Proxy : SpecialBase {}; // matches Proxy 6990 class IndirectlyDerived : Proxy {}; // doesn't match 6991</pre></td></tr> 6992 6993 6994<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> 6995<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6996 6997Given: 6998 class A { void func(); }; 6999 class B { void member(); }; 7000 7001cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 7002A but not B. 7003</pre></td></tr> 7004 7005 7006<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> 7007<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 7008matching Base, or Objective-C classes that directly or indirectly 7009subclass a class matching Base. 7010 7011Note that a class is not considered to be derived from itself. 7012 7013Example matches Y, Z, C (Base == hasName("X")) 7014 class X; 7015 class Y : public X {}; // directly derived 7016 class Z : public Y {}; // indirectly derived 7017 typedef X A; 7018 typedef A B; 7019 class C : public B {}; // derived from a typedef of X 7020 7021In the following example, Bar matches isDerivedFrom(hasName("X")): 7022 class Foo; 7023 typedef Foo X; 7024 class Bar : public Foo {}; // derived from a type that X is a typedef of 7025 7026In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7027 @interface NSObject @end 7028 @interface Bar : NSObject @end 7029 7030Usable 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>> 7031</pre></td></tr> 7032 7033 7034<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('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> 7035<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7036matching Base. 7037 7038Note that a class is not considered to be derived from itself. 7039 7040Example matches Y, C (Base == hasName("X")) 7041 class X; 7042 class Y : public X {}; // directly derived 7043 class Z : public Y {}; // indirectly derived 7044 typedef X A; 7045 typedef A B; 7046 class C : public B {}; // derived from a typedef of X 7047 7048In the following example, Bar matches isDerivedFrom(hasName("X")): 7049 class Foo; 7050 typedef Foo X; 7051 class Bar : public Foo {}; // derived from a type that X is a typedef of 7052</pre></td></tr> 7053 7054 7055<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> 7056<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7057match Base. 7058</pre></td></tr> 7059 7060 7061<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> 7062<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 7063binary operator matches. 7064</pre></td></tr> 7065 7066 7067<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> 7068<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 7069 7070Example matches a (matcher = binaryOperator(hasLHS())) 7071 a || b 7072</pre></td></tr> 7073 7074 7075<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> 7076<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 7077 7078Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 7079 integerLiteral(equals(2))) 7080 1 + 2 // Match 7081 2 + 1 // Match 7082 1 + 1 // No match 7083 2 + 2 // No match 7084</pre></td></tr> 7085 7086 7087<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> 7088<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 7089 7090Example matches b (matcher = binaryOperator(hasRHS())) 7091 a || b 7092</pre></td></tr> 7093 7094 7095<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> 7096<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. 7097 7098Examples: 7099 int x; 7100declaratorDecl(hasTypeLoc(loc(asString("int")))) 7101 matches int x 7102 7103auto x = int(3); 7104cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7105 matches int(3) 7106 7107struct Foo { Foo(int, int); }; 7108auto x = Foo(1, 2); 7109cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7110 matches Foo(1, 2) 7111 7112Usable 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>>, 7113 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>>, 7114 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>>, 7115 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7116 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>>, 7117 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>>, 7118 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>>, 7119 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7120</pre></td></tr> 7121 7122 7123<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> 7124<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 7125expression, or an ObjC-message-send expression. 7126 7127Given 7128 void x(int, int, int) { int y; x(1, y, 42); } 7129callExpr(hasAnyArgument(declRefExpr())) 7130 matches x(1, y, 42) 7131with hasAnyArgument(...) 7132 matching y 7133 7134For ObjectiveC, given 7135 @interface I - (void) f:(int) y; @end 7136 void foo(I *i) { [i f:12]; } 7137objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7138 matches [i f:12] 7139</pre></td></tr> 7140 7141 7142<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> 7143<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7144call expression. 7145 7146Example matches y in x(y) 7147 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7148 void x(int) { int y; x(y); } 7149</pre></td></tr> 7150 7151 7152<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> 7153<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. 7154 7155Examples: 7156 int x; 7157declaratorDecl(hasTypeLoc(loc(asString("int")))) 7158 matches int x 7159 7160auto x = int(3); 7161cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7162 matches int(3) 7163 7164struct Foo { Foo(int, int); }; 7165auto x = Foo(1, 2); 7166cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7167 matches Foo(1, 2) 7168 7169Usable 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>>, 7170 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>>, 7171 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>>, 7172 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7173 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>>, 7174 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>>, 7175 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>>, 7176 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7177</pre></td></tr> 7178 7179 7180<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> 7181<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 7182given matcher. 7183 7184Example matches y.x() (matcher = callExpr(callee( 7185 cxxMethodDecl(hasName("x"))))) 7186 class Y { public: void x(); }; 7187 void z() { Y y; y.x(); } 7188</pre></td></tr> 7189 7190 7191<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> 7192<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 7193 7194Given 7195 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 7196 void f() { f(); } 7197callExpr(callee(expr())) 7198 matches this->x(), x(), y.x(), f() 7199with callee(...) 7200 matching this->x, x, y.x, f respectively 7201 7202Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 7203because this introduces ambiguous overloads with calls to Callee taking a 7204internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 7205implemented in terms of implicit casts. 7206</pre></td></tr> 7207 7208 7209<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> 7210<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 7211 7212Given 7213 void f(int i); 7214 int y; 7215 f(y); 7216callExpr( 7217 forEachArgumentWithParam( 7218 declRefExpr(to(varDecl(hasName("y")))), 7219 parmVarDecl(hasType(isInteger())) 7220)) 7221 matches f(y); 7222with declRefExpr(...) 7223 matching int y 7224and parmVarDecl(...) 7225 matching int i 7226</pre></td></tr> 7227 7228 7229<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> 7230<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 7231CXXConstructExpr. It is very similar to forEachArgumentWithParam but 7232it works on calls through function pointers as well. 7233 7234The difference is, that function pointers do not provide access to a 7235ParmVarDecl, but only the QualType for each argument. 7236 7237Given 7238 void f(int i); 7239 int y; 7240 f(y); 7241 void (*f_ptr)(int) = f; 7242 f_ptr(y); 7243callExpr( 7244 forEachArgumentWithParamType( 7245 declRefExpr(to(varDecl(hasName("y")))), 7246 qualType(isInteger()).bind("type) 7247)) 7248 matches f(y) and f_ptr(y) 7249with declRefExpr(...) 7250 matching int y 7251and qualType(...) 7252 matching int 7253</pre></td></tr> 7254 7255 7256<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> 7257<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 7258expression, or an ObjC-message-send expression. 7259 7260Given 7261 void x(int, int, int) { int y; x(1, y, 42); } 7262callExpr(hasAnyArgument(declRefExpr())) 7263 matches x(1, y, 42) 7264with hasAnyArgument(...) 7265 matching y 7266 7267For ObjectiveC, given 7268 @interface I - (void) f:(int) y; @end 7269 void foo(I *i) { [i f:12]; } 7270objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7271 matches [i f:12] 7272</pre></td></tr> 7273 7274 7275<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> 7276<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 7277call expression. 7278 7279Example matches y in x(y) 7280 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7281 void x(int) { int y; x(y); } 7282</pre></td></tr> 7283 7284 7285<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> 7286<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 7287matches the given matcher. 7288 7289The associated declaration is: 7290- for type nodes, the declaration of the underlying type 7291- for CallExpr, the declaration of the callee 7292- for MemberExpr, the declaration of the referenced member 7293- for CXXConstructExpr, the declaration of the constructor 7294- for CXXNewExpr, the declaration of the operator new 7295- for ObjCIvarExpr, the declaration of the ivar 7296 7297For type nodes, hasDeclaration will generally match the declaration of the 7298sugared type. Given 7299 class X {}; 7300 typedef X Y; 7301 Y y; 7302in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7303typedefDecl. A common use case is to match the underlying, desugared type. 7304This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7305 varDecl(hasType(hasUnqualifiedDesugaredType( 7306 recordType(hasDeclaration(decl()))))) 7307In this matcher, the decl will match the CXXRecordDecl of class X. 7308 7309Usable 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>>, 7310 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>>, 7311 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>>, 7312 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>>, 7313 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>>, 7314 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>>, 7315 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7316</pre></td></tr> 7317 7318 7319<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> 7320<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 7321extension, matches the constant given in the statement. 7322 7323Given 7324 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 7325caseStmt(hasCaseConstant(integerLiteral())) 7326 matches "case 1:" 7327</pre></td></tr> 7328 7329 7330<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> 7331<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 7332or opaque value's source expression matches the given matcher. 7333 7334Example 1: matches "a string" 7335(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7336class URL { URL(string); }; 7337URL url = "a string"; 7338 7339Example 2: matches 'b' (matcher = 7340opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7341int a = b ?: 1; 7342</pre></td></tr> 7343 7344 7345<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> 7346<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7347functionDecl that have at least one TemplateArgument matching the given 7348InnerMatcher. 7349 7350Given 7351 template<typename T> class A {}; 7352 template<> class A<double> {}; 7353 A<int> a; 7354 7355 template<typename T> f() {}; 7356 void func() { f<int>(); }; 7357 7358classTemplateSpecializationDecl(hasAnyTemplateArgument( 7359 refersToType(asString("int")))) 7360 matches the specialization A<int> 7361 7362functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7363 matches the specialization f<int> 7364</pre></td></tr> 7365 7366 7367<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> 7368<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 7369 7370Given 7371 template<typename T> class A {}; #1 7372 template<> class A<int> {}; #2 7373classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7374 matches '#2' with classTemplateDecl() matching the class template 7375 declaration of 'A' at #1. 7376</pre></td></tr> 7377 7378 7379<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> 7380<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7381functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7382 7383Given 7384 template<typename T, typename U> class A {}; 7385 A<bool, int> b; 7386 A<int, bool> c; 7387 7388 template<typename T> void f() {} 7389 void func() { f<int>(); }; 7390classTemplateSpecializationDecl(hasTemplateArgument( 7391 1, refersToType(asString("int")))) 7392 matches the specialization A<bool, int> 7393 7394functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7395 matches the specialization f<int> 7396</pre></td></tr> 7397 7398 7399<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> 7400<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. 7401 7402Examples: 7403 int x; 7404declaratorDecl(hasTypeLoc(loc(asString("int")))) 7405 matches int x 7406 7407auto x = int(3); 7408cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7409 matches int(3) 7410 7411struct Foo { Foo(int, int); }; 7412auto x = Foo(1, 2); 7413cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7414 matches Foo(1, 2) 7415 7416Usable 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>>, 7417 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>>, 7418 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>>, 7419 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7420 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>>, 7421 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>>, 7422 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>>, 7423 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7424</pre></td></tr> 7425 7426 7427<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> 7428<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7429type. 7430 7431Given 7432 struct A {}; 7433 A a[7]; 7434 int b[7]; 7435arrayType(hasElementType(builtinType())) 7436 matches "int b[7]" 7437 7438Usable 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>> 7439</pre></td></tr> 7440 7441 7442<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> 7443<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. 7444 7445Examples: 7446 int x; 7447declaratorDecl(hasTypeLoc(loc(asString("int")))) 7448 matches int x 7449 7450auto x = int(3); 7451cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7452 matches int(3) 7453 7454struct Foo { Foo(int, int); }; 7455auto x = Foo(1, 2); 7456cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7457 matches Foo(1, 2) 7458 7459Usable 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>>, 7460 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>>, 7461 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>>, 7462 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7463 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>>, 7464 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>>, 7465 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>>, 7466 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7467</pre></td></tr> 7468 7469 7470<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> 7471<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7472a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7473 7474Given 7475 { {}; 1+2; } 7476hasAnySubstatement(compoundStmt()) 7477 matches '{ {}; 1+2; }' 7478with compoundStmt() 7479 matching '{}' 7480</pre></td></tr> 7481 7482 7483<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> 7484<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7485</pre></td></tr> 7486 7487 7488<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> 7489<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7490matches the given matcher. 7491 7492The associated declaration is: 7493- for type nodes, the declaration of the underlying type 7494- for CallExpr, the declaration of the callee 7495- for MemberExpr, the declaration of the referenced member 7496- for CXXConstructExpr, the declaration of the constructor 7497- for CXXNewExpr, the declaration of the operator new 7498- for ObjCIvarExpr, the declaration of the ivar 7499 7500For type nodes, hasDeclaration will generally match the declaration of the 7501sugared type. Given 7502 class X {}; 7503 typedef X Y; 7504 Y y; 7505in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7506typedefDecl. A common use case is to match the underlying, desugared type. 7507This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7508 varDecl(hasType(hasUnqualifiedDesugaredType( 7509 recordType(hasDeclaration(decl()))))) 7510In this matcher, the decl will match the CXXRecordDecl of class X. 7511 7512Usable 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>>, 7513 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>>, 7514 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>>, 7515 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>>, 7516 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>>, 7517 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>>, 7518 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7519</pre></td></tr> 7520 7521 7522<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> 7523<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th 7524`TemplateArgumentLoc` matches the given `InnerMatcher`. 7525 7526Given 7527 template<typename T, typename U> class A {}; 7528 A<double, int> b; 7529 A<int, double> c; 7530varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 7531 hasTypeLoc(loc(asString("double"))))))) 7532 matches `A<double, int> b`, but not `A<int, double> c`. 7533</pre></td></tr> 7534 7535 7536<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 7537<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 7538specific using shadow declaration. 7539 7540Given 7541 namespace a { void f() {} } 7542 using a::f; 7543 void g() { 7544 f(); // Matches this .. 7545 a::f(); // .. but not this. 7546 } 7547declRefExpr(throughUsingDecl(anything())) 7548 matches f() 7549</pre></td></tr> 7550 7551 7552<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> 7553<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7554specified matcher. 7555 7556Example matches x in if(x) 7557 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7558 bool x; 7559 if (x) {} 7560</pre></td></tr> 7561 7562 7563<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> 7564<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7565 7566Note that this does not work for global declarations because the AST 7567breaks up multiple-declaration DeclStmt's into multiple single-declaration 7568DeclStmt's. 7569Example: Given non-global declarations 7570 int a, b = 0; 7571 int c; 7572 int d = 2, e; 7573declStmt(containsDeclaration( 7574 0, varDecl(hasInitializer(anything())))) 7575 matches only 'int d = 2, e;', and 7576declStmt(containsDeclaration(1, varDecl())) 7577 matches 'int a, b = 0' as well as 'int d = 2, e;' 7578 but 'int c;' is not matched. 7579</pre></td></tr> 7580 7581 7582<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> 7583<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7584 7585Given 7586 int a, b; 7587 int c; 7588declStmt(hasSingleDecl(anything())) 7589 matches 'int c;' but not 'int a, b;'. 7590</pre></td></tr> 7591 7592 7593<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> 7594<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. 7595 7596Examples: 7597 int x; 7598declaratorDecl(hasTypeLoc(loc(asString("int")))) 7599 matches int x 7600 7601auto x = int(3); 7602cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7603 matches int(3) 7604 7605struct Foo { Foo(int, int); }; 7606auto x = Foo(1, 2); 7607cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7608 matches Foo(1, 2) 7609 7610Usable 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>>, 7611 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>>, 7612 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>>, 7613 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7614 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>>, 7615 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>>, 7616 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>>, 7617 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7618</pre></td></tr> 7619 7620 7621<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> 7622<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7623Decl, matches InnerMatcher. 7624 7625Given 7626 namespace N { 7627 namespace M { 7628 class D {}; 7629 } 7630 } 7631 7632cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7633declaration of class D. 7634</pre></td></tr> 7635 7636 7637<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> 7638<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7639 7640Given 7641 decltype(1) a = 1; 7642 decltype(2.0) b = 2.0; 7643decltypeType(hasUnderlyingType(isInteger())) 7644 matches the type of "a" 7645 7646Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7647</pre></td></tr> 7648 7649 7650<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> 7651<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7652 7653For example, in: 7654void foo() 7655{ 7656 int arr[3]; 7657 auto &[f, s, t] = arr; 7658 7659 f = 42; 7660} 7661The matcher: 7662 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7663matches the decomposition decl with 'f' bound to "fBinding". 7664</pre></td></tr> 7665 7666 7667<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> 7668<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7669 7670For example, in: 7671void foo() 7672{ 7673 int arr[3]; 7674 auto &[f, s, t] = arr; 7675 7676 f = 42; 7677} 7678The matcher: 7679 decompositionDecl(hasBinding(0, 7680 bindingDecl(hasName("f").bind("fBinding")))) 7681matches the decomposition decl with 'f' bound to "fBinding". 7682</pre></td></tr> 7683 7684 7685<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> 7686<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7687 7688 7689<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> 7690<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7691switch statement or conditional operator. 7692 7693Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7694 if (true) {} 7695</pre></td></tr> 7696 7697 7698<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> 7699<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching 7700`InnerMatcher`. 7701 7702Given 7703 template <typename T> 7704 class C {}; 7705 class C<int> c; 7706 7707 class D {}; 7708 class D d; 7709elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc())); 7710 matches the `TypeLoc` of the variable declaration of `c`, but not `d`. 7711</pre></td></tr> 7712 7713 7714<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> 7715<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7716matches InnerMatcher if the qualifier exists. 7717 7718Given 7719 namespace N { 7720 namespace M { 7721 class D {}; 7722 } 7723 } 7724 N::M::D d; 7725 7726elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7727matches the type of the variable declaration of d. 7728</pre></td></tr> 7729 7730 7731<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> 7732<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7733 7734Given 7735 namespace N { 7736 namespace M { 7737 class D {}; 7738 } 7739 } 7740 N::M::D d; 7741 7742elaboratedType(namesType(recordType( 7743hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7744declaration of d. 7745</pre></td></tr> 7746 7747 7748<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> 7749<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7750matches the given matcher. 7751 7752The associated declaration is: 7753- for type nodes, the declaration of the underlying type 7754- for CallExpr, the declaration of the callee 7755- for MemberExpr, the declaration of the referenced member 7756- for CXXConstructExpr, the declaration of the constructor 7757- for CXXNewExpr, the declaration of the operator new 7758- for ObjCIvarExpr, the declaration of the ivar 7759 7760For type nodes, hasDeclaration will generally match the declaration of the 7761sugared type. Given 7762 class X {}; 7763 typedef X Y; 7764 Y y; 7765in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7766typedefDecl. A common use case is to match the underlying, desugared type. 7767This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7768 varDecl(hasType(hasUnqualifiedDesugaredType( 7769 recordType(hasDeclaration(decl()))))) 7770In this matcher, the decl will match the CXXRecordDecl of class X. 7771 7772Usable 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>>, 7773 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>>, 7774 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>>, 7775 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>>, 7776 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>>, 7777 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>>, 7778 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7779</pre></td></tr> 7780 7781 7782<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> 7783<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7784 7785(Note: Clang's AST refers to other conversions as "casts" too, and calls 7786actual casts "explicit" casts.) 7787</pre></td></tr> 7788 7789 7790<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> 7791<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. 7792 7793Examples: 7794 int x; 7795declaratorDecl(hasTypeLoc(loc(asString("int")))) 7796 matches int x 7797 7798auto x = int(3); 7799cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7800 matches int(3) 7801 7802struct Foo { Foo(int, int); }; 7803auto x = Foo(1, 2); 7804cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7805 matches Foo(1, 2) 7806 7807Usable 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>>, 7808 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>>, 7809 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>>, 7810 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7811 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>>, 7812 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>>, 7813 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>>, 7814 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7815</pre></td></tr> 7816 7817 7818<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> 7819<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7820declaration's type. 7821 7822In case of a value declaration (for example a variable declaration), 7823this resolves one layer of indirection. For example, in the value 7824declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7825X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7826declaration of x. 7827 7828Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7829 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7830 and friend class X (matcher = friendDecl(hasType("X")) 7831 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7832 cxxRecordDecl(hasName("X")))) 7833 class X {}; 7834 void y(X &x) { x; X z; } 7835 class Y { friend class X; }; 7836 class Z : public virtual X {}; 7837 7838Example matches class Derived 7839(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7840class Base {}; 7841class Derived : Base {}; 7842 7843Usable 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>>, 7844Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7845</pre></td></tr> 7846 7847 7848<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> 7849<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7850matcher. 7851 7852Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7853 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7854 and U (matcher = typedefDecl(hasType(asString("int"))) 7855 and friend class X (matcher = friendDecl(hasType("X")) 7856 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7857 asString("class X"))) 7858 class X {}; 7859 void y(X &x) { x; X z; } 7860 typedef int U; 7861 class Y { friend class X; }; 7862 class Z : public virtual X {}; 7863</pre></td></tr> 7864 7865 7866<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> 7867<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7868elidable constructor and other corresponding bookkeeping nodes. 7869 7870In C++17, elidable copy constructors are no longer being generated in the 7871AST as it is not permitted by the standard. They are, however, part of the 7872AST in C++14 and earlier. So, a matcher must abstract over these differences 7873to work in all language modes. This matcher skips elidable constructor-call 7874AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7875various implicit nodes inside the constructor calls, all of which will not 7876appear in the C++17 AST. 7877 7878Given 7879 7880struct H {}; 7881H G(); 7882void f() { 7883 H D = G(); 7884} 7885 7886``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7887matches ``H D = G()`` in C++11 through C++17 (and beyond). 7888</pre></td></tr> 7889 7890 7891<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> 7892<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7893are stripped off. 7894 7895Parentheses and explicit casts are not discarded. 7896Given 7897 int arr[5]; 7898 int a = 0; 7899 char b = 0; 7900 const int c = a; 7901 int *d = arr; 7902 long e = (long) 0l; 7903The matchers 7904 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7905 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7906would match the declarations for a, b, c, and d, but not e. 7907While 7908 varDecl(hasInitializer(integerLiteral())) 7909 varDecl(hasInitializer(declRefExpr())) 7910only match the declarations for a. 7911</pre></td></tr> 7912 7913 7914<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> 7915<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7916nodes are stripped off. 7917 7918Parentheses and explicit casts are not discarded. 7919Given 7920 class C {}; 7921 C a = C(); 7922 C b; 7923 C c = b; 7924The matchers 7925 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7926would match the declarations for a, b, and c. 7927While 7928 varDecl(hasInitializer(cxxConstructExpr())) 7929only match the declarations for b and c. 7930</pre></td></tr> 7931 7932 7933<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> 7934<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7935casts are stripped off. 7936 7937Implicit and non-C Style casts are also discarded. 7938Given 7939 int a = 0; 7940 char b = (0); 7941 void* c = reinterpret_cast<char*>(0); 7942 char d = char(0); 7943The matcher 7944 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7945would match the declarations for a, b, c, and d. 7946while 7947 varDecl(hasInitializer(integerLiteral())) 7948only match the declaration for a. 7949</pre></td></tr> 7950 7951 7952<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> 7953<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7954parentheses are stripped off. 7955 7956Explicit casts are not discarded. 7957Given 7958 int arr[5]; 7959 int a = 0; 7960 char b = (0); 7961 const int c = a; 7962 int *d = (arr); 7963 long e = ((long) 0l); 7964The matchers 7965 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7966 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7967would match the declarations for a, b, c, and d, but not e. 7968while 7969 varDecl(hasInitializer(integerLiteral())) 7970 varDecl(hasInitializer(declRefExpr())) 7971would only match the declaration for a. 7972</pre></td></tr> 7973 7974 7975<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> 7976<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7977 7978Given 7979 const char* str = ("my-string"); 7980The matcher 7981 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7982would match the implicit cast resulting from the assignment. 7983</pre></td></tr> 7984 7985 7986<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> 7987<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7988 7989Given 7990 class C { 7991 int a = 2; 7992 int b = 3; 7993 int c; 7994 }; 7995fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7996 matches 'int a;' but not 'int b;'. 7997fieldDecl(hasInClassInitializer(anything())) 7998 matches 'int a;' and 'int b;' but not 'int c;'. 7999</pre></td></tr> 8000 8001 8002<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> 8003<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 8004 8005 8006<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> 8007<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 8008switch statement or conditional operator. 8009 8010Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8011 if (true) {} 8012</pre></td></tr> 8013 8014 8015<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> 8016<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 8017 8018Example: 8019 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 8020matches '++x' in 8021 for (x; x < N; ++x) { } 8022</pre></td></tr> 8023 8024 8025<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> 8026<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 8027 8028Example: 8029 forStmt(hasLoopInit(declStmt())) 8030matches 'int x = 0' in 8031 for (int x = 0; x < N; ++x) { } 8032</pre></td></tr> 8033 8034 8035<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> 8036<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8037declaration's type. 8038 8039In case of a value declaration (for example a variable declaration), 8040this resolves one layer of indirection. For example, in the value 8041declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8042X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8043declaration of x. 8044 8045Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8046 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8047 and friend class X (matcher = friendDecl(hasType("X")) 8048 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8049 cxxRecordDecl(hasName("X")))) 8050 class X {}; 8051 void y(X &x) { x; X z; } 8052 class Y { friend class X; }; 8053 class Z : public virtual X {}; 8054 8055Example matches class Derived 8056(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8057class Base {}; 8058class Derived : Base {}; 8059 8060Usable 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>>, 8061Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8062</pre></td></tr> 8063 8064 8065<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> 8066<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 8067matcher. 8068 8069Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8070 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8071 and U (matcher = typedefDecl(hasType(asString("int"))) 8072 and friend class X (matcher = friendDecl(hasType("X")) 8073 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8074 asString("class X"))) 8075 class X {}; 8076 void y(X &x) { x; X z; } 8077 typedef int U; 8078 class Y { friend class X; }; 8079 class Z : public virtual X {}; 8080</pre></td></tr> 8081 8082 8083<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> 8084<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 8085Note that this matcher matches all the declarations of a function whose 8086body is present in the AST. 8087 8088Given 8089 void f(); 8090 void f() {} 8091 void g(); 8092functionDecl(hasAnyBody(compoundStmt())) 8093 matches both 'void f();' 8094 and 'void f() {}' 8095with compoundStmt() 8096 matching '{}' 8097 but does not match 'void g();' 8098</pre></td></tr> 8099 8100 8101<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> 8102<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 8103block. 8104 8105Does not match the 'this' parameter of a method. 8106 8107Given 8108 class X { void f(int x, int y, int z) {} }; 8109cxxMethodDecl(hasAnyParameter(hasName("y"))) 8110 matches f(int x, int y, int z) {} 8111with hasAnyParameter(...) 8112 matching int y 8113 8114For ObjectiveC, given 8115 @interface I - (void) f:(int) y; @end 8116 8117the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8118matches the declaration of method f with hasParameter 8119matching y. 8120 8121For blocks, given 8122 b = ^(int y) { printf("%d", y) }; 8123 8124the matcher blockDecl(hasAnyParameter(hasName("y"))) 8125matches the declaration of the block b with hasParameter 8126matching y. 8127</pre></td></tr> 8128 8129 8130<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> 8131<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8132functionDecl that have at least one TemplateArgument matching the given 8133InnerMatcher. 8134 8135Given 8136 template<typename T> class A {}; 8137 template<> class A<double> {}; 8138 A<int> a; 8139 8140 template<typename T> f() {}; 8141 void func() { f<int>(); }; 8142 8143classTemplateSpecializationDecl(hasAnyTemplateArgument( 8144 refersToType(asString("int")))) 8145 matches the specialization A<int> 8146 8147functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8148 matches the specialization f<int> 8149</pre></td></tr> 8150 8151 8152<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> 8153<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 8154 8155 8156<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> 8157<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 8158declaration. 8159 8160Given 8161 template<bool b> 8162 struct S { 8163 S(int); // #1 8164 explicit S(double); // #2 8165 operator int(); // #3 8166 explicit operator bool(); // #4 8167 explicit(false) S(bool) // # 7 8168 explicit(true) S(char) // # 8 8169 explicit(b) S(S) // # 9 8170 }; 8171 S(int) -> S<true> // #5 8172 explicit S(double) -> S<false> // #6 8173cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 8174cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 8175cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 8176</pre></td></tr> 8177 8178 8179<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> 8180<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 8181declaration or a block. 8182 8183Given 8184 class X { void f(int x) {} }; 8185cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8186 matches f(int x) {} 8187with hasParameter(...) 8188 matching int x 8189 8190For ObjectiveC, given 8191 @interface I - (void) f:(int) y; @end 8192 8193the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8194matches the declaration of method f with hasParameter 8195matching y. 8196</pre></td></tr> 8197 8198 8199<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> 8200<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`. 8201 8202Given 8203 int f() { return 5; } 8204 void g() {} 8205functionDecl(hasReturnTypeLoc(loc(asString("int")))) 8206 matches the declaration of `f`, but not `g`. 8207</pre></td></tr> 8208 8209 8210<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> 8211<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8212functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8213 8214Given 8215 template<typename T, typename U> class A {}; 8216 A<bool, int> b; 8217 A<int, bool> c; 8218 8219 template<typename T> void f() {} 8220 void func() { f<int>(); }; 8221classTemplateSpecializationDecl(hasTemplateArgument( 8222 1, refersToType(asString("int")))) 8223 matches the specialization A<bool, int> 8224 8225functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8226 matches the specialization f<int> 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('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> 8231<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 8232 8233Given: 8234 class X { int f() { return 1; } }; 8235cxxMethodDecl(returns(asString("int"))) 8236 matches int f() { return 1; } 8237</pre></td></tr> 8238 8239 8240<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> 8241<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 8242switch statement or conditional operator. 8243 8244Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8245 if (true) {} 8246</pre></td></tr> 8247 8248 8249<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> 8250<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 8251 8252Given 8253 if (A* a = GetAPointer()) {} 8254hasConditionVariableStatement(...) 8255 matches 'A* a = GetAPointer()'. 8256</pre></td></tr> 8257 8258 8259<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> 8260<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 8261 8262Examples matches the if statement 8263 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 8264 if (false) false; else true; 8265</pre></td></tr> 8266 8267 8268<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> 8269<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 8270 8271Given: 8272 void foo() { 8273 if (int i = foobar(); i > 0) {} 8274 switch (int i = foobar(); i) {} 8275 for (auto& a = get_range(); auto& x : a) {} 8276 } 8277 void bar() { 8278 if (foobar() > 0) {} 8279 switch (foobar()) {} 8280 for (auto& x : get_range()) {} 8281 } 8282ifStmt(hasInitStatement(anything())) 8283 matches the if statement in foo but not in bar. 8284switchStmt(hasInitStatement(anything())) 8285 matches the switch statement in foo but not in bar. 8286cxxForRangeStmt(hasInitStatement(anything())) 8287 matches the range for statement in foo but not in bar. 8288</pre></td></tr> 8289 8290 8291<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> 8292<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 8293 8294Examples matches the if statement 8295 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 8296 if (false) true; else false; 8297</pre></td></tr> 8298 8299 8300<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> 8301<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 8302matcher. 8303 8304FIXME: Unit test this matcher 8305</pre></td></tr> 8306 8307 8308<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> 8309<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 8310 8311Example matches y. 8312 (matcher = initListExpr(hasInit(0, expr()))) 8313 int x{y}. 8314</pre></td></tr> 8315 8316 8317<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> 8318<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 8319(if expression have it). 8320</pre></td></tr> 8321 8322 8323<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> 8324<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 8325matches the given matcher. 8326 8327The associated declaration is: 8328- for type nodes, the declaration of the underlying type 8329- for CallExpr, the declaration of the callee 8330- for MemberExpr, the declaration of the referenced member 8331- for CXXConstructExpr, the declaration of the constructor 8332- for CXXNewExpr, the declaration of the operator new 8333- for ObjCIvarExpr, the declaration of the ivar 8334 8335For type nodes, hasDeclaration will generally match the declaration of the 8336sugared type. Given 8337 class X {}; 8338 typedef X Y; 8339 Y y; 8340in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8341typedefDecl. A common use case is to match the underlying, desugared type. 8342This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8343 varDecl(hasType(hasUnqualifiedDesugaredType( 8344 recordType(hasDeclaration(decl()))))) 8345In this matcher, the decl will match the CXXRecordDecl of class X. 8346 8347Usable 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>>, 8348 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>>, 8349 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>>, 8350 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>>, 8351 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>>, 8352 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>>, 8353 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8354</pre></td></tr> 8355 8356 8357<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> 8358<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 8359matches the given matcher. 8360 8361The associated declaration is: 8362- for type nodes, the declaration of the underlying type 8363- for CallExpr, the declaration of the callee 8364- for MemberExpr, the declaration of the referenced member 8365- for CXXConstructExpr, the declaration of the constructor 8366- for CXXNewExpr, the declaration of the operator new 8367- for ObjCIvarExpr, the declaration of the ivar 8368 8369For type nodes, hasDeclaration will generally match the declaration of the 8370sugared type. Given 8371 class X {}; 8372 typedef X Y; 8373 Y y; 8374in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8375typedefDecl. A common use case is to match the underlying, desugared type. 8376This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8377 varDecl(hasType(hasUnqualifiedDesugaredType( 8378 recordType(hasDeclaration(decl()))))) 8379In this matcher, the decl will match the CXXRecordDecl of class X. 8380 8381Usable 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>>, 8382 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>>, 8383 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>>, 8384 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>>, 8385 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>>, 8386 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>>, 8387 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8388</pre></td></tr> 8389 8390 8391<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> 8392<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The 8393`VarDecl` can be a separate variable that is captured by value or 8394reference, or a synthesized variable if the capture has an initializer. 8395 8396Given 8397 void foo() { 8398 int x; 8399 auto f = [x](){}; 8400 auto g = [x = 1](){}; 8401 } 8402In the matcher 8403lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))), 8404capturesVar(hasName("x")) matches `x` and `x = 1`. 8405</pre></td></tr> 8406 8407 8408<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> 8409<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 8410matches the given matcher. 8411 8412The associated declaration is: 8413- for type nodes, the declaration of the underlying type 8414- for CallExpr, the declaration of the callee 8415- for MemberExpr, the declaration of the referenced member 8416- for CXXConstructExpr, the declaration of the constructor 8417- for CXXNewExpr, the declaration of the operator new 8418- for ObjCIvarExpr, the declaration of the ivar 8419 8420For type nodes, hasDeclaration will generally match the declaration of the 8421sugared type. Given 8422 class X {}; 8423 typedef X Y; 8424 Y y; 8425in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8426typedefDecl. A common use case is to match the underlying, desugared type. 8427This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8428 varDecl(hasType(hasUnqualifiedDesugaredType( 8429 recordType(hasDeclaration(decl()))))) 8430In this matcher, the decl will match the CXXRecordDecl of class X. 8431 8432Usable 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>>, 8433 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>>, 8434 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>>, 8435 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>>, 8436 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>>, 8437 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>>, 8438 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8439</pre></td></tr> 8440 8441 8442<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> 8443<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 8444given matcher. Implicit object expressions are included; that is, it matches 8445use of implicit `this`. 8446 8447Given 8448 struct X { 8449 int m; 8450 int f(X x) { x.m; return m; } 8451 }; 8452memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8453 matches `x.m`, but not `m`; however, 8454memberExpr(hasObjectExpression(hasType(pointsTo( 8455 cxxRecordDecl(hasName("X")))))) 8456 matches `m` (aka. `this->m`), but not `x.m`. 8457</pre></td></tr> 8458 8459 8460<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> 8461<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 8462given matcher. 8463 8464Given 8465 struct { int first, second; } first, second; 8466 int i(second.first); 8467 int j(first.second); 8468memberExpr(member(hasName("first"))) 8469 matches second.first 8470 but not first.second (because the member name there is "second"). 8471</pre></td></tr> 8472 8473 8474<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> 8475<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 8476pointee matches a given matcher. 8477 8478Given 8479 int *a; 8480 int const *b; 8481 float const *f; 8482pointerType(pointee(isConstQualified(), isInteger())) 8483 matches "int const *b" 8484 8485Usable 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>>, 8486 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>> 8487</pre></td></tr> 8488 8489 8490<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> 8491<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 8492matcher. 8493 8494Given 8495 namespace N { template<class T> void f(T t); } 8496 template <class T> void g() { using N::f; f(T()); } 8497unresolvedLookupExpr(hasAnyDeclaration( 8498 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 8499 matches the use of f in g() . 8500</pre></td></tr> 8501 8502 8503<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> 8504<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8505 8506Given 8507 struct A { struct B { struct C {}; }; }; 8508 A::B::C c; 8509nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8510 matches "A::" 8511</pre></td></tr> 8512 8513 8514<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> 8515<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8516NestedNameSpecifier-matcher matches. 8517</pre></td></tr> 8518 8519 8520<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> 8521<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8522given TypeLoc. 8523 8524Given 8525 struct A { struct B { struct C {}; }; }; 8526 A::B::C c; 8527nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8528 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8529 matches "A::" 8530</pre></td></tr> 8531 8532 8533<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> 8534<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8535 8536Given 8537 struct A { struct B { struct C {}; }; }; 8538 A::B::C c; 8539nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8540 matches "A::" 8541</pre></td></tr> 8542 8543 8544<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> 8545<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8546given namespace matcher. 8547 8548Given 8549 namespace ns { struct A {}; } 8550 ns::A a; 8551nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8552 matches "ns::" 8553</pre></td></tr> 8554 8555 8556<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> 8557<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8558given QualType matcher without qualifiers. 8559 8560Given 8561 struct A { struct B { struct C {}; }; }; 8562 A::B::C c; 8563nestedNameSpecifier(specifiesType( 8564 hasDeclaration(cxxRecordDecl(hasName("A"))) 8565)) 8566 matches "A::" 8567</pre></td></tr> 8568 8569 8570<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> 8571<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8572 8573Given 8574 8575 #pragma omp parallel 8576 #pragma omp parallel default(none) 8577 8578``ompExecutableDirective(hasAnyClause(anything()))`` matches 8579``omp parallel default(none)``. 8580</pre></td></tr> 8581 8582 8583<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> 8584<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8585 8586Prerequisite: the executable directive must not be standalone directive. 8587If it is, it will never match. 8588 8589Given 8590 8591 #pragma omp parallel 8592 ; 8593 #pragma omp parallel 8594 {} 8595 8596``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8597</pre></td></tr> 8598 8599 8600<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> 8601<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8602matching Base, or Objective-C classes that directly or indirectly 8603subclass a class matching Base. 8604 8605Note that a class is not considered to be derived from itself. 8606 8607Example matches Y, Z, C (Base == hasName("X")) 8608 class X; 8609 class Y : public X {}; // directly derived 8610 class Z : public Y {}; // indirectly derived 8611 typedef X A; 8612 typedef A B; 8613 class C : public B {}; // derived from a typedef of X 8614 8615In the following example, Bar matches isDerivedFrom(hasName("X")): 8616 class Foo; 8617 typedef Foo X; 8618 class Bar : public Foo {}; // derived from a type that X is a typedef of 8619 8620In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8621 @interface NSObject @end 8622 @interface Bar : NSObject @end 8623 8624Usable 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>> 8625</pre></td></tr> 8626 8627 8628<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> 8629<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8630matching Base. 8631 8632Note that a class is not considered to be derived from itself. 8633 8634Example matches Y, C (Base == hasName("X")) 8635 class X; 8636 class Y : public X {}; // directly derived 8637 class Z : public Y {}; // indirectly derived 8638 typedef X A; 8639 typedef A B; 8640 class C : public B {}; // derived from a typedef of X 8641 8642In the following example, Bar matches isDerivedFrom(hasName("X")): 8643 class Foo; 8644 typedef Foo X; 8645 class Bar : public Foo {}; // derived from a type that X is a typedef of 8646</pre></td></tr> 8647 8648 8649<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> 8650<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8651match Base. 8652</pre></td></tr> 8653 8654 8655<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> 8656<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8657expression, or an ObjC-message-send expression. 8658 8659Given 8660 void x(int, int, int) { int y; x(1, y, 42); } 8661callExpr(hasAnyArgument(declRefExpr())) 8662 matches x(1, y, 42) 8663with hasAnyArgument(...) 8664 matching y 8665 8666For ObjectiveC, given 8667 @interface I - (void) f:(int) y; @end 8668 void foo(I *i) { [i f:12]; } 8669objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8670 matches [i f:12] 8671</pre></td></tr> 8672 8673 8674<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> 8675<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8676call expression. 8677 8678Example matches y in x(y) 8679 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8680 void x(int) { int y; x(y); } 8681</pre></td></tr> 8682 8683 8684<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> 8685<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8686and the inner matcher matches on that instance. 8687 8688For example the method call in 8689 NSString *x = @"hello"; 8690 [x containsString:@"h"]; 8691is matched by 8692objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8693</pre></td></tr> 8694 8695 8696<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> 8697<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8698 8699Example 8700matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8701matches the [webView ...] message invocation. 8702 NSString *webViewJavaScript = ... 8703 UIWebView *webView = ... 8704 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8705</pre></td></tr> 8706 8707 8708<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> 8709<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8710block. 8711 8712Does not match the 'this' parameter of a method. 8713 8714Given 8715 class X { void f(int x, int y, int z) {} }; 8716cxxMethodDecl(hasAnyParameter(hasName("y"))) 8717 matches f(int x, int y, int z) {} 8718with hasAnyParameter(...) 8719 matching int y 8720 8721For ObjectiveC, given 8722 @interface I - (void) f:(int) y; @end 8723 8724the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8725matches the declaration of method f with hasParameter 8726matching y. 8727 8728For blocks, given 8729 b = ^(int y) { printf("%d", y) }; 8730 8731the matcher blockDecl(hasAnyParameter(hasName("y"))) 8732matches the declaration of the block b with hasParameter 8733matching y. 8734</pre></td></tr> 8735 8736 8737<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> 8738<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8739declaration or a block. 8740 8741Given 8742 class X { void f(int x) {} }; 8743cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8744 matches f(int x) {} 8745with hasParameter(...) 8746 matching int x 8747 8748For ObjectiveC, given 8749 @interface I - (void) f:(int) y; @end 8750 8751the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8752matches the declaration of method f with hasParameter 8753matching y. 8754</pre></td></tr> 8755 8756 8757<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> 8758<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. 8759 8760Examples: 8761 int x; 8762declaratorDecl(hasTypeLoc(loc(asString("int")))) 8763 matches int x 8764 8765auto x = int(3); 8766cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8767 matches int(3) 8768 8769struct Foo { Foo(int, int); }; 8770auto x = Foo(1, 2); 8771cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8772 matches Foo(1, 2) 8773 8774Usable 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>>, 8775 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>>, 8776 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>>, 8777 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8778 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>>, 8779 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>>, 8780 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>>, 8781 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8782</pre></td></tr> 8783 8784 8785<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> 8786<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8787or opaque value's source expression matches the given matcher. 8788 8789Example 1: matches "a string" 8790(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8791class URL { URL(string); }; 8792URL url = "a string"; 8793 8794Example 2: matches 'b' (matcher = 8795opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8796int a = b ?: 1; 8797</pre></td></tr> 8798 8799 8800<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> 8801<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8802overloads matches the given matcher. 8803 8804Given 8805 template <typename T> void foo(T); 8806 template <typename T> void bar(T); 8807 template <typename T> void baz(T t) { 8808 foo(t); 8809 bar(t); 8810 } 8811unresolvedLookupExpr(hasAnyDeclaration( 8812 functionTemplateDecl(hasName("foo")))) 8813 matches foo in foo(t); but not bar in bar(t); 8814</pre></td></tr> 8815 8816 8817<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> 8818<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8819 8820Given 8821 int (*ptr_to_array)[4]; 8822 int (*ptr_to_func)(int); 8823 8824varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8825ptr_to_func but not ptr_to_array. 8826 8827Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8828</pre></td></tr> 8829 8830 8831<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> 8832<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching 8833`PointeeMatcher`. 8834 8835Given 8836 int* x; 8837pointerTypeLoc(hasPointeeLoc(loc(asString("int")))) 8838 matches `int*`. 8839</pre></td></tr> 8840 8841 8842<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> 8843<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8844pointee matches a given matcher. 8845 8846Given 8847 int *a; 8848 int const *b; 8849 float const *f; 8850pointerType(pointee(isConstQualified(), isInteger())) 8851 matches "int const *b" 8852 8853Usable 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>>, 8854 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>> 8855</pre></td></tr> 8856 8857 8858<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> 8859<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8860 8861Given: 8862 typedef int &int_ref; 8863 int a; 8864 int_ref b = a; 8865 8866varDecl(hasType(qualType(referenceType()))))) will not match the 8867declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8868</pre></td></tr> 8869 8870 8871<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> 8872<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8873matches the given matcher. 8874 8875The associated declaration is: 8876- for type nodes, the declaration of the underlying type 8877- for CallExpr, the declaration of the callee 8878- for MemberExpr, the declaration of the referenced member 8879- for CXXConstructExpr, the declaration of the constructor 8880- for CXXNewExpr, the declaration of the operator new 8881- for ObjCIvarExpr, the declaration of the ivar 8882 8883For type nodes, hasDeclaration will generally match the declaration of the 8884sugared type. Given 8885 class X {}; 8886 typedef X Y; 8887 Y y; 8888in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8889typedefDecl. A common use case is to match the underlying, desugared type. 8890This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8891 varDecl(hasType(hasUnqualifiedDesugaredType( 8892 recordType(hasDeclaration(decl()))))) 8893In this matcher, the decl will match the CXXRecordDecl of class X. 8894 8895Usable 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>>, 8896 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>>, 8897 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>>, 8898 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>>, 8899 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>>, 8900 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>>, 8901 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8902</pre></td></tr> 8903 8904 8905<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> 8906<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8907 8908Given 8909 void (*fp)(void); 8910The matcher 8911 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8912would match the declaration for fp. 8913</pre></td></tr> 8914 8915 8916<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> 8917<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8918</pre></td></tr> 8919 8920 8921<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> 8922<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8923matches the specified matcher. 8924 8925Example matches y->x() 8926 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8927 cxxRecordDecl(hasName("Y"))))))) 8928 class Y { public: void x(); }; 8929 void z() { Y *y; y->x(); } 8930</pre></td></tr> 8931 8932 8933<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('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> 8934<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8935</pre></td></tr> 8936 8937 8938<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> 8939<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8940type matches the specified matcher. 8941 8942Example matches X &x and const X &y 8943 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8944 class X { 8945 void a(X b) { 8946 X &x = b; 8947 const X &y = b; 8948 } 8949 }; 8950</pre></td></tr> 8951 8952 8953<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> 8954<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching 8955`InnerMatcher`. 8956 8957Given 8958 int* const x; 8959 const int y; 8960qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc())) 8961 matches the `TypeLoc` of the variable declaration of `x`, but not `y`. 8962</pre></td></tr> 8963 8964 8965<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> 8966<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8967matches the given matcher. 8968 8969The associated declaration is: 8970- for type nodes, the declaration of the underlying type 8971- for CallExpr, the declaration of the callee 8972- for MemberExpr, the declaration of the referenced member 8973- for CXXConstructExpr, the declaration of the constructor 8974- for CXXNewExpr, the declaration of the operator new 8975- for ObjCIvarExpr, the declaration of the ivar 8976 8977For type nodes, hasDeclaration will generally match the declaration of the 8978sugared type. Given 8979 class X {}; 8980 typedef X Y; 8981 Y y; 8982in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8983typedefDecl. A common use case is to match the underlying, desugared type. 8984This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8985 varDecl(hasType(hasUnqualifiedDesugaredType( 8986 recordType(hasDeclaration(decl()))))) 8987In this matcher, the decl will match the CXXRecordDecl of class X. 8988 8989Usable 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>>, 8990 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>>, 8991 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>>, 8992 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>>, 8993 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>>, 8994 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>>, 8995 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8996</pre></td></tr> 8997 8998 8999<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> 9000<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching 9001`ReferentMatcher`. 9002 9003Given 9004 int x = 3; 9005 int& xx = x; 9006referenceTypeLoc(hasReferentLoc(loc(asString("int")))) 9007 matches `int&`. 9008</pre></td></tr> 9009 9010 9011<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> 9012<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 9013pointee matches a given matcher. 9014 9015Given 9016 int *a; 9017 int const *b; 9018 float const *f; 9019pointerType(pointee(isConstQualified(), isInteger())) 9020 matches "int const *b" 9021 9022Usable 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>>, 9023 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>> 9024</pre></td></tr> 9025 9026 9027<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> 9028<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 9029 9030Given 9031 return a + b; 9032hasReturnValue(binaryOperator()) 9033 matches 'return a + b' 9034with binaryOperator() 9035 matching 'a + b' 9036</pre></td></tr> 9037 9038 9039<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> 9040<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 9041a given matcher. Also matches StmtExprs that have CompoundStmt as children. 9042 9043Given 9044 { {}; 1+2; } 9045hasAnySubstatement(compoundStmt()) 9046 matches '{ {}; 1+2; }' 9047with compoundStmt() 9048 matching '{}' 9049</pre></td></tr> 9050 9051 9052<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> 9053<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9054alignof. 9055</pre></td></tr> 9056 9057 9058<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> 9059<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement 9060belongs to. 9061 9062Given: 9063F& operator=(const F& o) { 9064 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9065 return *this; 9066} 9067returnStmt(forCallable(functionDecl(hasName("operator=")))) 9068 matches 'return *this' 9069 but does not match 'return v > 0' 9070 9071Given: 9072-(void) foo { 9073 int x = 1; 9074 dispatch_sync(queue, ^{ int y = 2; }); 9075} 9076declStmt(forCallable(objcMethodDecl())) 9077 matches 'int x = 1' 9078 but does not match 'int y = 2'. 9079whereas declStmt(forCallable(blockDecl())) 9080 matches 'int y = 2' 9081 but does not match 'int x = 1'. 9082</pre></td></tr> 9083 9084 9085<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> 9086<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to. 9087 9088Deprecated. Use forCallable() to correctly handle the situation when 9089the declaration is not a function (but a block or an Objective-C method). 9090forFunction() not only fails to take non-functions into account but also 9091may match the wrong declaration in their presence. 9092 9093Given: 9094F& operator=(const F& o) { 9095 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9096 return *this; 9097} 9098returnStmt(forFunction(hasName("operator="))) 9099 matches 'return *this' 9100 but does not match 'return v > 0' 9101</pre></td></tr> 9102 9103 9104<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> 9105<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9106sizeof. 9107</pre></td></tr> 9108 9109 9110<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> 9111<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 9112type that matches the provided matcher. 9113 9114Given 9115 template <typename T> 9116 double F(T t); 9117 int i; 9118 double j = F(i); 9119 9120substTemplateTypeParmType(hasReplacementType(type())) matches int 9121</pre></td></tr> 9122 9123 9124<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> 9125<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 9126statement. This matcher may produce multiple matches. 9127 9128Given 9129 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 9130switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 9131 matches four times, with "c" binding each of "case 1:", "case 2:", 9132"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 9133"switch (1)", "switch (2)" and "switch (2)". 9134</pre></td></tr> 9135 9136 9137<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> 9138<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 9139switch statement or conditional operator. 9140 9141Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9142 if (true) {} 9143</pre></td></tr> 9144 9145 9146<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> 9147<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 9148 9149Given: 9150 void foo() { 9151 if (int i = foobar(); i > 0) {} 9152 switch (int i = foobar(); i) {} 9153 for (auto& a = get_range(); auto& x : a) {} 9154 } 9155 void bar() { 9156 if (foobar() > 0) {} 9157 switch (foobar()) {} 9158 for (auto& x : get_range()) {} 9159 } 9160ifStmt(hasInitStatement(anything())) 9161 matches the if statement in foo but not in bar. 9162switchStmt(hasInitStatement(anything())) 9163 matches the switch statement in foo but not in bar. 9164cxxForRangeStmt(hasInitStatement(anything())) 9165 matches the range for statement in foo but not in bar. 9166</pre></td></tr> 9167 9168 9169<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> 9170<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 9171matches the given matcher. 9172 9173The associated declaration is: 9174- for type nodes, the declaration of the underlying type 9175- for CallExpr, the declaration of the callee 9176- for MemberExpr, the declaration of the referenced member 9177- for CXXConstructExpr, the declaration of the constructor 9178- for CXXNewExpr, the declaration of the operator new 9179- for ObjCIvarExpr, the declaration of the ivar 9180 9181For type nodes, hasDeclaration will generally match the declaration of the 9182sugared type. Given 9183 class X {}; 9184 typedef X Y; 9185 Y y; 9186in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9187typedefDecl. A common use case is to match the underlying, desugared type. 9188This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9189 varDecl(hasType(hasUnqualifiedDesugaredType( 9190 recordType(hasDeclaration(decl()))))) 9191In this matcher, the decl will match the CXXRecordDecl of class X. 9192 9193Usable 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>>, 9194 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>>, 9195 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>>, 9196 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>>, 9197 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>>, 9198 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>>, 9199 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9200</pre></td></tr> 9201 9202 9203<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> 9204<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. 9205 9206Examples: 9207 int x; 9208declaratorDecl(hasTypeLoc(loc(asString("int")))) 9209 matches int x 9210 9211auto x = int(3); 9212cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9213 matches int(3) 9214 9215struct Foo { Foo(int, int); }; 9216auto x = Foo(1, 2); 9217cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9218 matches Foo(1, 2) 9219 9220Usable 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>>, 9221 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>>, 9222 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>>, 9223 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9224 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>>, 9225 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>>, 9226 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>>, 9227 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9228</pre></td></tr> 9229 9230 9231<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> 9232<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 9233 9234Given 9235 struct B { int next; }; 9236 template<int(B::*next_ptr)> struct A {}; 9237 A<&B::next> a; 9238templateSpecializationType(hasAnyTemplateArgument( 9239 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 9240 matches the specialization A<&B::next> with fieldDecl(...) matching 9241 B::next 9242</pre></td></tr> 9243 9244 9245<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> 9246<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 9247declaration. 9248 9249Given 9250 struct B { int next; }; 9251 template<int(B::*next_ptr)> struct A {}; 9252 A<&B::next> a; 9253classTemplateSpecializationDecl(hasAnyTemplateArgument( 9254 refersToDeclaration(fieldDecl(hasName("next"))))) 9255 matches the specialization A<&B::next> with fieldDecl(...) matching 9256 B::next 9257</pre></td></tr> 9258 9259 9260<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> 9261<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 9262 9263Given 9264 template<int T> struct C {}; 9265 C<42> c; 9266classTemplateSpecializationDecl( 9267 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 9268 matches the implicit instantiation of C in C<42>. 9269</pre></td></tr> 9270 9271 9272<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> 9273<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 9274 9275Given 9276 template<template <typename> class S> class X {}; 9277 template<typename T> class Y {}; 9278 X<Y> xi; 9279classTemplateSpecializationDecl(hasAnyTemplateArgument( 9280 refersToTemplate(templateName()))) 9281 matches the specialization X<Y> 9282</pre></td></tr> 9283 9284 9285<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> 9286<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 9287 9288Given 9289 struct X {}; 9290 template<typename T> struct A {}; 9291 A<X> a; 9292classTemplateSpecializationDecl(hasAnyTemplateArgument( 9293 refersToType(class(hasName("X"))))) 9294 matches the specialization A<X> 9295</pre></td></tr> 9296 9297 9298<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> 9299<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one 9300`TemplateArgumentLoc` matching the given `InnerMatcher`. 9301 9302Given 9303 template<typename T> class A {}; 9304 A<int> a; 9305varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( 9306 hasTypeLoc(loc(asString("int"))))))) 9307 matches `A<int> a`. 9308</pre></td></tr> 9309 9310 9311<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> 9312<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th 9313`TemplateArgumentLoc` matches the given `InnerMatcher`. 9314 9315Given 9316 template<typename T, typename U> class A {}; 9317 A<double, int> b; 9318 A<int, double> c; 9319varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 9320 hasTypeLoc(loc(asString("double"))))))) 9321 matches `A<double, int> b`, but not `A<int, double> c`. 9322</pre></td></tr> 9323 9324 9325<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> 9326<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9327functionDecl that have at least one TemplateArgument matching the given 9328InnerMatcher. 9329 9330Given 9331 template<typename T> class A {}; 9332 template<> class A<double> {}; 9333 A<int> a; 9334 9335 template<typename T> f() {}; 9336 void func() { f<int>(); }; 9337 9338classTemplateSpecializationDecl(hasAnyTemplateArgument( 9339 refersToType(asString("int")))) 9340 matches the specialization A<int> 9341 9342functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 9343 matches the specialization f<int> 9344</pre></td></tr> 9345 9346 9347<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> 9348<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 9349matches the given matcher. 9350 9351The associated declaration is: 9352- for type nodes, the declaration of the underlying type 9353- for CallExpr, the declaration of the callee 9354- for MemberExpr, the declaration of the referenced member 9355- for CXXConstructExpr, the declaration of the constructor 9356- for CXXNewExpr, the declaration of the operator new 9357- for ObjCIvarExpr, the declaration of the ivar 9358 9359For type nodes, hasDeclaration will generally match the declaration of the 9360sugared type. Given 9361 class X {}; 9362 typedef X Y; 9363 Y y; 9364in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9365typedefDecl. A common use case is to match the underlying, desugared type. 9366This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9367 varDecl(hasType(hasUnqualifiedDesugaredType( 9368 recordType(hasDeclaration(decl()))))) 9369In this matcher, the decl will match the CXXRecordDecl of class X. 9370 9371Usable 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>>, 9372 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>>, 9373 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>>, 9374 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>>, 9375 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>>, 9376 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>>, 9377 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9378</pre></td></tr> 9379 9380 9381<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> 9382<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9383functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 9384 9385Given 9386 template<typename T, typename U> class A {}; 9387 A<bool, int> b; 9388 A<int, bool> c; 9389 9390 template<typename T> void f() {} 9391 void func() { f<int>(); }; 9392classTemplateSpecializationDecl(hasTemplateArgument( 9393 1, refersToType(asString("int")))) 9394 matches the specialization A<bool, int> 9395 9396functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 9397 matches the specialization f<int> 9398</pre></td></tr> 9399 9400 9401<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> 9402<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 9403matches the given matcher. 9404 9405The associated declaration is: 9406- for type nodes, the declaration of the underlying type 9407- for CallExpr, the declaration of the callee 9408- for MemberExpr, the declaration of the referenced member 9409- for CXXConstructExpr, the declaration of the constructor 9410- for CXXNewExpr, the declaration of the operator new 9411- for ObjCIvarExpr, the declaration of the ivar 9412 9413For type nodes, hasDeclaration will generally match the declaration of the 9414sugared type. Given 9415 class X {}; 9416 typedef X Y; 9417 Y y; 9418in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9419typedefDecl. A common use case is to match the underlying, desugared type. 9420This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9421 varDecl(hasType(hasUnqualifiedDesugaredType( 9422 recordType(hasDeclaration(decl()))))) 9423In this matcher, the decl will match the CXXRecordDecl of class X. 9424 9425Usable 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>>, 9426 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>>, 9427 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>>, 9428 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>>, 9429 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>>, 9430 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>>, 9431 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9432</pre></td></tr> 9433 9434 9435<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> 9436<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 9437QualType-matcher matches. 9438</pre></td></tr> 9439 9440 9441<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> 9442<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. 9443 9444Examples: 9445 int x; 9446declaratorDecl(hasTypeLoc(loc(asString("int")))) 9447 matches int x 9448 9449auto x = int(3); 9450cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9451 matches int(3) 9452 9453struct Foo { Foo(int, int); }; 9454auto x = Foo(1, 2); 9455cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9456 matches Foo(1, 2) 9457 9458Usable 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>>, 9459 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>>, 9460 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>>, 9461 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9462 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>>, 9463 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>>, 9464 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>>, 9465 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9466</pre></td></tr> 9467 9468 9469<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> 9470<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 9471matcher. 9472 9473Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9474 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9475 and U (matcher = typedefDecl(hasType(asString("int"))) 9476 and friend class X (matcher = friendDecl(hasType("X")) 9477 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9478 asString("class X"))) 9479 class X {}; 9480 void y(X &x) { x; X z; } 9481 typedef int U; 9482 class Y { friend class X; }; 9483 class Z : public virtual X {}; 9484</pre></td></tr> 9485 9486 9487<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> 9488<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 9489matches the given matcher. 9490 9491The associated declaration is: 9492- for type nodes, the declaration of the underlying type 9493- for CallExpr, the declaration of the callee 9494- for MemberExpr, the declaration of the referenced member 9495- for CXXConstructExpr, the declaration of the constructor 9496- for CXXNewExpr, the declaration of the operator new 9497- for ObjCIvarExpr, the declaration of the ivar 9498 9499For type nodes, hasDeclaration will generally match the declaration of the 9500sugared type. Given 9501 class X {}; 9502 typedef X Y; 9503 Y y; 9504in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9505typedefDecl. A common use case is to match the underlying, desugared type. 9506This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9507 varDecl(hasType(hasUnqualifiedDesugaredType( 9508 recordType(hasDeclaration(decl()))))) 9509In this matcher, the decl will match the CXXRecordDecl of class X. 9510 9511Usable 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>>, 9512 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>>, 9513 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>>, 9514 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>>, 9515 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>>, 9516 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>>, 9517 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9518</pre></td></tr> 9519 9520 9521<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> 9522<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 9523type of the matched node. 9524 9525For example, in: 9526 class A {}; 9527 using B = A; 9528The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 9529both B and A. 9530</pre></td></tr> 9531 9532 9533<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> 9534<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 9535 9536Given 9537 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 9538unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 9539 matches sizeof(a) and alignof(c) 9540</pre></td></tr> 9541 9542 9543<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> 9544<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 9545 9546Example matches true (matcher = hasUnaryOperand( 9547 cxxBoolLiteral(equals(true)))) 9548 !true 9549</pre></td></tr> 9550 9551 9552<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> 9553<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 9554given matcher. Implicit object expressions are included; that is, it matches 9555use of implicit `this`. 9556 9557Given 9558 struct X { 9559 int m; 9560 int f(X x) { x.m; return m; } 9561 }; 9562memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 9563 matches `x.m`, but not `m`; however, 9564memberExpr(hasObjectExpression(hasType(pointsTo( 9565 cxxRecordDecl(hasName("X")))))) 9566 matches `m` (aka. `this->m`), but not `x.m`. 9567</pre></td></tr> 9568 9569 9570<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> 9571<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 9572matches the given matcher. 9573 9574The associated declaration is: 9575- for type nodes, the declaration of the underlying type 9576- for CallExpr, the declaration of the callee 9577- for MemberExpr, the declaration of the referenced member 9578- for CXXConstructExpr, the declaration of the constructor 9579- for CXXNewExpr, the declaration of the operator new 9580- for ObjCIvarExpr, the declaration of the ivar 9581 9582For type nodes, hasDeclaration will generally match the declaration of the 9583sugared type. Given 9584 class X {}; 9585 typedef X Y; 9586 Y y; 9587in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9588typedefDecl. A common use case is to match the underlying, desugared type. 9589This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9590 varDecl(hasType(hasUnqualifiedDesugaredType( 9591 recordType(hasDeclaration(decl()))))) 9592In this matcher, the decl will match the CXXRecordDecl of class X. 9593 9594Usable 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>>, 9595 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>>, 9596 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>>, 9597 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>>, 9598 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>>, 9599 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>>, 9600 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9601</pre></td></tr> 9602 9603 9604<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> 9605<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 9606matched by the given matcher. 9607 9608Given 9609 namespace X { int a; void b(); } 9610 using X::a; 9611 using X::b; 9612usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 9613 matches using X::b but not using X::a </pre></td></tr> 9614 9615 9616<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> 9617<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 9618declaration's type. 9619 9620In case of a value declaration (for example a variable declaration), 9621this resolves one layer of indirection. For example, in the value 9622declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 9623X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 9624declaration of x. 9625 9626Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9627 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9628 and friend class X (matcher = friendDecl(hasType("X")) 9629 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9630 cxxRecordDecl(hasName("X")))) 9631 class X {}; 9632 void y(X &x) { x; X z; } 9633 class Y { friend class X; }; 9634 class Z : public virtual X {}; 9635 9636Example matches class Derived 9637(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 9638class Base {}; 9639class Derived : Base {}; 9640 9641Usable 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>>, 9642Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 9643</pre></td></tr> 9644 9645 9646<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> 9647<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 9648matcher. 9649 9650Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9651 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9652 and U (matcher = typedefDecl(hasType(asString("int"))) 9653 and friend class X (matcher = friendDecl(hasType("X")) 9654 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9655 asString("class X"))) 9656 class X {}; 9657 void y(X &x) { x; X z; } 9658 typedef int U; 9659 class Y { friend class X; }; 9660 class Z : public virtual X {}; 9661</pre></td></tr> 9662 9663 9664<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> 9665<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 9666that matches the given matcher. 9667 9668Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 9669 bool y() { return true; } 9670 bool x = y(); 9671</pre></td></tr> 9672 9673 9674<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> 9675<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9676expression. 9677 9678Given 9679 void f(int b) { 9680 int a[b]; 9681 } 9682variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9683 varDecl(hasName("b"))))))) 9684 matches "int a[b]" 9685</pre></td></tr> 9686 9687 9688<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> 9689<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9690 9691 9692<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> 9693<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9694switch statement or conditional operator. 9695 9696Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9697 if (true) {} 9698</pre></td></tr> 9699 9700<!--END_TRAVERSAL_MATCHERS --> 9701</table> 9702 9703</div> 9704</body> 9705</html> 9706 9707 9708