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