forked from OSchip/llvm-project
Introduces the 'decl' matcher which was missing for a while
and became necessary with the change to require BindableMatchers for binding. Also fixes PR 13445: "hasSourceExpression only works for implicit casts". llvm-svn: 160716
This commit is contained in:
parent
e1efe31948
commit
e923569b1b
|
@ -130,6 +130,17 @@ inline internal::PolymorphicMatcherWithParam0<internal::TrueMatcher> anything()
|
|||
return internal::PolymorphicMatcherWithParam0<internal::TrueMatcher>();
|
||||
}
|
||||
|
||||
/// \brief Matches declarations.
|
||||
///
|
||||
/// Examples matches \c X, \c C, and the friend declaration inside \c C;
|
||||
/// \code
|
||||
/// void X();
|
||||
/// class C {
|
||||
/// friend X;
|
||||
/// };
|
||||
/// \endcode
|
||||
const internal::VariadicDynCastAllOfMatcher<Decl, Decl> decl;
|
||||
|
||||
/// \brief Matches a declaration of anything that could have a name.
|
||||
///
|
||||
/// Example matches X, S, the anonymous union type, i, and U;
|
||||
|
@ -1549,15 +1560,14 @@ AST_MATCHER_P(UnaryOperator, hasUnaryOperand,
|
|||
InnerMatcher.matches(*Operand, Finder, Builder));
|
||||
}
|
||||
|
||||
/// \brief Matches if the implicit cast's source expression matches the given
|
||||
/// matcher.
|
||||
/// \brief Matches if the cast's source expression matches the given matcher.
|
||||
///
|
||||
/// Example: matches "a string" (matcher =
|
||||
/// hasSourceExpression(constructorCall()))
|
||||
///
|
||||
/// class URL { URL(string); };
|
||||
/// URL url = "a string";
|
||||
AST_MATCHER_P(ImplicitCastExpr, hasSourceExpression,
|
||||
AST_MATCHER_P(CastExpr, hasSourceExpression,
|
||||
internal::Matcher<Expr>, InnerMatcher) {
|
||||
const Expr* const SubExpression = Node.getSubExpr();
|
||||
return (SubExpression != NULL &&
|
||||
|
|
|
@ -39,6 +39,12 @@ TEST(IsDerivedFromDeathTest, DiesOnEmptyBaseName) {
|
|||
}
|
||||
#endif
|
||||
|
||||
TEST(Decl, MatchesDeclarations) {
|
||||
EXPECT_TRUE(notMatches("", decl(usingDecl())));
|
||||
EXPECT_TRUE(matches("namespace x { class X {}; } using x::X;",
|
||||
decl(usingDecl())));
|
||||
}
|
||||
|
||||
TEST(NameableDeclaration, MatchesVariousDecls) {
|
||||
DeclarationMatcher NamedX = nameableDeclaration(hasName("X"));
|
||||
EXPECT_TRUE(matches("typedef int X;", NamedX));
|
||||
|
@ -2037,13 +2043,20 @@ TEST(HasDestinationType, MatchesSimpleCase) {
|
|||
pointsTo(TypeMatcher(anything())))))));
|
||||
}
|
||||
|
||||
TEST(HasSourceExpression, MatchesSimpleCase) {
|
||||
TEST(HasSourceExpression, MatchesImplicitCasts) {
|
||||
EXPECT_TRUE(matches("class string {}; class URL { public: URL(string s); };"
|
||||
"void r() {string a_string; URL url = a_string; }",
|
||||
expression(implicitCast(
|
||||
hasSourceExpression(constructorCall())))));
|
||||
}
|
||||
|
||||
TEST(HasSourceExpression, MatchesExplicitCasts) {
|
||||
EXPECT_TRUE(matches("float x = static_cast<float>(42);",
|
||||
expression(explicitCast(
|
||||
hasSourceExpression(hasDescendant(
|
||||
expression(integerLiteral())))))));
|
||||
}
|
||||
|
||||
TEST(Statement, DoesNotMatchDeclarations) {
|
||||
EXPECT_TRUE(notMatches("class X {};", statement()));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue