1 | //===- unittest/Tooling/RecursiveASTVisitorTests/InitListExprPreOrder.cpp -===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "TestVisitor.h" |
10 | |
11 | using namespace clang; |
12 | |
13 | namespace { |
14 | |
15 | // Check to ensure that InitListExpr is visited twice, once each for the |
16 | // syntactic and semantic form. |
17 | class InitListExprPreOrderVisitor : public ExpectedLocationVisitor { |
18 | public: |
19 | InitListExprPreOrderVisitor(bool VisitImplicitCode) { |
20 | ShouldVisitImplicitCode = VisitImplicitCode; |
21 | } |
22 | |
23 | bool VisitInitListExpr(InitListExpr *ILE) override { |
24 | Match(ILE->isSemanticForm() ? "semantic" : "syntactic" , ILE->getBeginLoc()); |
25 | return true; |
26 | } |
27 | }; |
28 | |
29 | TEST(RecursiveASTVisitor, InitListExprIsPreOrderVisitedTwice) { |
30 | InitListExprPreOrderVisitor Visitor(/*VisitImplicitCode=*/true); |
31 | Visitor.ExpectMatch("syntactic" , 2, 21); |
32 | Visitor.ExpectMatch("semantic" , 2, 21); |
33 | EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n" |
34 | "static struct S s = {.x = 0};\n" , |
35 | InitListExprPreOrderVisitor::Lang_C)); |
36 | } |
37 | |
38 | TEST(RecursiveASTVisitor, InitListExprVisitedOnceWhenNoImplicit) { |
39 | InitListExprPreOrderVisitor Visitor(/*VisitImplicitCode=*/false); |
40 | Visitor.ExpectMatch("syntactic" , 2, 21); |
41 | Visitor.DisallowMatch("semantic" , 2, 21); |
42 | EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n" |
43 | "static struct S s = {.x = 0};\n" , |
44 | InitListExprPreOrderVisitor::Lang_C)); |
45 | } |
46 | |
47 | } // end anonymous namespace |
48 | |