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