diff options
author | Alexander Kornienko <alexfh@google.com> | 2016-03-22 11:03:03 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2016-03-22 11:03:03 +0000 |
commit | 976921d4b4911394fe0e88b047a01dad5e85c701 (patch) | |
tree | 4f6f70f1ef97ebc95a5d338b92331bc6c75d65bd | |
parent | e5c095923dddb949f15f13645d69dc3c3d2342e7 (diff) | |
download | bcm5719-llvm-976921d4b4911394fe0e88b047a01dad5e85c701.tar.gz bcm5719-llvm-976921d4b4911394fe0e88b047a01dad5e85c701.zip |
[ASTMatchers] New matcher hasReturnValue added
Summary: A checker (will be uploaded after this patch) needs to check implicit casts. Existing generic matcher "has" ignores implicit casts and parenthesized expressions and no specific matcher for matching return value expression preexisted. The patch adds such a matcher (hasReturnValue).
Reviewers: klimek, sbenza
Subscribers: xazax.hun, klimek, cfe-commits
Patch by Ádám Balogh!
Differential Revision: http://reviews.llvm.org/D17986
llvm-svn: 264037
-rw-r--r-- | clang/docs/LibASTMatchersReference.html | 12 | ||||
-rw-r--r-- | clang/include/clang/ASTMatchers/ASTMatchers.h | 16 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Registry.cpp | 1 | ||||
-rw-r--r-- | clang/unittests/ASTMatchers/ASTMatchersTest.cpp | 6 |
4 files changed, 35 insertions, 0 deletions
diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index ba3fa51b87b..58ab6d12850 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -4854,6 +4854,18 @@ Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Block </pre></td></tr> +<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> +<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement + +Given + return a + b; +hasReturnValue(binaryOperator()) + matches 'return a + b' +with binaryOperator() + matching 'a + b' +</pre></td></tr> + + <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches a given matcher. Also matches StmtExprs that have CompoundStmt as children. diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index e428d8c3957..6835ea0871b 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -5008,6 +5008,22 @@ AST_MATCHER_P(Decl, hasAttr, attr::Kind, AttrKind) { return false; } +/// \brief Matches the return value expression of a return statement +/// +/// Given +/// \code +/// return a + b; +/// \endcode +/// hasReturnValue(binaryOperator()) +/// matches 'return a + b' +/// with binaryOperator() +/// matching 'a + b' +AST_MATCHER_P(ReturnStmt, hasReturnValue, internal::Matcher<Expr>, + InnerMatcher) { + return InnerMatcher.matches(*Node.getRetValue(), Finder, Builder); +} + + /// \brief Matches CUDA kernel call expression. /// /// Example matches, diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 0a8e820d03d..9bf57851ade 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -243,6 +243,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasQualifier); REGISTER_MATCHER(hasRangeInit); REGISTER_MATCHER(hasReceiverType); + REGISTER_MATCHER(hasReturnValue); REGISTER_MATCHER(hasRHS); REGISTER_MATCHER(hasSelector); REGISTER_MATCHER(hasSingleDecl); diff --git a/clang/unittests/ASTMatchers/ASTMatchersTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTest.cpp index 63dc1a8b649..713ef5a84fe 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersTest.cpp @@ -5488,5 +5488,11 @@ TEST(NullPointerConstants, Basic) { EXPECT_TRUE(notMatches("int i = 0;", expr(nullPointerConstant()))); } +TEST(StatementMatcher, HasReturnValue) { + StatementMatcher RetVal = returnStmt(hasReturnValue(binaryOperator())); + EXPECT_TRUE(matches("int F() { int a, b; return a + b; }", RetVal)); + EXPECT_FALSE(matches("int F() { int a; return a; }", RetVal)); +} + } // end namespace ast_matchers } // end namespace clang |