diff options
author | Jonas Toth <jonas.toth@gmail.com> | 2018-11-09 20:54:06 +0000 |
---|---|---|
committer | Jonas Toth <jonas.toth@gmail.com> | 2018-11-09 20:54:06 +0000 |
commit | 1597f1061641dcf29310c519c0236ac97df90995 (patch) | |
tree | 24d7c14f51acaea18d2841a1d8c0f56a14c98c82 | |
parent | a0fa523c073426d74b700f6c0ab46d62c130a8b6 (diff) |
[ASTMatchers] overload ignoringParens for Expr
Summary: This patch allows fixing PR39583.
Reviewers: aaron.ballman, sbenza, klimek
Reviewed By: aaron.ballman
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D54307
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@346554 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | docs/LibASTMatchersReference.html | 11 | ||||
-rw-r--r-- | include/clang/ASTMatchers/ASTMatchers.h | 21 | ||||
-rw-r--r-- | lib/ASTMatchers/Dynamic/Registry.cpp | 2 | ||||
-rw-r--r-- | unittests/ASTMatchers/ASTMatchersNodeTest.cpp | 8 |
4 files changed, 39 insertions, 3 deletions
diff --git a/docs/LibASTMatchersReference.html b/docs/LibASTMatchersReference.html index 7db62edfa4..4ba2b62335 100644 --- a/docs/LibASTMatchersReference.html +++ b/docs/LibASTMatchersReference.html @@ -5552,6 +5552,17 @@ would only match the declaration for a. </pre></td></tr> +<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> +<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. + +Given + const char* str = ("my-string"); +The matcher + implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) +would match the implicit cast resulting from the assignment. +</pre></td></tr> + + <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> <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. diff --git a/include/clang/ASTMatchers/ASTMatchers.h b/include/clang/ASTMatchers/ASTMatchers.h index 7a52ec50db..f42ac5b701 100644 --- a/include/clang/ASTMatchers/ASTMatchers.h +++ b/include/clang/ASTMatchers/ASTMatchers.h @@ -811,11 +811,28 @@ AST_MATCHER_P(Expr, ignoringParenImpCasts, /// varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) /// \endcode /// would match the declaration for fp. -AST_MATCHER_P(QualType, ignoringParens, - internal::Matcher<QualType>, InnerMatcher) { +AST_MATCHER_P_OVERLOAD(QualType, ignoringParens, internal::Matcher<QualType>, + InnerMatcher, 0) { return InnerMatcher.matches(Node.IgnoreParens(), Finder, Builder); } +/// Overload \c ignoringParens for \c Expr. +/// +/// Given +/// \code +/// const char* str = ("my-string"); +/// \endcode +/// The matcher +/// \code +/// implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) +/// \endcode +/// would match the implicit cast resulting from the assignment. +AST_MATCHER_P_OVERLOAD(Expr, ignoringParens, internal::Matcher<Expr>, + InnerMatcher, 1) { + const Expr *E = Node.IgnoreParens(); + return InnerMatcher.matches(*E, Finder, Builder); +} + /// Matches expressions that are instantiation-dependent even if it is /// neither type- nor value-dependent. /// diff --git a/lib/ASTMatchers/Dynamic/Registry.cpp b/lib/ASTMatchers/Dynamic/Registry.cpp index 7493389fbd..3ed189a524 100644 --- a/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/lib/ASTMatchers/Dynamic/Registry.cpp @@ -106,6 +106,7 @@ RegistryMaps::RegistryMaps() { REGISTER_OVERLOADED_2(callee); REGISTER_OVERLOADED_2(hasPrefix); REGISTER_OVERLOADED_2(hasType); + REGISTER_OVERLOADED_2(ignoringParens); REGISTER_OVERLOADED_2(isDerivedFrom); REGISTER_OVERLOADED_2(isSameOrDerivedFrom); REGISTER_OVERLOADED_2(loc); @@ -318,7 +319,6 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(ignoringImplicit); REGISTER_MATCHER(ignoringParenCasts); REGISTER_MATCHER(ignoringParenImpCasts); - REGISTER_MATCHER(ignoringParens); REGISTER_MATCHER(imaginaryLiteral); REGISTER_MATCHER(implicitCastExpr); REGISTER_MATCHER(implicitValueInitExpr); diff --git a/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/unittests/ASTMatchers/ASTMatchersNodeTest.cpp index 55f9a9ab69..9278987cb0 100644 --- a/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1147,6 +1147,14 @@ TEST(ParenExpression, SimpleCases) { parenExpr())); } +TEST(ParenExpression, IgnoringParens) { + EXPECT_FALSE(matches("const char* str = (\"my-string\");", + implicitCastExpr(hasSourceExpression(stringLiteral())))); + EXPECT_TRUE(matches( + "const char* str = (\"my-string\");", + implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))))); +} + TEST(TypeMatching, MatchesTypes) { EXPECT_TRUE(matches("struct S {};", qualType().bind("loc"))); } |