Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -5552,6 +5552,17 @@ +
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. +
Matches non-static data members that have an in-class initializer. Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -811,11 +811,28 @@ /// varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) /// \endcode /// would match the declaration for fp. -AST_MATCHER_P(QualType, ignoringParens, - internal::Matcher, InnerMatcher) { +AST_MATCHER_P_OVERLOAD(QualType, ignoringParens, internal::Matcher , + 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 , + 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. /// Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -106,6 +106,7 @@ 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 @@ REGISTER_MATCHER(ignoringImplicit); REGISTER_MATCHER(ignoringParenCasts); REGISTER_MATCHER(ignoringParenImpCasts); - REGISTER_MATCHER(ignoringParens); REGISTER_MATCHER(imaginaryLiteral); REGISTER_MATCHER(implicitCastExpr); REGISTER_MATCHER(implicitValueInitExpr); Index: unittests/ASTMatchers/ASTMatchersNodeTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1147,6 +1147,14 @@ 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"))); }