Skip to content

Commit ae352f2

Browse files
committed
[clang][ASTMatcher] Add matchers for CXXFoldExpr
1 parent 888742a commit ae352f2

File tree

9 files changed

+594
-42
lines changed

9 files changed

+594
-42
lines changed

clang/docs/LibASTMatchersReference.html

Lines changed: 204 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1629,6 +1629,17 @@ <h2 id="decl-matchers">Node Matchers</h2>
16291629
</pre></td></tr>
16301630

16311631

1632+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFoldExpr0')"><a name="cxxFoldExpr0Anchor">cxxFoldExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;...</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 &lt;typename... Args&gt;
1637+
auto sum(Args... args) {
1638+
return (0 + ... + args);
1639+
}
1640+
</pre></td></tr>
1641+
1642+
16321643
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
16331644
<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
16341645

@@ -3430,6 +3441,92 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
34303441
</pre></td></tr>
34313442

34323443

3444+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</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 &lt;typename... Args&gt;
3450+
auto sum(Args... args) {
3451+
return (0 + ... + args);
3452+
}
3453+
3454+
template &lt;typename... Args&gt;
3455+
auto multiply(Args... args) {
3456+
return (args * ... * 1);
3457+
}
3458+
</pre></td></tr>
3459+
3460+
3461+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</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 &lt;typename... Args&gt;
3467+
auto sum(Args... args) {
3468+
return (0 + ... + args);
3469+
}
3470+
3471+
template &lt;typename... Args&gt;
3472+
auto multiply(Args... args) {
3473+
return (args * ...);
3474+
}
3475+
</pre></td></tr>
3476+
3477+
3478+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</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 &lt;typename... Args&gt;
3484+
auto sum(Args... args) {
3485+
return (0 + ... + args);
3486+
}
3487+
3488+
template &lt;typename... Args&gt;
3489+
auto multiply(Args... args) {
3490+
return (args * ... * 1);
3491+
}
3492+
</pre></td></tr>
3493+
3494+
3495+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</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 &lt;typename... Args&gt;
3501+
auto sum(Args... args) {
3502+
return (0 + ... + args);
3503+
}
3504+
3505+
template &lt;typename... Args&gt;
3506+
auto multiply(Args... args) {
3507+
return (args * ... * 1);
3508+
}
3509+
</pre></td></tr>
3510+
3511+
3512+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</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 &lt;typename... Args&gt;
3519+
auto sum(Args... args) {
3520+
return (0 + ... + args);
3521+
}
3522+
3523+
template &lt;typename... Args&gt;
3524+
auto multiply(Args... args) {
3525+
return (args * ...);
3526+
}
3527+
</pre></td></tr>
3528+
3529+
34333530
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
34343531
<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
34353532

@@ -6885,6 +6982,93 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
68856982
</pre></td></tr>
68866983

68876984

6985+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; 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-&gt;x(); x(); Y y; y.x(); } };
6990+
void f() { f(); }
6991+
callExpr(callee(expr()))
6992+
matches this-&gt;x(), x(), y.x(), f()
6993+
with callee(...)
6994+
matching this-&gt;x, x, y.x, f respectively
6995+
6996+
Given
6997+
template &lt;typename... Args&gt;
6998+
auto sum(Args... args) {
6999+
return (0 + ... + args);
7000+
}
7001+
7002+
template &lt;typename... Args&gt;
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&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7012+
because this introduces ambiguous overloads with calls to Callee taking a
7013+
internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7014+
implemented in terms of implicit casts.
7015+
</pre></td></tr>
7016+
7017+
7018+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</td><td class="name" onclick="toggle('hasFoldInit0')"><a name="hasFoldInit0Anchor">hasFoldInit</a></td><td>ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; 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 &lt;typename... Args&gt;
7026+
auto sum(Args... args) {
7027+
return (0 + ... + args);
7028+
}
7029+
7030+
template &lt;typename... Args&gt;
7031+
auto multiply(Args... args) {
7032+
return (args * ... * 1);
7033+
}
7034+
</pre></td></tr>
7035+
7036+
7037+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS4')"><a name="hasLHS4Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; 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&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</td><td class="name" onclick="toggle('hasPattern0')"><a name="hasPattern0Anchor">hasPattern</a></td><td>ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; 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 &lt;typename... Args&gt;
7053+
auto sum(Args... args) {
7054+
return (0 + ... + args);
7055+
}
7056+
7057+
template &lt;typename... Args&gt;
7058+
auto multiply(Args... args) {
7059+
return (args * ... * 1);
7060+
}
7061+
</pre></td></tr>
7062+
7063+
7064+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS4')"><a name="hasRHS4Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; 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+
68887072
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
68897073
<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
68907074
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>
74367620
</pre></td></tr>
74377621

74387622

7439-
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee2')"><a name="callee2Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; 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&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee3')"><a name="callee3Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; 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
74417625
given matcher; or 2) if the Obj-C message expression's callee's method
74427626
declaration matches the given matcher.
74437627

@@ -7458,7 +7642,7 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
74587642

74597643

74607644
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; 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.
74627646

74637647
Given
74647648
class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
@@ -7468,6 +7652,21 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
74687652
with callee(...)
74697653
matching this-&gt;x, x, y.x, f respectively
74707654

7655+
Given
7656+
template &lt;typename... Args&gt;
7657+
auto sum(Args... args) {
7658+
return (0 + ... + args);
7659+
}
7660+
7661+
template &lt;typename... Args&gt;
7662+
auto multiply(Args... args) {
7663+
return (args * ... * 1);
7664+
}
7665+
cxxFoldExpr(callee(expr()))
7666+
matches (args * ... * 1)
7667+
with callee(...)
7668+
matching *
7669+
74717670
Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
74727671
because this introduces ambiguous overloads with calls to Callee taking a
74737672
internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
@@ -9087,8 +9286,8 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
90879286
</pre></td></tr>
90889287

90899288

9090-
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; 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&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('callee2')"><a name="callee2Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; 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
90929291
given matcher; or 2) if the Obj-C message expression's callee's method
90939292
declaration matches the given matcher.
90949293

clang/docs/ReleaseNotes.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,9 @@ AST Matchers
830830
- Add ``convertVectorExpr``.
831831
- Add ``dependentSizedExtVectorType``.
832832
- Add ``macroQualifiedType``.
833+
- Add ``CXXFoldExpr`` related matchers: ``cxxFoldExpr``, ``callee``,
834+
``hasInit``, ``hasPattern``, ``isRightFold``, ``isLeftFold``,
835+
``isUnaryFold``, ``isBinaryFold``, ``hasOperator``, ``hasLHS``, ``hasRHS``.
833836

834837
clang-format
835838
------------

0 commit comments

Comments
 (0)