|
@@ -17,14 +17,22 @@ namespace {
|
|
class InitListExprPreOrderVisitor
|
|
class InitListExprPreOrderVisitor
|
|
: public ExpectedLocationVisitor<InitListExprPreOrderVisitor> {
|
|
: public ExpectedLocationVisitor<InitListExprPreOrderVisitor> {
|
|
public:
|
|
public:
|
|
|
|
+ InitListExprPreOrderVisitor(bool VisitImplicitCode)
|
|
|
|
+ : VisitImplicitCode(VisitImplicitCode) {}
|
|
|
|
+
|
|
|
|
+ bool shouldVisitImplicitCode() const { return VisitImplicitCode; }
|
|
|
|
+
|
|
bool VisitInitListExpr(InitListExpr *ILE) {
|
|
bool VisitInitListExpr(InitListExpr *ILE) {
|
|
Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getBeginLoc());
|
|
Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getBeginLoc());
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+private:
|
|
|
|
+ bool VisitImplicitCode;
|
|
};
|
|
};
|
|
|
|
|
|
TEST(RecursiveASTVisitor, InitListExprIsPreOrderVisitedTwice) {
|
|
TEST(RecursiveASTVisitor, InitListExprIsPreOrderVisitedTwice) {
|
|
- InitListExprPreOrderVisitor Visitor;
|
|
|
|
|
|
+ InitListExprPreOrderVisitor Visitor(/*VisitImplicitCode=*/true);
|
|
Visitor.ExpectMatch("syntactic", 2, 21);
|
|
Visitor.ExpectMatch("syntactic", 2, 21);
|
|
Visitor.ExpectMatch("semantic", 2, 21);
|
|
Visitor.ExpectMatch("semantic", 2, 21);
|
|
EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n"
|
|
EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n"
|
|
@@ -32,4 +40,13 @@ TEST(RecursiveASTVisitor, InitListExprIsPreOrderVisitedTwice) {
|
|
InitListExprPreOrderVisitor::Lang_C));
|
|
InitListExprPreOrderVisitor::Lang_C));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+TEST(RecursiveASTVisitor, InitListExprVisitedOnceWhenNoImplicit) {
|
|
|
|
+ InitListExprPreOrderVisitor Visitor(/*VisitImplicitCode=*/false);
|
|
|
|
+ Visitor.ExpectMatch("syntactic", 2, 21);
|
|
|
|
+ Visitor.DisallowMatch("semantic", 2, 21);
|
|
|
|
+ EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n"
|
|
|
|
+ "static struct S s = {.x = 0};\n",
|
|
|
|
+ InitListExprPreOrderVisitor::Lang_C));
|
|
|
|
+}
|
|
|
|
+
|
|
} // end anonymous namespace
|
|
} // end anonymous namespace
|