diff options
Diffstat (limited to 'unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp')
-rw-r--r-- | unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index 1e7b10e99e713..fb17d100c518a 100644 --- a/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -667,6 +667,14 @@ TEST(Matcher, VarDecl_Storage) { EXPECT_TRUE(matches("void f() { static int X; }", M)); } +TEST(Matcher, VarDecl_IsStaticLocal) { + auto M = varDecl(isStaticLocal()); + EXPECT_TRUE(matches("void f() { static int X; }", M)); + EXPECT_TRUE(notMatches("static int X;", M)); + EXPECT_TRUE(notMatches("void f() { int X; }", M)); + EXPECT_TRUE(notMatches("int X;", M)); +} + TEST(Matcher, VarDecl_StorageDuration) { std::string T = "void f() { int x; static int y; } int a;static int b;extern int c;"; @@ -765,6 +773,11 @@ TEST(IsArrow, MatchesMemberVariablesViaArrow) { memberExpr(isArrow()))); EXPECT_TRUE(notMatches("class Y { void x() { (*this).y; } int y; };", memberExpr(isArrow()))); + EXPECT_TRUE(matches("template <class T> class Y { void x() { this->m; } };", + cxxDependentScopeMemberExpr(isArrow()))); + EXPECT_TRUE( + notMatches("template <class T> class Y { void x() { (*this).m; } };", + cxxDependentScopeMemberExpr(isArrow()))); } TEST(IsArrow, MatchesStaticMemberVariablesViaArrow) { @@ -783,6 +796,14 @@ TEST(IsArrow, MatchesMemberCallsViaArrow) { memberExpr(isArrow()))); EXPECT_TRUE(notMatches("class Y { void x() { Y y; y.x(); } };", memberExpr(isArrow()))); + EXPECT_TRUE( + matches("class Y { template <class T> void x() { this->x<T>(); } };", + unresolvedMemberExpr(isArrow()))); + EXPECT_TRUE(matches("class Y { template <class T> void x() { x<T>(); } };", + unresolvedMemberExpr(isArrow()))); + EXPECT_TRUE( + notMatches("class Y { template <class T> void x() { (*this).x<T>(); } };", + unresolvedMemberExpr(isArrow()))); } TEST(ConversionDeclaration, IsExplicit) { @@ -1365,6 +1386,10 @@ TEST(ObjCIvarRefExprMatcher, IvarExpr) { hasDeclaration(namedDecl(hasName("y")))))); } +TEST(BlockExprMatcher, BlockExpr) { + EXPECT_TRUE(matchesObjC("void f() { ^{}(); }", blockExpr())); +} + TEST(StatementCountIs, FindsNoStatementsInAnEmptyCompoundStatement) { EXPECT_TRUE(matches("void f() { }", compoundStmt(statementCountIs(0)))); @@ -1517,6 +1542,26 @@ TEST(HasObjectExpression, MatchesBaseOfVariable) { "struct X { int m; }; void f(X* x) { x->m; }", memberExpr(hasObjectExpression( hasType(pointsTo(recordDecl(hasName("X")))))))); + EXPECT_TRUE(matches("template <class T> struct X { void f() { T t; t.m; } };", + cxxDependentScopeMemberExpr(hasObjectExpression( + declRefExpr(to(namedDecl(hasName("t")))))))); + EXPECT_TRUE( + matches("template <class T> struct X { void f() { T t; t->m; } };", + cxxDependentScopeMemberExpr(hasObjectExpression( + declRefExpr(to(namedDecl(hasName("t")))))))); +} + +TEST(HasObjectExpression, MatchesBaseOfMemberFunc) { + EXPECT_TRUE(matches( + "struct X { void f(); }; void g(X x) { x.f(); }", + memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X"))))))); + EXPECT_TRUE(matches("struct X { template <class T> void f(); };" + "template <class T> void g(X x) { x.f<T>(); }", + unresolvedMemberExpr(hasObjectExpression( + hasType(recordDecl(hasName("X"))))))); + EXPECT_TRUE(matches("template <class T> void f(T t) { t.g(); }", + cxxDependentScopeMemberExpr(hasObjectExpression( + declRefExpr(to(namedDecl(hasName("t")))))))); } TEST(HasObjectExpression, @@ -1748,6 +1793,48 @@ TEST(IsInTemplateInstantiation, Sharing) { Matcher)); } +TEST(IsInstantiationDependent, MatchesNonValueTypeDependent) { + EXPECT_TRUE(matches( + "template<typename T> void f() { (void) sizeof(sizeof(T() + T())); }", + expr(isInstantiationDependent()))); +} + +TEST(IsInstantiationDependent, MatchesValueDependent) { + EXPECT_TRUE(matches("template<int T> int f() { return T; }", + expr(isInstantiationDependent()))); +} + +TEST(IsInstantiationDependent, MatchesTypeDependent) { + EXPECT_TRUE(matches("template<typename T> T f() { return T(); }", + expr(isInstantiationDependent()))); +} + +TEST(IsTypeDependent, MatchesTypeDependent) { + EXPECT_TRUE(matches("template<typename T> T f() { return T(); }", + expr(isTypeDependent()))); +} + +TEST(IsTypeDependent, NotMatchesValueDependent) { + EXPECT_TRUE(notMatches("template<int T> int f() { return T; }", + expr(isTypeDependent()))); +} + +TEST(IsValueDependent, MatchesValueDependent) { + EXPECT_TRUE(matches("template<int T> int f() { return T; }", + expr(isValueDependent()))); +} + +TEST(IsValueDependent, MatchesTypeDependent) { + EXPECT_TRUE(matches("template<typename T> T f() { return T(); }", + expr(isValueDependent()))); +} + +TEST(IsValueDependent, MatchesInstantiationDependent) { + EXPECT_TRUE(matches( + "template<typename T> void f() { (void) sizeof(sizeof(T() + T())); }", + expr(isValueDependent()))); +} + TEST(IsExplicitTemplateSpecialization, DoesNotMatchPrimaryTemplate) { EXPECT_TRUE(notMatches( @@ -2168,6 +2255,18 @@ TEST(IsAssignmentOperator, Basic) { notMatches("void x() { int a; if(a == 0) return; }", BinAsgmtOperator)); } +TEST(HasInit, Basic) { + EXPECT_TRUE( + matches("int x{0};", + initListExpr(hasInit(0, expr())))); + EXPECT_FALSE( + matches("int x{0};", + initListExpr(hasInit(1, expr())))); + EXPECT_FALSE( + matches("int x;", + initListExpr(hasInit(0, expr())))); +} + TEST(Matcher, isMain) { EXPECT_TRUE( matches("int main() {}", functionDecl(isMain()))); |