Skip to content

Commit

Permalink
[ASTMatchers] overload ignoringParens for Expr
Browse files Browse the repository at this point in the history
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

llvm-svn: 346554
  • Loading branch information
JonasToth committed Nov 9, 2018
1 parent a105097 commit 295aa09
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 3 deletions.
11 changes: 11 additions & 0 deletions clang/docs/LibASTMatchersReference.html
Expand Up @@ -5552,6 +5552,17 @@ <h2 id="traversal-matchers">AST Traversal Matchers</h2>
</pre></td></tr>


<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; 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&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.

Expand Down
21 changes: 19 additions & 2 deletions clang/include/clang/ASTMatchers/ASTMatchers.h
Expand Up @@ -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.
///
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/ASTMatchers/Dynamic/Registry.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
Expand Up @@ -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")));
}
Expand Down

0 comments on commit 295aa09

Please sign in to comment.