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