[PATCH] D76196: [ASTMatchers] Extend hasReturnValue to GNU StmtExpr
Nathan James via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 16 08:42:14 PDT 2020
njames93 updated this revision to Diff 250569.
njames93 added a comment.
- Rename matcher to hasFinalExpr
- Don't review it yet
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76196/new/
https://reviews.llvm.org/D76196
Files:
clang/docs/LibASTMatchersReference.html
clang/include/clang/ASTMatchers/ASTMatchers.h
clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===================================================================
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -3006,6 +3006,13 @@
EXPECT_FALSE(matches("void F() { return; }", RetVal));
}
+TEST(StatementMatcher, hasFinalExpr) {
+ StatementMatcher RetVal = stmtExpr(hasFinalExpr(binaryOperator()));
+ EXPECT_TRUE(matches("void F() { ({int a, b; a + b;}); }", RetVal));
+ EXPECT_FALSE(matches("void F() { ({int a; a;}); }", RetVal));
+ EXPECT_FALSE(matches("void F() { ({int a;}); }", RetVal));
+}
+
TEST(StatementMatcher, ForFunction) {
const auto CppString1 =
"struct PosVec {"
Index: clang/include/clang/ASTMatchers/ASTMatchers.h
===================================================================
--- clang/include/clang/ASTMatchers/ASTMatchers.h
+++ clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -6729,6 +6729,24 @@
return false;
}
+/// Matches the result value expression of a GNU statement expression.
+///
+/// Given
+/// \code
+/// ({int *Ptr; *Ptr;});
+/// \endcode
+/// hasFinalExpr(unaryOperator())
+/// matches '({int *Ptr; *Ptr;})'
+/// with unaryOperator()
+/// matching '*Ptr'
+AST_MATCHER_P(StmtExpr, hasFinalExpr, internal::Matcher<Expr>, InnerMatcher) {
+ if (const CompoundStmt *CS = Node.getSubStmt()) {
+ if (const auto *E = dyn_cast_or_null<Expr>(CS->body_back()))
+ return InnerMatcher.matches(*E, Finder, Builder);
+ }
+ return false;
+}
+
/// Matches CUDA kernel call expression.
///
/// Example matches,
Index: clang/docs/LibASTMatchersReference.html
===================================================================
--- clang/docs/LibASTMatchersReference.html
+++ clang/docs/LibASTMatchersReference.html
@@ -7188,6 +7188,18 @@
</pre></td></tr>
+<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasFinalExpr0')"><a name="hasFinalExpr0Anchor">hasFinalExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasFinalExpr0"><pre>Matches the result value expression of a GNU statement expression.
+
+Given
+ ({int *Ptr; *Ptr;});
+hasFinalExpr(unaryOperator())
+ matches '({int *Ptr; *Ptr;})'
+with unaryOperator()
+ matching '*Ptr'
+</pre></td></tr>
+
+
<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>
<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
alignof.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76196.250569.patch
Type: text/x-patch
Size: 2959 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200316/030c63a3/attachment.bin>
More information about the cfe-commits
mailing list