@@ -1629,6 +1629,17 @@ <h2 id="decl-matchers">Node Matchers</h2>
1629
1629
</pre></td></tr>
1630
1630
1631
1631
1632
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFoldExpr0')"><a name="cxxFoldExpr0Anchor">cxxFoldExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>>...</td></tr>
1633
+ <tr><td colspan="4" class="doc" id="cxxFoldExpr0"><pre>Matches C++17 fold expressions.
1634
+
1635
+ Example matches `(0 + ... + args)`:
1636
+ template <typename... Args>
1637
+ auto sum(Args... args) {
1638
+ return (0 + ... + args);
1639
+ }
1640
+ </pre></td></tr>
1641
+
1642
+
1632
1643
<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>
1633
1644
<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1634
1645
@@ -3430,6 +3441,92 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
3430
3441
</pre></td></tr>
3431
3442
3432
3443
3444
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('hasOperator0')"><a name="hasOperator0Anchor">hasOperator</a></td><td>BinaryOperatorKind Op</td></tr>
3445
+ <tr><td colspan="4" class="doc" id="hasOperator0"><pre>Matches the operator kind of the fold expression.
3446
+
3447
+ Example matches `(0 + ... + args)`
3448
+ (matcher = cxxFoldExpr(hasOperator(BO_Add)))
3449
+ template <typename... Args>
3450
+ auto sum(Args... args) {
3451
+ return (0 + ... + args);
3452
+ }
3453
+
3454
+ template <typename... Args>
3455
+ auto multiply(Args... args) {
3456
+ return (args * ... * 1);
3457
+ }
3458
+ </pre></td></tr>
3459
+
3460
+
3461
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('isBinaryFold0')"><a name="isBinaryFold0Anchor">isBinaryFold</a></td><td></td></tr>
3462
+ <tr><td colspan="4" class="doc" id="isBinaryFold0"><pre>Matches binary fold expressions, i.e. fold expressions with an initializer.
3463
+
3464
+ Example matches `(0 + ... + args)`
3465
+ (matcher = cxxFoldExpr(isBinaryFold()))
3466
+ template <typename... Args>
3467
+ auto sum(Args... args) {
3468
+ return (0 + ... + args);
3469
+ }
3470
+
3471
+ template <typename... Args>
3472
+ auto multiply(Args... args) {
3473
+ return (args * ...);
3474
+ }
3475
+ </pre></td></tr>
3476
+
3477
+
3478
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('isLeftFold0')"><a name="isLeftFold0Anchor">isLeftFold</a></td><td></td></tr>
3479
+ <tr><td colspan="4" class="doc" id="isLeftFold0"><pre>Matches left-folding fold expressions.
3480
+
3481
+ Example matches `(0 + ... + args)`
3482
+ (matcher = cxxFoldExpr(isLeftFold()))
3483
+ template <typename... Args>
3484
+ auto sum(Args... args) {
3485
+ return (0 + ... + args);
3486
+ }
3487
+
3488
+ template <typename... Args>
3489
+ auto multiply(Args... args) {
3490
+ return (args * ... * 1);
3491
+ }
3492
+ </pre></td></tr>
3493
+
3494
+
3495
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('isRightFold0')"><a name="isRightFold0Anchor">isRightFold</a></td><td></td></tr>
3496
+ <tr><td colspan="4" class="doc" id="isRightFold0"><pre>Matches right-folding fold expressions.
3497
+
3498
+ Example matches `(args * ... * 1)`
3499
+ (matcher = cxxFoldExpr(isRightFold()))
3500
+ template <typename... Args>
3501
+ auto sum(Args... args) {
3502
+ return (0 + ... + args);
3503
+ }
3504
+
3505
+ template <typename... Args>
3506
+ auto multiply(Args... args) {
3507
+ return (args * ... * 1);
3508
+ }
3509
+ </pre></td></tr>
3510
+
3511
+
3512
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('isUnaryFold0')"><a name="isUnaryFold0Anchor">isUnaryFold</a></td><td></td></tr>
3513
+ <tr><td colspan="4" class="doc" id="isUnaryFold0"><pre>Matches unary fold expressions, i.e. fold expressions without an
3514
+ initializer.
3515
+
3516
+ Example matches `(args * ...)`
3517
+ (matcher = cxxFoldExpr(isUnaryFold()))
3518
+ template <typename... Args>
3519
+ auto sum(Args... args) {
3520
+ return (0 + ... + args);
3521
+ }
3522
+
3523
+ template <typename... Args>
3524
+ auto multiply(Args... args) {
3525
+ return (args * ...);
3526
+ }
3527
+ </pre></td></tr>
3528
+
3529
+
3433
3530
<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>
3434
3531
<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3435
3532
@@ -6885,6 +6982,93 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
6885
6982
</pre></td></tr>
6886
6983
6887
6984
6985
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</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_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6986
+ <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call or fold expression's callee expression matches.
6987
+
6988
+ Given
6989
+ class Y { void x() { this->x(); x(); Y y; y.x(); } };
6990
+ void f() { f(); }
6991
+ callExpr(callee(expr()))
6992
+ matches this->x(), x(), y.x(), f()
6993
+ with callee(...)
6994
+ matching this->x, x, y.x, f respectively
6995
+
6996
+ Given
6997
+ template <typename... Args>
6998
+ auto sum(Args... args) {
6999
+ return (0 + ... + args);
7000
+ }
7001
+
7002
+ template <typename... Args>
7003
+ auto multiply(Args... args) {
7004
+ return (args * ... * 1);
7005
+ }
7006
+ cxxFoldExpr(callee(expr()))
7007
+ matches (args * ... * 1)
7008
+ with callee(...)
7009
+ matching *
7010
+
7011
+ Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>
7012
+ because this introduces ambiguous overloads with calls to Callee taking a
7013
+ internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely
7014
+ implemented in terms of implicit casts.
7015
+ </pre></td></tr>
7016
+
7017
+
7018
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('hasFoldInit0')"><a name="hasFoldInit0Anchor">hasFoldInit</a></td><td>ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMacher</td></tr>
7019
+ <tr><td colspan="4" class="doc" id="hasFoldInit0"><pre>Matches the operand that does not contain the parameter pack.
7020
+
7021
+ Example matches `(0 + ... + args)` and `(args * ... * 1)`
7022
+ (matcher = cxxFoldExpr(hasFoldInit(expr())))
7023
+ with hasFoldInit(...)
7024
+ matching `0` and `1` respectively
7025
+ template <typename... Args>
7026
+ auto sum(Args... args) {
7027
+ return (0 + ... + args);
7028
+ }
7029
+
7030
+ template <typename... Args>
7031
+ auto multiply(Args... args) {
7032
+ return (args * ... * 1);
7033
+ }
7034
+ </pre></td></tr>
7035
+
7036
+
7037
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('hasLHS4')"><a name="hasLHS4Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7038
+ <tr><td colspan="4" class="doc" id="hasLHS4"><pre>Matches the left hand side of binary operator expressions.
7039
+
7040
+ Example matches a (matcher = binaryOperator(hasLHS()))
7041
+ a || b
7042
+ </pre></td></tr>
7043
+
7044
+
7045
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('hasPattern0')"><a name="hasPattern0Anchor">hasPattern</a></td><td>ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMacher</td></tr>
7046
+ <tr><td colspan="4" class="doc" id="hasPattern0"><pre>Matches the operand that contains the parameter pack.
7047
+
7048
+ Example matches `(0 + ... + args)`
7049
+ (matcher = cxxFoldExpr(hasPattern(expr())))
7050
+ with hasPattern(...)
7051
+ matching `args`
7052
+ template <typename... Args>
7053
+ auto sum(Args... args) {
7054
+ return (0 + ... + args);
7055
+ }
7056
+
7057
+ template <typename... Args>
7058
+ auto multiply(Args... args) {
7059
+ return (args * ... * 1);
7060
+ }
7061
+ </pre></td></tr>
7062
+
7063
+
7064
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>></td><td class="name" onclick="toggle('hasRHS4')"><a name="hasRHS4Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7065
+ <tr><td colspan="4" class="doc" id="hasRHS4"><pre>Matches the right hand side of binary operator expressions.
7066
+
7067
+ Example matches b (matcher = binaryOperator(hasRHS()))
7068
+ a || b
7069
+ </pre></td></tr>
7070
+
7071
+
6888
7072
<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>
6889
7073
<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
6890
7074
definition that has a given body. Note that in case of functions or
@@ -7436,8 +7620,8 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
7436
7620
</pre></td></tr>
7437
7621
7438
7622
7439
- <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee2 ')"><a name="callee2Anchor ">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7440
- <tr><td colspan="4" class="doc" id="callee2 "><pre>Matches 1) if the call expression's callee's declaration matches the
7623
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee3 ')"><a name="callee3Anchor ">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7624
+ <tr><td colspan="4" class="doc" id="callee3 "><pre>Matches 1) if the call expression's callee's declaration matches the
7441
7625
given matcher; or 2) if the Obj-C message expression's callee's method
7442
7626
declaration matches the given matcher.
7443
7627
@@ -7458,7 +7642,7 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
7458
7642
7459
7643
7460
7644
<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>
7461
- <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7645
+ <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call or fold expression's callee expression matches.
7462
7646
7463
7647
Given
7464
7648
class Y { void x() { this->x(); x(); Y y; y.x(); } };
@@ -7468,6 +7652,21 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
7468
7652
with callee(...)
7469
7653
matching this->x, x, y.x, f respectively
7470
7654
7655
+ Given
7656
+ template <typename... Args>
7657
+ auto sum(Args... args) {
7658
+ return (0 + ... + args);
7659
+ }
7660
+
7661
+ template <typename... Args>
7662
+ auto multiply(Args... args) {
7663
+ return (args * ... * 1);
7664
+ }
7665
+ cxxFoldExpr(callee(expr()))
7666
+ matches (args * ... * 1)
7667
+ with callee(...)
7668
+ matching *
7669
+
7471
7670
Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>
7472
7671
because this introduces ambiguous overloads with calls to Callee taking a
7473
7672
internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely
@@ -9087,8 +9286,8 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
9087
9286
</pre></td></tr>
9088
9287
9089
9288
9090
- <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</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>
9091
- <tr><td colspan="4" class="doc" id="callee1 "><pre>Matches 1) if the call expression's callee's declaration matches the
9289
+ <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('callee2 ')"><a name="callee2Anchor ">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
9290
+ <tr><td colspan="4" class="doc" id="callee2 "><pre>Matches 1) if the call expression's callee's declaration matches the
9092
9291
given matcher; or 2) if the Obj-C message expression's callee's method
9093
9292
declaration matches the given matcher.
9094
9293
0 commit comments