1d17437d2SEduardo Caldas //===- BuildTreeTest.cpp --------------------------------------------------===//
2d17437d2SEduardo Caldas //
3d17437d2SEduardo Caldas // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d17437d2SEduardo Caldas // See https://llvm.org/LICENSE.txt for license information.
5d17437d2SEduardo Caldas // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d17437d2SEduardo Caldas //
7d17437d2SEduardo Caldas //===----------------------------------------------------------------------===//
8d17437d2SEduardo Caldas //
9d17437d2SEduardo Caldas // This file tests the syntax tree generation from the ClangAST.
10d17437d2SEduardo Caldas //
11d17437d2SEduardo Caldas //===----------------------------------------------------------------------===//
12d17437d2SEduardo Caldas 
13d17437d2SEduardo Caldas #include "TreeTestBase.h"
14d17437d2SEduardo Caldas 
152e4a20fdSEduardo Caldas using namespace clang;
162e4a20fdSEduardo Caldas using namespace clang::syntax;
172e4a20fdSEduardo Caldas 
18d17437d2SEduardo Caldas namespace {
19d17437d2SEduardo Caldas 
20c01d28dcSEduardo Caldas class BuildSyntaxTreeTest : public SyntaxTreeTest {
21c01d28dcSEduardo Caldas protected:
treeDumpEqual(StringRef Code,StringRef Tree)22c01d28dcSEduardo Caldas   ::testing::AssertionResult treeDumpEqual(StringRef Code, StringRef Tree) {
23c01d28dcSEduardo Caldas     SCOPED_TRACE(llvm::join(GetParam().getCommandLineArgs(), " "));
24c01d28dcSEduardo Caldas 
25c01d28dcSEduardo Caldas     auto *Root = buildTree(Code, GetParam());
26e159a3ceSHaojian Wu     auto ErrorOK = errorOK(Code);
27e159a3ceSHaojian Wu     if (!ErrorOK)
28e159a3ceSHaojian Wu       return ErrorOK;
29*263dcf45SHaojian Wu     auto Actual = StringRef(Root->dump(*TM)).trim().str();
30c01d28dcSEduardo Caldas     // EXPECT_EQ shows the diff between the two strings if they are different.
31c01d28dcSEduardo Caldas     EXPECT_EQ(Tree.trim().str(), Actual);
32c01d28dcSEduardo Caldas     if (Actual != Tree.trim().str()) {
33c01d28dcSEduardo Caldas       return ::testing::AssertionFailure();
34c01d28dcSEduardo Caldas     }
35c01d28dcSEduardo Caldas     return ::testing::AssertionSuccess();
36c01d28dcSEduardo Caldas   }
37c01d28dcSEduardo Caldas 
38c01d28dcSEduardo Caldas   ::testing::AssertionResult
treeDumpEqualOnAnnotations(StringRef CodeWithAnnotations,ArrayRef<StringRef> TreeDumps)39c01d28dcSEduardo Caldas   treeDumpEqualOnAnnotations(StringRef CodeWithAnnotations,
40c01d28dcSEduardo Caldas                              ArrayRef<StringRef> TreeDumps) {
41c01d28dcSEduardo Caldas     SCOPED_TRACE(llvm::join(GetParam().getCommandLineArgs(), " "));
42c01d28dcSEduardo Caldas 
43c01d28dcSEduardo Caldas     auto AnnotatedCode = llvm::Annotations(CodeWithAnnotations);
44c01d28dcSEduardo Caldas     auto *Root = buildTree(AnnotatedCode.code(), GetParam());
45c01d28dcSEduardo Caldas 
46e159a3ceSHaojian Wu     auto ErrorOK = errorOK(AnnotatedCode.code());
47e159a3ceSHaojian Wu     if (!ErrorOK)
48e159a3ceSHaojian Wu       return ErrorOK;
49c01d28dcSEduardo Caldas 
50c01d28dcSEduardo Caldas     auto AnnotatedRanges = AnnotatedCode.ranges();
51c01d28dcSEduardo Caldas     if (AnnotatedRanges.size() != TreeDumps.size()) {
52c01d28dcSEduardo Caldas       return ::testing::AssertionFailure()
53c01d28dcSEduardo Caldas              << "The number of annotated ranges in the source code is "
54c01d28dcSEduardo Caldas                 "different "
55c01d28dcSEduardo Caldas                 "to the number of their corresponding tree dumps.";
56c01d28dcSEduardo Caldas     }
57c01d28dcSEduardo Caldas     bool Failed = false;
58c01d28dcSEduardo Caldas     for (unsigned i = 0; i < AnnotatedRanges.size(); i++) {
59c01d28dcSEduardo Caldas       auto *AnnotatedNode = nodeByRange(AnnotatedRanges[i], Root);
60c01d28dcSEduardo Caldas       assert(AnnotatedNode);
61c01d28dcSEduardo Caldas       auto AnnotatedNodeDump =
62*263dcf45SHaojian Wu           StringRef(AnnotatedNode->dump(*TM))
634c14ee61SEduardo Caldas               .trim()
644c14ee61SEduardo Caldas               .str();
65c01d28dcSEduardo Caldas       // EXPECT_EQ shows the diff between the two strings if they are different.
66c01d28dcSEduardo Caldas       EXPECT_EQ(TreeDumps[i].trim().str(), AnnotatedNodeDump)
67c01d28dcSEduardo Caldas           << "Dumps diverged for the code:\n"
68c01d28dcSEduardo Caldas           << AnnotatedCode.code().slice(AnnotatedRanges[i].Begin,
69c01d28dcSEduardo Caldas                                         AnnotatedRanges[i].End);
70c01d28dcSEduardo Caldas       if (AnnotatedNodeDump != TreeDumps[i].trim().str())
71c01d28dcSEduardo Caldas         Failed = true;
72c01d28dcSEduardo Caldas     }
73c01d28dcSEduardo Caldas     return Failed ? ::testing::AssertionFailure()
74c01d28dcSEduardo Caldas                   : ::testing::AssertionSuccess();
75c01d28dcSEduardo Caldas   }
76e159a3ceSHaojian Wu 
77e159a3ceSHaojian Wu private:
errorOK(StringRef RawCode)78e159a3ceSHaojian Wu   ::testing::AssertionResult errorOK(StringRef RawCode) {
79e159a3ceSHaojian Wu     if (!RawCode.contains("error-ok")) {
80e159a3ceSHaojian Wu       if (Diags->getClient()->getNumErrors() != 0) {
81e159a3ceSHaojian Wu         return ::testing::AssertionFailure()
82e159a3ceSHaojian Wu                << "Source file has syntax errors (suppress with /*error-ok*/), "
83e159a3ceSHaojian Wu                   "they were printed to the "
84e159a3ceSHaojian Wu                   "test log";
85e159a3ceSHaojian Wu       }
86e159a3ceSHaojian Wu     }
87e159a3ceSHaojian Wu     return ::testing::AssertionSuccess();
88e159a3ceSHaojian Wu   }
89c01d28dcSEduardo Caldas };
90c01d28dcSEduardo Caldas 
91d4d80a29SBenjamin Kramer INSTANTIATE_TEST_SUITE_P(SyntaxTreeTests, BuildSyntaxTreeTest,
92d4d80a29SBenjamin Kramer                         testing::ValuesIn(allTestClangConfigs()) );
93c01d28dcSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Simple)94c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Simple) {
95d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
96d17437d2SEduardo Caldas       R"cpp(
97d17437d2SEduardo Caldas int main() {}
98d17437d2SEduardo Caldas void foo() {}
99d17437d2SEduardo Caldas )cpp",
100d17437d2SEduardo Caldas       R"txt(
10102a9f8a2SEduardo Caldas TranslationUnit Detached
102d17437d2SEduardo Caldas |-SimpleDeclaration
10302a9f8a2SEduardo Caldas | |-'int'
1045011d431SEduardo Caldas | |-DeclaratorList Declarators
1055011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
10602a9f8a2SEduardo Caldas | |   |-'main'
107d17437d2SEduardo Caldas | |   `-ParametersAndQualifiers
10802a9f8a2SEduardo Caldas | |     |-'(' OpenParen
10902a9f8a2SEduardo Caldas | |     `-')' CloseParen
110d17437d2SEduardo Caldas | `-CompoundStatement
11102a9f8a2SEduardo Caldas |   |-'{' OpenParen
11202a9f8a2SEduardo Caldas |   `-'}' CloseParen
113d17437d2SEduardo Caldas `-SimpleDeclaration
11402a9f8a2SEduardo Caldas   |-'void'
1155011d431SEduardo Caldas   |-DeclaratorList Declarators
1165011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
11702a9f8a2SEduardo Caldas   |   |-'foo'
118d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
11902a9f8a2SEduardo Caldas   |     |-'(' OpenParen
12002a9f8a2SEduardo Caldas   |     `-')' CloseParen
121d17437d2SEduardo Caldas   `-CompoundStatement
12202a9f8a2SEduardo Caldas     |-'{' OpenParen
12302a9f8a2SEduardo Caldas     `-'}' CloseParen
124d17437d2SEduardo Caldas )txt"));
125d17437d2SEduardo Caldas }
126d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,SimpleVariable)127c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, SimpleVariable) {
128d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
129d17437d2SEduardo Caldas       R"cpp(
130d17437d2SEduardo Caldas int a;
131d17437d2SEduardo Caldas int b = 42;
132d17437d2SEduardo Caldas )cpp",
133d17437d2SEduardo Caldas       R"txt(
13402a9f8a2SEduardo Caldas TranslationUnit Detached
135d17437d2SEduardo Caldas |-SimpleDeclaration
13602a9f8a2SEduardo Caldas | |-'int'
1375011d431SEduardo Caldas | |-DeclaratorList Declarators
1385011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
13902a9f8a2SEduardo Caldas | |   `-'a'
14002a9f8a2SEduardo Caldas | `-';'
141d17437d2SEduardo Caldas `-SimpleDeclaration
14202a9f8a2SEduardo Caldas   |-'int'
1435011d431SEduardo Caldas   |-DeclaratorList Declarators
1445011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
14502a9f8a2SEduardo Caldas   |   |-'b'
14602a9f8a2SEduardo Caldas   |   |-'='
147d17437d2SEduardo Caldas   |   `-IntegerLiteralExpression
14802a9f8a2SEduardo Caldas   |     `-'42' LiteralToken
14902a9f8a2SEduardo Caldas   `-';'
150d17437d2SEduardo Caldas )txt"));
151d17437d2SEduardo Caldas }
152d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,SimpleFunction)153c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, SimpleFunction) {
154d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
155d17437d2SEduardo Caldas       R"cpp(
156d17437d2SEduardo Caldas void foo(int a, int b) {}
157d17437d2SEduardo Caldas )cpp",
158d17437d2SEduardo Caldas       R"txt(
15902a9f8a2SEduardo Caldas TranslationUnit Detached
160d17437d2SEduardo Caldas `-SimpleDeclaration
16102a9f8a2SEduardo Caldas   |-'void'
1625011d431SEduardo Caldas   |-DeclaratorList Declarators
1635011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
16402a9f8a2SEduardo Caldas   |   |-'foo'
165d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
16602a9f8a2SEduardo Caldas   |     |-'(' OpenParen
167718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
168718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
169dc3d4743SEduardo Caldas   |     | | |-'int'
1705011d431SEduardo Caldas   |     | | `-DeclaratorList Declarators
1715011d431SEduardo Caldas   |     | |   `-SimpleDeclarator ListElement
172dc3d4743SEduardo Caldas   |     | |     `-'a'
173718e550cSEduardo Caldas   |     | |-',' ListDelimiter
174718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
17502a9f8a2SEduardo Caldas   |     |   |-'int'
1765011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
1775011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
17802a9f8a2SEduardo Caldas   |     |       `-'b'
17902a9f8a2SEduardo Caldas   |     `-')' CloseParen
180d17437d2SEduardo Caldas   `-CompoundStatement
18102a9f8a2SEduardo Caldas     |-'{' OpenParen
18202a9f8a2SEduardo Caldas     `-'}' CloseParen
183d17437d2SEduardo Caldas )txt"));
184d17437d2SEduardo Caldas }
185d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Simple_BackslashInsideToken)186e616a425SEduardo Caldas TEST_P(BuildSyntaxTreeTest, Simple_BackslashInsideToken) {
187e616a425SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
188e616a425SEduardo Caldas       R"cpp(
189e616a425SEduardo Caldas in\
190e616a425SEduardo Caldas t a;
191e616a425SEduardo Caldas )cpp",
192e616a425SEduardo Caldas       R"txt(
193e616a425SEduardo Caldas TranslationUnit Detached
194e616a425SEduardo Caldas `-SimpleDeclaration
195e616a425SEduardo Caldas   |-'in\
196e616a425SEduardo Caldas t'
1975011d431SEduardo Caldas   |-DeclaratorList Declarators
1985011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
199e616a425SEduardo Caldas   |   `-'a'
200e616a425SEduardo Caldas   `-';'
201e616a425SEduardo Caldas )txt"));
202e616a425SEduardo Caldas }
203e616a425SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,If)204c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, If) {
2051beb11c6SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
206d17437d2SEduardo Caldas       R"cpp(
2071beb11c6SEduardo Caldas void test() {
2081beb11c6SEduardo Caldas   [[if (1) {}]]
2091beb11c6SEduardo Caldas   [[if (1) {} else if (0) {}]]
210d17437d2SEduardo Caldas }
211d17437d2SEduardo Caldas )cpp",
2121beb11c6SEduardo Caldas       {R"txt(
213718e550cSEduardo Caldas IfStatement Statement
21402a9f8a2SEduardo Caldas |-'if' IntroducerKeyword
21502a9f8a2SEduardo Caldas |-'('
2166c1a2330SHaojian Wu |-ExpressionStatement Condition
2176c1a2330SHaojian Wu | `-IntegerLiteralExpression Expression
21802a9f8a2SEduardo Caldas |   `-'1' LiteralToken
21902a9f8a2SEduardo Caldas |-')'
220718e550cSEduardo Caldas `-CompoundStatement ThenStatement
22102a9f8a2SEduardo Caldas   |-'{' OpenParen
22202a9f8a2SEduardo Caldas   `-'}' CloseParen
2231beb11c6SEduardo Caldas   )txt",
2241beb11c6SEduardo Caldas        R"txt(
225718e550cSEduardo Caldas IfStatement Statement
22602a9f8a2SEduardo Caldas |-'if' IntroducerKeyword
22702a9f8a2SEduardo Caldas |-'('
2286c1a2330SHaojian Wu |-ExpressionStatement Condition
2296c1a2330SHaojian Wu | `-IntegerLiteralExpression Expression
23002a9f8a2SEduardo Caldas |   `-'1' LiteralToken
23102a9f8a2SEduardo Caldas |-')'
232718e550cSEduardo Caldas |-CompoundStatement ThenStatement
23302a9f8a2SEduardo Caldas | |-'{' OpenParen
23402a9f8a2SEduardo Caldas | `-'}' CloseParen
235718e550cSEduardo Caldas |-'else' ElseKeyword
236718e550cSEduardo Caldas `-IfStatement ElseStatement
23702a9f8a2SEduardo Caldas   |-'if' IntroducerKeyword
23802a9f8a2SEduardo Caldas   |-'('
2396c1a2330SHaojian Wu   |-ExpressionStatement Condition
2406c1a2330SHaojian Wu   | `-IntegerLiteralExpression Expression
24102a9f8a2SEduardo Caldas   |   `-'0' LiteralToken
24202a9f8a2SEduardo Caldas   |-')'
243718e550cSEduardo Caldas   `-CompoundStatement ThenStatement
24402a9f8a2SEduardo Caldas     |-'{' OpenParen
24502a9f8a2SEduardo Caldas     `-'}' CloseParen
2461beb11c6SEduardo Caldas )txt"}));
247d17437d2SEduardo Caldas }
248d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,IfDecl)2496c1a2330SHaojian Wu TEST_P(BuildSyntaxTreeTest, IfDecl) {
2506c1a2330SHaojian Wu   if (!GetParam().isCXX17OrLater()) {
2516c1a2330SHaojian Wu     return;
2526c1a2330SHaojian Wu   }
2536c1a2330SHaojian Wu   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2546c1a2330SHaojian Wu       R"cpp(
2556c1a2330SHaojian Wu void test() {
2566c1a2330SHaojian Wu   [[if (int a = 5) {}]]
2576c1a2330SHaojian Wu   [[if (int a; a == 5) {}]]
2586c1a2330SHaojian Wu }
2596c1a2330SHaojian Wu )cpp",
2606c1a2330SHaojian Wu       {R"txt(
2616c1a2330SHaojian Wu IfStatement Statement
2626c1a2330SHaojian Wu |-'if' IntroducerKeyword
2636c1a2330SHaojian Wu |-'('
2646c1a2330SHaojian Wu |-DeclarationStatement Condition
2656c1a2330SHaojian Wu | `-SimpleDeclaration
2666c1a2330SHaojian Wu |   |-'int'
2676c1a2330SHaojian Wu |   `-DeclaratorList Declarators
2686c1a2330SHaojian Wu |     `-SimpleDeclarator ListElement
2696c1a2330SHaojian Wu |       |-'a'
2706c1a2330SHaojian Wu |       |-'='
2716c1a2330SHaojian Wu |       `-IntegerLiteralExpression
2726c1a2330SHaojian Wu |         `-'5' LiteralToken
2736c1a2330SHaojian Wu |-')'
2746c1a2330SHaojian Wu `-CompoundStatement ThenStatement
2756c1a2330SHaojian Wu   |-'{' OpenParen
2766c1a2330SHaojian Wu   `-'}' CloseParen
2776c1a2330SHaojian Wu       )txt",
2786c1a2330SHaojian Wu        R"txt(
2796c1a2330SHaojian Wu IfStatement Statement
2806c1a2330SHaojian Wu |-'if' IntroducerKeyword
2816c1a2330SHaojian Wu |-'('
2826c1a2330SHaojian Wu |-DeclarationStatement
2836c1a2330SHaojian Wu | |-SimpleDeclaration
2846c1a2330SHaojian Wu | | |-'int'
2856c1a2330SHaojian Wu | | `-DeclaratorList Declarators
2866c1a2330SHaojian Wu | |   `-SimpleDeclarator ListElement
2876c1a2330SHaojian Wu | |     `-'a'
2886c1a2330SHaojian Wu | `-';'
2896c1a2330SHaojian Wu |-ExpressionStatement Condition
2906c1a2330SHaojian Wu | `-BinaryOperatorExpression Expression
2916c1a2330SHaojian Wu |   |-IdExpression LeftHandSide
2926c1a2330SHaojian Wu |   | `-UnqualifiedId UnqualifiedId
2936c1a2330SHaojian Wu |   |   `-'a'
2946c1a2330SHaojian Wu |   |-'==' OperatorToken
2956c1a2330SHaojian Wu |   `-IntegerLiteralExpression RightHandSide
2966c1a2330SHaojian Wu |     `-'5' LiteralToken
2976c1a2330SHaojian Wu |-')'
2986c1a2330SHaojian Wu `-CompoundStatement ThenStatement
2996c1a2330SHaojian Wu   |-'{' OpenParen
3006c1a2330SHaojian Wu   `-'}' CloseParen
3016c1a2330SHaojian Wu )txt"}));
3026c1a2330SHaojian Wu }
3036c1a2330SHaojian Wu 
TEST_P(BuildSyntaxTreeTest,For)304c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, For) {
3051beb11c6SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
306d17437d2SEduardo Caldas       R"cpp(
307d17437d2SEduardo Caldas void test() {
3081beb11c6SEduardo Caldas   [[for (;;)  {}]]
309d17437d2SEduardo Caldas }
310d17437d2SEduardo Caldas )cpp",
3111beb11c6SEduardo Caldas       {R"txt(
312718e550cSEduardo Caldas ForStatement Statement
31302a9f8a2SEduardo Caldas |-'for' IntroducerKeyword
31402a9f8a2SEduardo Caldas |-'('
31502a9f8a2SEduardo Caldas |-';'
31602a9f8a2SEduardo Caldas |-';'
31702a9f8a2SEduardo Caldas |-')'
31802a9f8a2SEduardo Caldas `-CompoundStatement BodyStatement
31902a9f8a2SEduardo Caldas   |-'{' OpenParen
32002a9f8a2SEduardo Caldas   `-'}' CloseParen
3211beb11c6SEduardo Caldas )txt"}));
322d17437d2SEduardo Caldas }
323d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,RangeBasedFor)324c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, RangeBasedFor) {
325d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
326d17437d2SEduardo Caldas     return;
327d17437d2SEduardo Caldas   }
3281beb11c6SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
329d17437d2SEduardo Caldas       R"cpp(
330d17437d2SEduardo Caldas void test() {
331d17437d2SEduardo Caldas   int a[3];
3321beb11c6SEduardo Caldas   [[for (int x : a)
3331beb11c6SEduardo Caldas     ;]]
334d17437d2SEduardo Caldas }
335d17437d2SEduardo Caldas )cpp",
3361beb11c6SEduardo Caldas       {R"txt(
337718e550cSEduardo Caldas RangeBasedForStatement Statement
33802a9f8a2SEduardo Caldas |-'for' IntroducerKeyword
33902a9f8a2SEduardo Caldas |-'('
3401beb11c6SEduardo Caldas |-SimpleDeclaration
34102a9f8a2SEduardo Caldas | |-'int'
3425011d431SEduardo Caldas | |-DeclaratorList Declarators
3435011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
34402a9f8a2SEduardo Caldas | |   `-'x'
34502a9f8a2SEduardo Caldas | `-':'
3461beb11c6SEduardo Caldas |-IdExpression
347718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
34802a9f8a2SEduardo Caldas |   `-'a'
34902a9f8a2SEduardo Caldas |-')'
35002a9f8a2SEduardo Caldas `-EmptyStatement BodyStatement
35102a9f8a2SEduardo Caldas   `-';'
3521beb11c6SEduardo Caldas )txt"}));
353d17437d2SEduardo Caldas }
354d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,DeclarationStatement)355c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, DeclarationStatement) {
3561beb11c6SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
357d17437d2SEduardo Caldas       R"cpp(
358d17437d2SEduardo Caldas void test() {
3591beb11c6SEduardo Caldas   [[int a = 10;]]
360d17437d2SEduardo Caldas }
361d17437d2SEduardo Caldas )cpp",
3621beb11c6SEduardo Caldas       {R"txt(
363718e550cSEduardo Caldas DeclarationStatement Statement
3641beb11c6SEduardo Caldas |-SimpleDeclaration
36502a9f8a2SEduardo Caldas | |-'int'
3665011d431SEduardo Caldas | `-DeclaratorList Declarators
3675011d431SEduardo Caldas |   `-SimpleDeclarator ListElement
36802a9f8a2SEduardo Caldas |     |-'a'
36902a9f8a2SEduardo Caldas |     |-'='
3701beb11c6SEduardo Caldas |     `-IntegerLiteralExpression
37102a9f8a2SEduardo Caldas |       `-'10' LiteralToken
37202a9f8a2SEduardo Caldas `-';'
3731beb11c6SEduardo Caldas )txt"}));
374d17437d2SEduardo Caldas }
375d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Switch)376c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Switch) {
3771beb11c6SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
378d17437d2SEduardo Caldas       R"cpp(
379d17437d2SEduardo Caldas void test() {
3801beb11c6SEduardo Caldas   [[switch (1) {
381d17437d2SEduardo Caldas     case 0:
382d17437d2SEduardo Caldas     default:;
3831beb11c6SEduardo Caldas   }]]
384d17437d2SEduardo Caldas }
385d17437d2SEduardo Caldas )cpp",
3861beb11c6SEduardo Caldas       {R"txt(
387718e550cSEduardo Caldas SwitchStatement Statement
38802a9f8a2SEduardo Caldas |-'switch' IntroducerKeyword
38902a9f8a2SEduardo Caldas |-'('
3901beb11c6SEduardo Caldas |-IntegerLiteralExpression
39102a9f8a2SEduardo Caldas | `-'1' LiteralToken
39202a9f8a2SEduardo Caldas |-')'
39302a9f8a2SEduardo Caldas `-CompoundStatement BodyStatement
39402a9f8a2SEduardo Caldas   |-'{' OpenParen
395718e550cSEduardo Caldas   |-CaseStatement Statement
39602a9f8a2SEduardo Caldas   | |-'case' IntroducerKeyword
397718e550cSEduardo Caldas   | |-IntegerLiteralExpression CaseValue
39802a9f8a2SEduardo Caldas   | | `-'0' LiteralToken
39902a9f8a2SEduardo Caldas   | |-':'
40002a9f8a2SEduardo Caldas   | `-DefaultStatement BodyStatement
40102a9f8a2SEduardo Caldas   |   |-'default' IntroducerKeyword
40202a9f8a2SEduardo Caldas   |   |-':'
40302a9f8a2SEduardo Caldas   |   `-EmptyStatement BodyStatement
40402a9f8a2SEduardo Caldas   |     `-';'
40502a9f8a2SEduardo Caldas   `-'}' CloseParen
4061beb11c6SEduardo Caldas )txt"}));
407d17437d2SEduardo Caldas }
408d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,While)409c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, While) {
4101beb11c6SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
411d17437d2SEduardo Caldas       R"cpp(
412d17437d2SEduardo Caldas void test() {
4131beb11c6SEduardo Caldas   [[while (1) { continue; break; }]]
414d17437d2SEduardo Caldas }
415d17437d2SEduardo Caldas )cpp",
4161beb11c6SEduardo Caldas       {R"txt(
417718e550cSEduardo Caldas WhileStatement Statement
41802a9f8a2SEduardo Caldas |-'while' IntroducerKeyword
41902a9f8a2SEduardo Caldas |-'('
4201beb11c6SEduardo Caldas |-IntegerLiteralExpression
42102a9f8a2SEduardo Caldas | `-'1' LiteralToken
42202a9f8a2SEduardo Caldas |-')'
42302a9f8a2SEduardo Caldas `-CompoundStatement BodyStatement
42402a9f8a2SEduardo Caldas   |-'{' OpenParen
425718e550cSEduardo Caldas   |-ContinueStatement Statement
42602a9f8a2SEduardo Caldas   | |-'continue' IntroducerKeyword
42702a9f8a2SEduardo Caldas   | `-';'
428718e550cSEduardo Caldas   |-BreakStatement Statement
42902a9f8a2SEduardo Caldas   | |-'break' IntroducerKeyword
43002a9f8a2SEduardo Caldas   | `-';'
43102a9f8a2SEduardo Caldas   `-'}' CloseParen
4321beb11c6SEduardo Caldas )txt"}));
433d17437d2SEduardo Caldas }
434d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UnhandledStatement)435c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnhandledStatement) {
436d17437d2SEduardo Caldas   // Unhandled statements should end up as 'unknown statement'.
437d17437d2SEduardo Caldas   // This example uses a 'label statement', which does not yet have a syntax
438d17437d2SEduardo Caldas   // counterpart.
4391beb11c6SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
440d17437d2SEduardo Caldas       R"cpp(
4411beb11c6SEduardo Caldas int test() {
4421beb11c6SEduardo Caldas   [[foo: return 100;]]
443d17437d2SEduardo Caldas }
444d17437d2SEduardo Caldas )cpp",
4451beb11c6SEduardo Caldas       {R"txt(
446718e550cSEduardo Caldas UnknownStatement Statement
44702a9f8a2SEduardo Caldas |-'foo'
44802a9f8a2SEduardo Caldas |-':'
4491beb11c6SEduardo Caldas `-ReturnStatement
45002a9f8a2SEduardo Caldas   |-'return' IntroducerKeyword
451718e550cSEduardo Caldas   |-IntegerLiteralExpression ReturnValue
45202a9f8a2SEduardo Caldas   | `-'100' LiteralToken
45302a9f8a2SEduardo Caldas   `-';'
4541beb11c6SEduardo Caldas )txt"}));
455d17437d2SEduardo Caldas }
456d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Expressions)457c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Expressions) {
458d17437d2SEduardo Caldas   // expressions should be wrapped in 'ExpressionStatement' when they appear
459d17437d2SEduardo Caldas   // in a statement position.
460d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
461d17437d2SEduardo Caldas       R"cpp(
462d17437d2SEduardo Caldas void test() {
463d17437d2SEduardo Caldas   test();
464d17437d2SEduardo Caldas   if (1) test(); else test();
465d17437d2SEduardo Caldas }
466d17437d2SEduardo Caldas )cpp",
467d17437d2SEduardo Caldas       R"txt(
4686118ce79SEduardo Caldas TranslationUnit Detached
469d17437d2SEduardo Caldas `-SimpleDeclaration
4706118ce79SEduardo Caldas   |-'void'
4715011d431SEduardo Caldas   |-DeclaratorList Declarators
4725011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
4736118ce79SEduardo Caldas   |   |-'test'
474d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
4756118ce79SEduardo Caldas   |     |-'(' OpenParen
4766118ce79SEduardo Caldas   |     `-')' CloseParen
477d17437d2SEduardo Caldas   `-CompoundStatement
4786118ce79SEduardo Caldas     |-'{' OpenParen
479718e550cSEduardo Caldas     |-ExpressionStatement Statement
480718e550cSEduardo Caldas     | |-CallExpression Expression
481718e550cSEduardo Caldas     | | |-IdExpression Callee
482718e550cSEduardo Caldas     | | | `-UnqualifiedId UnqualifiedId
4836118ce79SEduardo Caldas     | | |   `-'test'
4842de2ca34SEduardo Caldas     | | |-'(' OpenParen
4852de2ca34SEduardo Caldas     | | `-')' CloseParen
4866118ce79SEduardo Caldas     | `-';'
487718e550cSEduardo Caldas     |-IfStatement Statement
4886118ce79SEduardo Caldas     | |-'if' IntroducerKeyword
4896118ce79SEduardo Caldas     | |-'('
4906c1a2330SHaojian Wu     | |-ExpressionStatement Condition
4916c1a2330SHaojian Wu     | | `-IntegerLiteralExpression Expression
4926118ce79SEduardo Caldas     | |   `-'1' LiteralToken
4936118ce79SEduardo Caldas     | |-')'
494718e550cSEduardo Caldas     | |-ExpressionStatement ThenStatement
495718e550cSEduardo Caldas     | | |-CallExpression Expression
496718e550cSEduardo Caldas     | | | |-IdExpression Callee
497718e550cSEduardo Caldas     | | | | `-UnqualifiedId UnqualifiedId
4986118ce79SEduardo Caldas     | | | |   `-'test'
4992de2ca34SEduardo Caldas     | | | |-'(' OpenParen
5002de2ca34SEduardo Caldas     | | | `-')' CloseParen
5016118ce79SEduardo Caldas     | | `-';'
502718e550cSEduardo Caldas     | |-'else' ElseKeyword
503718e550cSEduardo Caldas     | `-ExpressionStatement ElseStatement
504718e550cSEduardo Caldas     |   |-CallExpression Expression
505718e550cSEduardo Caldas     |   | |-IdExpression Callee
506718e550cSEduardo Caldas     |   | | `-UnqualifiedId UnqualifiedId
5076118ce79SEduardo Caldas     |   | |   `-'test'
5082de2ca34SEduardo Caldas     |   | |-'(' OpenParen
5092de2ca34SEduardo Caldas     |   | `-')' CloseParen
5106118ce79SEduardo Caldas     |   `-';'
5116118ce79SEduardo Caldas     `-'}' CloseParen
512d17437d2SEduardo Caldas )txt"));
513d17437d2SEduardo Caldas }
514d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ConditionalOperator)515780ead41SHaojian Wu TEST_P(BuildSyntaxTreeTest, ConditionalOperator) {
516780ead41SHaojian Wu   // FIXME: conditional expression is not modeled yet.
517780ead41SHaojian Wu   EXPECT_TRUE(treeDumpEqualOnAnnotations(
518780ead41SHaojian Wu       R"cpp(
519780ead41SHaojian Wu void test() {
520780ead41SHaojian Wu   [[1?:2]];
521780ead41SHaojian Wu }
522780ead41SHaojian Wu )cpp",
523780ead41SHaojian Wu       {R"txt(
524780ead41SHaojian Wu UnknownExpression Expression
525780ead41SHaojian Wu |-IntegerLiteralExpression
526780ead41SHaojian Wu | `-'1' LiteralToken
527780ead41SHaojian Wu |-'?'
528780ead41SHaojian Wu |-':'
529780ead41SHaojian Wu `-IntegerLiteralExpression
530780ead41SHaojian Wu   `-'2' LiteralToken
531780ead41SHaojian Wu )txt"}));
532780ead41SHaojian Wu }
533780ead41SHaojian Wu 
TEST_P(BuildSyntaxTreeTest,UnqualifiedId_Identifier)534c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnqualifiedId_Identifier) {
535c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
536d17437d2SEduardo Caldas       R"cpp(
537d17437d2SEduardo Caldas void test(int a) {
538c8c92b54SEduardo Caldas   [[a]];
539d17437d2SEduardo Caldas }
540d17437d2SEduardo Caldas )cpp",
541c8c92b54SEduardo Caldas       {R"txt(
542718e550cSEduardo Caldas IdExpression Expression
543718e550cSEduardo Caldas `-UnqualifiedId UnqualifiedId
5446118ce79SEduardo Caldas   `-'a'
545c8c92b54SEduardo Caldas )txt"}));
546d17437d2SEduardo Caldas }
547d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UnqualifiedId_OperatorFunctionId)548c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnqualifiedId_OperatorFunctionId) {
549d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
550d17437d2SEduardo Caldas     return;
551d17437d2SEduardo Caldas   }
552c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
553d17437d2SEduardo Caldas       R"cpp(
554d17437d2SEduardo Caldas struct X {
555d17437d2SEduardo Caldas   friend X operator+(const X&, const X&);
556d17437d2SEduardo Caldas };
557d17437d2SEduardo Caldas void test(X x) {
558c8c92b54SEduardo Caldas   [[operator+(x, x)]];
559d17437d2SEduardo Caldas }
560d17437d2SEduardo Caldas )cpp",
561c8c92b54SEduardo Caldas       {R"txt(
562718e550cSEduardo Caldas CallExpression Expression
563718e550cSEduardo Caldas |-IdExpression Callee
564718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
5656118ce79SEduardo Caldas |   |-'operator'
5666118ce79SEduardo Caldas |   `-'+'
5672de2ca34SEduardo Caldas |-'(' OpenParen
568718e550cSEduardo Caldas |-CallArguments Arguments
569718e550cSEduardo Caldas | |-IdExpression ListElement
570718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
5712de2ca34SEduardo Caldas | |   `-'x'
572718e550cSEduardo Caldas | |-',' ListDelimiter
573718e550cSEduardo Caldas | `-IdExpression ListElement
574718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
5756118ce79SEduardo Caldas |     `-'x'
5762de2ca34SEduardo Caldas `-')' CloseParen
577c8c92b54SEduardo Caldas )txt"}));
578d17437d2SEduardo Caldas }
579d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UnqualifiedId_ConversionFunctionId)580c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnqualifiedId_ConversionFunctionId) {
581d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
582d17437d2SEduardo Caldas     return;
583d17437d2SEduardo Caldas   }
584c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
585d17437d2SEduardo Caldas       R"cpp(
586d17437d2SEduardo Caldas struct X {
587d17437d2SEduardo Caldas   operator int();
588d17437d2SEduardo Caldas };
589d17437d2SEduardo Caldas void test(X x) {
590c8c92b54SEduardo Caldas   [[x.operator int()]];
591d17437d2SEduardo Caldas }
592d17437d2SEduardo Caldas )cpp",
593c8c92b54SEduardo Caldas       {R"txt(
594718e550cSEduardo Caldas CallExpression Expression
595718e550cSEduardo Caldas |-MemberExpression Callee
596718e550cSEduardo Caldas | |-IdExpression Object
597718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
5986118ce79SEduardo Caldas | |   `-'x'
599718e550cSEduardo Caldas | |-'.' AccessToken
600718e550cSEduardo Caldas | `-IdExpression Member
601718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
6026118ce79SEduardo Caldas |     |-'operator'
6036118ce79SEduardo Caldas |     `-'int'
6042de2ca34SEduardo Caldas |-'(' OpenParen
6052de2ca34SEduardo Caldas `-')' CloseParen
606c8c92b54SEduardo Caldas )txt"}));
607d17437d2SEduardo Caldas }
608d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UnqualifiedId_LiteralOperatorId)609c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnqualifiedId_LiteralOperatorId) {
610d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
611d17437d2SEduardo Caldas     return;
612d17437d2SEduardo Caldas   }
613c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
614d17437d2SEduardo Caldas       R"cpp(
615d17437d2SEduardo Caldas unsigned operator "" _w(char);
616d17437d2SEduardo Caldas void test() {
617c8c92b54SEduardo Caldas   [[operator "" _w('1')]];
618d17437d2SEduardo Caldas }
619d17437d2SEduardo Caldas )cpp",
620c8c92b54SEduardo Caldas       {R"txt(
621718e550cSEduardo Caldas CallExpression Expression
622718e550cSEduardo Caldas |-IdExpression Callee
623718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
6246118ce79SEduardo Caldas |   |-'operator'
6256118ce79SEduardo Caldas |   |-'""'
6266118ce79SEduardo Caldas |   `-'_w'
6272de2ca34SEduardo Caldas |-'(' OpenParen
628718e550cSEduardo Caldas |-CallArguments Arguments
629718e550cSEduardo Caldas | `-CharacterLiteralExpression ListElement
6306118ce79SEduardo Caldas |   `-''1'' LiteralToken
6312de2ca34SEduardo Caldas `-')' CloseParen
632c8c92b54SEduardo Caldas )txt"}));
633d17437d2SEduardo Caldas }
634d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UnqualifiedId_Destructor)635c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnqualifiedId_Destructor) {
636d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
637d17437d2SEduardo Caldas     return;
638d17437d2SEduardo Caldas   }
639c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
640d17437d2SEduardo Caldas       R"cpp(
641d17437d2SEduardo Caldas struct X { };
642d17437d2SEduardo Caldas void test(X x) {
643c8c92b54SEduardo Caldas   [[x.~X()]];
644d17437d2SEduardo Caldas }
645d17437d2SEduardo Caldas )cpp",
646c8c92b54SEduardo Caldas       {R"txt(
647718e550cSEduardo Caldas CallExpression Expression
648718e550cSEduardo Caldas |-MemberExpression Callee
649718e550cSEduardo Caldas | |-IdExpression Object
650718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
6516118ce79SEduardo Caldas | |   `-'x'
652718e550cSEduardo Caldas | |-'.' AccessToken
653718e550cSEduardo Caldas | `-IdExpression Member
654718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
6556118ce79SEduardo Caldas |     |-'~'
6566118ce79SEduardo Caldas |     `-'X'
6572de2ca34SEduardo Caldas |-'(' OpenParen
6582de2ca34SEduardo Caldas `-')' CloseParen
659c8c92b54SEduardo Caldas )txt"}));
660d17437d2SEduardo Caldas }
661d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UnqualifiedId_DecltypeDestructor)662c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnqualifiedId_DecltypeDestructor) {
663d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
664d17437d2SEduardo Caldas     return;
665d17437d2SEduardo Caldas   }
666c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
667d17437d2SEduardo Caldas       R"cpp(
668d17437d2SEduardo Caldas struct X { };
669d17437d2SEduardo Caldas void test(X x) {
670ba32915dSEduardo Caldas   // FIXME: Make `decltype(x)` a child of `MemberExpression`. It is currently
671ba32915dSEduardo Caldas   // not because `Expr::getSourceRange()` returns the range of `x.~` for the
672ba32915dSEduardo Caldas   // `MemberExpr` instead of the expected `x.~decltype(x)`, this is a bug in
673ba32915dSEduardo Caldas   // clang.
674c8c92b54SEduardo Caldas   [[x.~decltype(x)()]];
675d17437d2SEduardo Caldas }
676d17437d2SEduardo Caldas )cpp",
677c8c92b54SEduardo Caldas       {R"txt(
678718e550cSEduardo Caldas CallExpression Expression
679718e550cSEduardo Caldas |-MemberExpression Callee
680718e550cSEduardo Caldas | |-IdExpression Object
681718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
6826118ce79SEduardo Caldas | |   `-'x'
683718e550cSEduardo Caldas | |-'.' AccessToken
684718e550cSEduardo Caldas | `-IdExpression Member
685718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
6866118ce79SEduardo Caldas |     `-'~'
6876118ce79SEduardo Caldas |-'decltype'
6886118ce79SEduardo Caldas |-'('
6896118ce79SEduardo Caldas |-'x'
6906118ce79SEduardo Caldas |-')'
6916118ce79SEduardo Caldas |-'('
6922de2ca34SEduardo Caldas `-')' CloseParen
693c8c92b54SEduardo Caldas )txt"}));
694d17437d2SEduardo Caldas }
695d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UnqualifiedId_TemplateId)696c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UnqualifiedId_TemplateId) {
697d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
698d17437d2SEduardo Caldas     return;
699d17437d2SEduardo Caldas   }
700c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
701d17437d2SEduardo Caldas       R"cpp(
702d17437d2SEduardo Caldas template<typename T>
703d17437d2SEduardo Caldas T f();
704d17437d2SEduardo Caldas void test() {
705c8c92b54SEduardo Caldas   [[f<int>()]];
706d17437d2SEduardo Caldas }
707d17437d2SEduardo Caldas )cpp",
708c8c92b54SEduardo Caldas       {R"txt(
709718e550cSEduardo Caldas CallExpression Expression
710718e550cSEduardo Caldas |-IdExpression Callee
711718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
7126118ce79SEduardo Caldas |   |-'f'
7136118ce79SEduardo Caldas |   |-'<'
7146118ce79SEduardo Caldas |   |-'int'
7156118ce79SEduardo Caldas |   `-'>'
7162de2ca34SEduardo Caldas |-'(' OpenParen
7172de2ca34SEduardo Caldas `-')' CloseParen
718c8c92b54SEduardo Caldas )txt"}));
719d17437d2SEduardo Caldas }
720d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,QualifiedId_NamespaceSpecifier)721c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, QualifiedId_NamespaceSpecifier) {
722d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
723d17437d2SEduardo Caldas     return;
724d17437d2SEduardo Caldas   }
725c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
726d17437d2SEduardo Caldas       R"cpp(
727d17437d2SEduardo Caldas namespace n {
728d17437d2SEduardo Caldas   struct S { };
729d17437d2SEduardo Caldas }
730d17437d2SEduardo Caldas void test() {
731c8c92b54SEduardo Caldas   [[::n::S s1]];
732c8c92b54SEduardo Caldas   [[n::S s2]];
733d17437d2SEduardo Caldas }
734d17437d2SEduardo Caldas )cpp",
735c8c92b54SEduardo Caldas       {R"txt(
736c8c92b54SEduardo Caldas SimpleDeclaration
737c8c92b54SEduardo Caldas |-NestedNameSpecifier
738718e550cSEduardo Caldas | |-'::' ListDelimiter
739718e550cSEduardo Caldas | |-IdentifierNameSpecifier ListElement
7406118ce79SEduardo Caldas | | `-'n'
741718e550cSEduardo Caldas | `-'::' ListDelimiter
7426118ce79SEduardo Caldas |-'S'
7435011d431SEduardo Caldas `-DeclaratorList Declarators
7445011d431SEduardo Caldas   `-SimpleDeclarator ListElement
7456118ce79SEduardo Caldas     `-'s1'
746c8c92b54SEduardo Caldas )txt",
747d17437d2SEduardo Caldas        R"txt(
748c8c92b54SEduardo Caldas SimpleDeclaration
749c8c92b54SEduardo Caldas |-NestedNameSpecifier
750718e550cSEduardo Caldas | |-IdentifierNameSpecifier ListElement
7516118ce79SEduardo Caldas | | `-'n'
752718e550cSEduardo Caldas | `-'::' ListDelimiter
7536118ce79SEduardo Caldas |-'S'
7545011d431SEduardo Caldas `-DeclaratorList Declarators
7555011d431SEduardo Caldas   `-SimpleDeclarator ListElement
7566118ce79SEduardo Caldas     `-'s2'
757c8c92b54SEduardo Caldas )txt"}));
758d17437d2SEduardo Caldas }
759d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,QualifiedId_TemplateSpecifier)760c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, QualifiedId_TemplateSpecifier) {
761d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
762d17437d2SEduardo Caldas     return;
763d17437d2SEduardo Caldas   }
764c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
765d17437d2SEduardo Caldas       R"cpp(
766d17437d2SEduardo Caldas template<typename T>
767d17437d2SEduardo Caldas struct ST {
768d17437d2SEduardo Caldas   struct S { };
769d17437d2SEduardo Caldas };
770d17437d2SEduardo Caldas void test() {
771c8c92b54SEduardo Caldas   [[::template ST<int>::S s1]];
772c8c92b54SEduardo Caldas   [[::ST<int>::S s2]];
773d17437d2SEduardo Caldas }
774d17437d2SEduardo Caldas )cpp",
775c8c92b54SEduardo Caldas       {R"txt(
776c8c92b54SEduardo Caldas SimpleDeclaration
777c8c92b54SEduardo Caldas |-NestedNameSpecifier
778718e550cSEduardo Caldas | |-'::' ListDelimiter
779718e550cSEduardo Caldas | |-SimpleTemplateNameSpecifier ListElement
7806118ce79SEduardo Caldas | | |-'template'
7816118ce79SEduardo Caldas | | |-'ST'
7826118ce79SEduardo Caldas | | |-'<'
7836118ce79SEduardo Caldas | | |-'int'
7846118ce79SEduardo Caldas | | `-'>'
785718e550cSEduardo Caldas | `-'::' ListDelimiter
7866118ce79SEduardo Caldas |-'S'
7875011d431SEduardo Caldas `-DeclaratorList Declarators
7885011d431SEduardo Caldas   `-SimpleDeclarator ListElement
7896118ce79SEduardo Caldas     `-'s1'
790c8c92b54SEduardo Caldas )txt",
791d17437d2SEduardo Caldas        R"txt(
792c8c92b54SEduardo Caldas SimpleDeclaration
793c8c92b54SEduardo Caldas |-NestedNameSpecifier
794718e550cSEduardo Caldas | |-'::' ListDelimiter
795718e550cSEduardo Caldas | |-SimpleTemplateNameSpecifier ListElement
7966118ce79SEduardo Caldas | | |-'ST'
7976118ce79SEduardo Caldas | | |-'<'
7986118ce79SEduardo Caldas | | |-'int'
7996118ce79SEduardo Caldas | | `-'>'
800718e550cSEduardo Caldas | `-'::' ListDelimiter
8016118ce79SEduardo Caldas |-'S'
8025011d431SEduardo Caldas `-DeclaratorList Declarators
8035011d431SEduardo Caldas   `-SimpleDeclarator ListElement
8046118ce79SEduardo Caldas     `-'s2'
805c8c92b54SEduardo Caldas )txt"}));
806d17437d2SEduardo Caldas }
807d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,QualifiedId_DecltypeSpecifier)808c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, QualifiedId_DecltypeSpecifier) {
809d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
810d17437d2SEduardo Caldas     return;
811d17437d2SEduardo Caldas   }
812c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
813d17437d2SEduardo Caldas       R"cpp(
814d17437d2SEduardo Caldas struct S {
815d17437d2SEduardo Caldas   static void f(){}
816d17437d2SEduardo Caldas };
817d17437d2SEduardo Caldas void test(S s) {
818c8c92b54SEduardo Caldas   [[decltype(s)::f()]];
819d17437d2SEduardo Caldas }
820d17437d2SEduardo Caldas )cpp",
821c8c92b54SEduardo Caldas       {R"txt(
822718e550cSEduardo Caldas CallExpression Expression
823718e550cSEduardo Caldas |-IdExpression Callee
824718e550cSEduardo Caldas | |-NestedNameSpecifier Qualifier
825718e550cSEduardo Caldas | | |-DecltypeNameSpecifier ListElement
8266118ce79SEduardo Caldas | | | |-'decltype'
8276118ce79SEduardo Caldas | | | |-'('
828c8c92b54SEduardo Caldas | | | |-IdExpression
829718e550cSEduardo Caldas | | | | `-UnqualifiedId UnqualifiedId
8306118ce79SEduardo Caldas | | | |   `-'s'
8316118ce79SEduardo Caldas | | | `-')'
832718e550cSEduardo Caldas | | `-'::' ListDelimiter
833718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
8346118ce79SEduardo Caldas |   `-'f'
8352de2ca34SEduardo Caldas |-'(' OpenParen
8362de2ca34SEduardo Caldas `-')' CloseParen
837c8c92b54SEduardo Caldas )txt"}));
838d17437d2SEduardo Caldas }
839d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,QualifiedId_OptionalTemplateKw)840c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, QualifiedId_OptionalTemplateKw) {
841d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
842d17437d2SEduardo Caldas     return;
843d17437d2SEduardo Caldas   }
844c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
845d17437d2SEduardo Caldas       R"cpp(
846d17437d2SEduardo Caldas struct S {
847d17437d2SEduardo Caldas   template<typename U>
848d17437d2SEduardo Caldas   static U f();
849d17437d2SEduardo Caldas };
850d17437d2SEduardo Caldas void test() {
851c8c92b54SEduardo Caldas   [[S::f<int>()]];
852c8c92b54SEduardo Caldas   [[S::template f<int>()]];
853d17437d2SEduardo Caldas }
854d17437d2SEduardo Caldas )cpp",
855c8c92b54SEduardo Caldas       {R"txt(
856718e550cSEduardo Caldas CallExpression Expression
857718e550cSEduardo Caldas |-IdExpression Callee
858718e550cSEduardo Caldas | |-NestedNameSpecifier Qualifier
859718e550cSEduardo Caldas | | |-IdentifierNameSpecifier ListElement
8606118ce79SEduardo Caldas | | | `-'S'
861718e550cSEduardo Caldas | | `-'::' ListDelimiter
862718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
8636118ce79SEduardo Caldas |   |-'f'
8646118ce79SEduardo Caldas |   |-'<'
8656118ce79SEduardo Caldas |   |-'int'
8666118ce79SEduardo Caldas |   `-'>'
8672de2ca34SEduardo Caldas |-'(' OpenParen
8682de2ca34SEduardo Caldas `-')' CloseParen
869c8c92b54SEduardo Caldas )txt",
870d17437d2SEduardo Caldas        R"txt(
871718e550cSEduardo Caldas CallExpression Expression
872718e550cSEduardo Caldas |-IdExpression Callee
873718e550cSEduardo Caldas | |-NestedNameSpecifier Qualifier
874718e550cSEduardo Caldas | | |-IdentifierNameSpecifier ListElement
8756118ce79SEduardo Caldas | | | `-'S'
876718e550cSEduardo Caldas | | `-'::' ListDelimiter
8776118ce79SEduardo Caldas | |-'template' TemplateKeyword
878718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
8796118ce79SEduardo Caldas |   |-'f'
8806118ce79SEduardo Caldas |   |-'<'
8816118ce79SEduardo Caldas |   |-'int'
8826118ce79SEduardo Caldas |   `-'>'
8832de2ca34SEduardo Caldas |-'(' OpenParen
8842de2ca34SEduardo Caldas `-')' CloseParen
885c8c92b54SEduardo Caldas )txt"}));
886d17437d2SEduardo Caldas }
887d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,QualifiedId_Complex)888c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, QualifiedId_Complex) {
889d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
890d17437d2SEduardo Caldas     return;
891d17437d2SEduardo Caldas   }
892c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
893d17437d2SEduardo Caldas       R"cpp(
894d17437d2SEduardo Caldas namespace n {
895d17437d2SEduardo Caldas   template<typename T>
896d17437d2SEduardo Caldas   struct ST {
897d17437d2SEduardo Caldas     template<typename U>
898d17437d2SEduardo Caldas     static U f();
899d17437d2SEduardo Caldas   };
900d17437d2SEduardo Caldas }
901d17437d2SEduardo Caldas void test() {
902c8c92b54SEduardo Caldas   [[::n::template ST<int>::template f<int>()]];
903d17437d2SEduardo Caldas }
904d17437d2SEduardo Caldas )cpp",
905c8c92b54SEduardo Caldas       {R"txt(
906718e550cSEduardo Caldas CallExpression Expression
907718e550cSEduardo Caldas |-IdExpression Callee
908718e550cSEduardo Caldas | |-NestedNameSpecifier Qualifier
909718e550cSEduardo Caldas | | |-'::' ListDelimiter
910718e550cSEduardo Caldas | | |-IdentifierNameSpecifier ListElement
9116118ce79SEduardo Caldas | | | `-'n'
912718e550cSEduardo Caldas | | |-'::' ListDelimiter
913718e550cSEduardo Caldas | | |-SimpleTemplateNameSpecifier ListElement
9146118ce79SEduardo Caldas | | | |-'template'
9156118ce79SEduardo Caldas | | | |-'ST'
9166118ce79SEduardo Caldas | | | |-'<'
9176118ce79SEduardo Caldas | | | |-'int'
9186118ce79SEduardo Caldas | | | `-'>'
919718e550cSEduardo Caldas | | `-'::' ListDelimiter
9206118ce79SEduardo Caldas | |-'template' TemplateKeyword
921718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
9226118ce79SEduardo Caldas |   |-'f'
9236118ce79SEduardo Caldas |   |-'<'
9246118ce79SEduardo Caldas |   |-'int'
9256118ce79SEduardo Caldas |   `-'>'
9262de2ca34SEduardo Caldas |-'(' OpenParen
9272de2ca34SEduardo Caldas `-')' CloseParen
928c8c92b54SEduardo Caldas )txt"}));
929d17437d2SEduardo Caldas }
930d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,QualifiedId_DependentType)931c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, QualifiedId_DependentType) {
932d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
933d17437d2SEduardo Caldas     return;
934d17437d2SEduardo Caldas   }
935d17437d2SEduardo Caldas   if (GetParam().hasDelayedTemplateParsing()) {
936d17437d2SEduardo Caldas     // FIXME: Make this test work on Windows by generating the expected syntax
937d17437d2SEduardo Caldas     // tree when `-fdelayed-template-parsing` is active.
938d17437d2SEduardo Caldas     return;
939d17437d2SEduardo Caldas   }
940c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
941d17437d2SEduardo Caldas       R"cpp(
942d17437d2SEduardo Caldas template <typename T>
943d17437d2SEduardo Caldas void test() {
944c8c92b54SEduardo Caldas   [[T::template U<int>::f()]];
945c8c92b54SEduardo Caldas   [[T::U::f()]];
946c8c92b54SEduardo Caldas   [[T::template f<0>()]];
947d17437d2SEduardo Caldas }
948d17437d2SEduardo Caldas )cpp",
949c8c92b54SEduardo Caldas       {R"txt(
950718e550cSEduardo Caldas CallExpression Expression
951718e550cSEduardo Caldas |-IdExpression Callee
952718e550cSEduardo Caldas | |-NestedNameSpecifier Qualifier
953718e550cSEduardo Caldas | | |-IdentifierNameSpecifier ListElement
9546118ce79SEduardo Caldas | | | `-'T'
955718e550cSEduardo Caldas | | |-'::' ListDelimiter
956718e550cSEduardo Caldas | | |-SimpleTemplateNameSpecifier ListElement
9576118ce79SEduardo Caldas | | | |-'template'
9586118ce79SEduardo Caldas | | | |-'U'
9596118ce79SEduardo Caldas | | | |-'<'
9606118ce79SEduardo Caldas | | | |-'int'
9616118ce79SEduardo Caldas | | | `-'>'
962718e550cSEduardo Caldas | | `-'::' ListDelimiter
963718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
9646118ce79SEduardo Caldas |   `-'f'
9652de2ca34SEduardo Caldas |-'(' OpenParen
9662de2ca34SEduardo Caldas `-')' CloseParen
967c8c92b54SEduardo Caldas )txt",
968c8c92b54SEduardo Caldas        R"txt(
969718e550cSEduardo Caldas CallExpression Expression
970718e550cSEduardo Caldas |-IdExpression Callee
971718e550cSEduardo Caldas | |-NestedNameSpecifier Qualifier
972718e550cSEduardo Caldas | | |-IdentifierNameSpecifier ListElement
9736118ce79SEduardo Caldas | | | `-'T'
974718e550cSEduardo Caldas | | |-'::' ListDelimiter
975718e550cSEduardo Caldas | | |-IdentifierNameSpecifier ListElement
9766118ce79SEduardo Caldas | | | `-'U'
977718e550cSEduardo Caldas | | `-'::' ListDelimiter
978718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
9796118ce79SEduardo Caldas |   `-'f'
9802de2ca34SEduardo Caldas |-'(' OpenParen
9812de2ca34SEduardo Caldas `-')' CloseParen
982c8c92b54SEduardo Caldas )txt",
983c8c92b54SEduardo Caldas        R"txt(
984718e550cSEduardo Caldas CallExpression Expression
985718e550cSEduardo Caldas |-IdExpression Callee
986718e550cSEduardo Caldas | |-NestedNameSpecifier Qualifier
987718e550cSEduardo Caldas | | |-IdentifierNameSpecifier ListElement
9886118ce79SEduardo Caldas | | | `-'T'
989718e550cSEduardo Caldas | | `-'::' ListDelimiter
9906118ce79SEduardo Caldas | |-'template' TemplateKeyword
991718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
9926118ce79SEduardo Caldas |   |-'f'
9936118ce79SEduardo Caldas |   |-'<'
994c8c92b54SEduardo Caldas |   |-IntegerLiteralExpression
9956118ce79SEduardo Caldas |   | `-'0' LiteralToken
9966118ce79SEduardo Caldas |   `-'>'
9972de2ca34SEduardo Caldas |-'(' OpenParen
9982de2ca34SEduardo Caldas `-')' CloseParen
999c8c92b54SEduardo Caldas )txt"}));
1000d17437d2SEduardo Caldas }
1001d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,This_Simple)1002c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, This_Simple) {
100385c15f17SEduardo Caldas   if (!GetParam().isCXX()) {
100485c15f17SEduardo Caldas     return;
100585c15f17SEduardo Caldas   }
100685c15f17SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
100785c15f17SEduardo Caldas       R"cpp(
100885c15f17SEduardo Caldas struct S {
100985c15f17SEduardo Caldas   S* test(){
101085c15f17SEduardo Caldas     return [[this]];
101185c15f17SEduardo Caldas   }
101285c15f17SEduardo Caldas };
101385c15f17SEduardo Caldas )cpp",
101485c15f17SEduardo Caldas       {R"txt(
1015718e550cSEduardo Caldas ThisExpression ReturnValue
10166118ce79SEduardo Caldas `-'this' IntroducerKeyword
101785c15f17SEduardo Caldas )txt"}));
101885c15f17SEduardo Caldas }
101985c15f17SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,This_ExplicitMemberAccess)1020c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, This_ExplicitMemberAccess) {
102185c15f17SEduardo Caldas   if (!GetParam().isCXX()) {
102285c15f17SEduardo Caldas     return;
102385c15f17SEduardo Caldas   }
102485c15f17SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
102585c15f17SEduardo Caldas       R"cpp(
102685c15f17SEduardo Caldas struct S {
102785c15f17SEduardo Caldas   int a;
102885c15f17SEduardo Caldas   void test(){
102985c15f17SEduardo Caldas     [[this->a]];
103085c15f17SEduardo Caldas   }
103185c15f17SEduardo Caldas };
103285c15f17SEduardo Caldas )cpp",
103385c15f17SEduardo Caldas       {R"txt(
1034718e550cSEduardo Caldas MemberExpression Expression
1035718e550cSEduardo Caldas |-ThisExpression Object
10366118ce79SEduardo Caldas | `-'this' IntroducerKeyword
1037718e550cSEduardo Caldas |-'->' AccessToken
1038718e550cSEduardo Caldas `-IdExpression Member
1039718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
10406118ce79SEduardo Caldas     `-'a'
104185c15f17SEduardo Caldas )txt"}));
104285c15f17SEduardo Caldas }
104385c15f17SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,This_ImplicitMemberAccess)1044c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, This_ImplicitMemberAccess) {
104585c15f17SEduardo Caldas   if (!GetParam().isCXX()) {
104685c15f17SEduardo Caldas     return;
104785c15f17SEduardo Caldas   }
104885c15f17SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
104985c15f17SEduardo Caldas       R"cpp(
105085c15f17SEduardo Caldas struct S {
105185c15f17SEduardo Caldas   int a;
105285c15f17SEduardo Caldas   void test(){
105385c15f17SEduardo Caldas     [[a]];
105485c15f17SEduardo Caldas   }
105585c15f17SEduardo Caldas };
105685c15f17SEduardo Caldas )cpp",
105785c15f17SEduardo Caldas       {R"txt(
1058718e550cSEduardo Caldas IdExpression Expression
1059718e550cSEduardo Caldas `-UnqualifiedId UnqualifiedId
10606118ce79SEduardo Caldas   `-'a'
106185c15f17SEduardo Caldas )txt"}));
106285c15f17SEduardo Caldas }
106385c15f17SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParenExpr)1064c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParenExpr) {
1065c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1066d17437d2SEduardo Caldas       R"cpp(
1067d17437d2SEduardo Caldas void test() {
1068c8c92b54SEduardo Caldas   [[(1)]];
1069c8c92b54SEduardo Caldas   [[((1))]];
1070c8c92b54SEduardo Caldas   [[(1 + (2))]];
1071d17437d2SEduardo Caldas }
1072d17437d2SEduardo Caldas )cpp",
1073c8c92b54SEduardo Caldas       {R"txt(
1074718e550cSEduardo Caldas ParenExpression Expression
10756118ce79SEduardo Caldas |-'(' OpenParen
1076718e550cSEduardo Caldas |-IntegerLiteralExpression SubExpression
10776118ce79SEduardo Caldas | `-'1' LiteralToken
10786118ce79SEduardo Caldas `-')' CloseParen
1079c8c92b54SEduardo Caldas )txt",
1080d17437d2SEduardo Caldas        R"txt(
1081718e550cSEduardo Caldas ParenExpression Expression
10826118ce79SEduardo Caldas |-'(' OpenParen
1083718e550cSEduardo Caldas |-ParenExpression SubExpression
10846118ce79SEduardo Caldas | |-'(' OpenParen
1085718e550cSEduardo Caldas | |-IntegerLiteralExpression SubExpression
10866118ce79SEduardo Caldas | | `-'1' LiteralToken
10876118ce79SEduardo Caldas | `-')' CloseParen
10886118ce79SEduardo Caldas `-')' CloseParen
1089c8c92b54SEduardo Caldas )txt",
1090c8c92b54SEduardo Caldas        R"txt(
1091718e550cSEduardo Caldas ParenExpression Expression
10926118ce79SEduardo Caldas |-'(' OpenParen
1093718e550cSEduardo Caldas |-BinaryOperatorExpression SubExpression
1094718e550cSEduardo Caldas | |-IntegerLiteralExpression LeftHandSide
10956118ce79SEduardo Caldas | | `-'1' LiteralToken
1096718e550cSEduardo Caldas | |-'+' OperatorToken
1097718e550cSEduardo Caldas | `-ParenExpression RightHandSide
10986118ce79SEduardo Caldas |   |-'(' OpenParen
1099718e550cSEduardo Caldas |   |-IntegerLiteralExpression SubExpression
11006118ce79SEduardo Caldas |   | `-'2' LiteralToken
11016118ce79SEduardo Caldas |   `-')' CloseParen
11026118ce79SEduardo Caldas `-')' CloseParen
1103c8c92b54SEduardo Caldas )txt"}));
1104d17437d2SEduardo Caldas }
1105d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UserDefinedLiteral_Char)1106c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_Char) {
1107d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1108d17437d2SEduardo Caldas     return;
1109d17437d2SEduardo Caldas   }
1110c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1111d17437d2SEduardo Caldas       R"cpp(
1112d17437d2SEduardo Caldas unsigned operator "" _c(char);
1113d17437d2SEduardo Caldas void test() {
1114c8c92b54SEduardo Caldas   [['2'_c]];
1115d17437d2SEduardo Caldas }
1116d17437d2SEduardo Caldas     )cpp",
1117c8c92b54SEduardo Caldas       {R"txt(
1118718e550cSEduardo Caldas CharUserDefinedLiteralExpression Expression
11196118ce79SEduardo Caldas `-''2'_c' LiteralToken
1120c8c92b54SEduardo Caldas )txt"}));
1121d17437d2SEduardo Caldas }
1122d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UserDefinedLiteral_String)1123c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_String) {
1124d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1125d17437d2SEduardo Caldas     return;
1126d17437d2SEduardo Caldas   }
1127c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1128d17437d2SEduardo Caldas       R"cpp(
1129d17437d2SEduardo Caldas typedef decltype(sizeof(void *)) size_t;
1130d17437d2SEduardo Caldas 
1131d17437d2SEduardo Caldas unsigned operator "" _s(const char*, size_t);
1132d17437d2SEduardo Caldas 
1133d17437d2SEduardo Caldas void test() {
1134c8c92b54SEduardo Caldas   [["12"_s]];
1135d17437d2SEduardo Caldas }
1136d17437d2SEduardo Caldas     )cpp",
1137c8c92b54SEduardo Caldas       {R"txt(
1138718e550cSEduardo Caldas StringUserDefinedLiteralExpression Expression
11396118ce79SEduardo Caldas `-'"12"_s' LiteralToken
1140c8c92b54SEduardo Caldas )txt"}));
1141d17437d2SEduardo Caldas }
1142d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UserDefinedLiteral_Integer)1143c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_Integer) {
1144d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1145d17437d2SEduardo Caldas     return;
1146d17437d2SEduardo Caldas   }
1147c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1148d17437d2SEduardo Caldas       R"cpp(
1149d17437d2SEduardo Caldas unsigned operator "" _i(unsigned long long);
1150d17437d2SEduardo Caldas unsigned operator "" _r(const char*);
1151d17437d2SEduardo Caldas template <char...>
1152d17437d2SEduardo Caldas unsigned operator "" _t();
1153d17437d2SEduardo Caldas 
1154d17437d2SEduardo Caldas void test() {
1155c8c92b54SEduardo Caldas   [[12_i]];
1156c8c92b54SEduardo Caldas   [[12_r]];
1157c8c92b54SEduardo Caldas   [[12_t]];
1158d17437d2SEduardo Caldas }
1159d17437d2SEduardo Caldas     )cpp",
1160c8c92b54SEduardo Caldas       {R"txt(
1161718e550cSEduardo Caldas IntegerUserDefinedLiteralExpression Expression
11626118ce79SEduardo Caldas `-'12_i' LiteralToken
1163c8c92b54SEduardo Caldas )txt",
1164d17437d2SEduardo Caldas        R"txt(
1165718e550cSEduardo Caldas IntegerUserDefinedLiteralExpression Expression
11666118ce79SEduardo Caldas `-'12_r' LiteralToken
1167c8c92b54SEduardo Caldas )txt",
1168c8c92b54SEduardo Caldas        R"txt(
1169718e550cSEduardo Caldas IntegerUserDefinedLiteralExpression Expression
11706118ce79SEduardo Caldas `-'12_t' LiteralToken
1171c8c92b54SEduardo Caldas )txt"}));
1172d17437d2SEduardo Caldas }
1173d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UserDefinedLiteral_Float)1174c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_Float) {
1175d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1176d17437d2SEduardo Caldas     return;
1177d17437d2SEduardo Caldas   }
1178c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1179d17437d2SEduardo Caldas       R"cpp(
1180d17437d2SEduardo Caldas unsigned operator "" _f(long double);
1181d17437d2SEduardo Caldas unsigned operator "" _r(const char*);
1182d17437d2SEduardo Caldas template <char...>
1183d17437d2SEduardo Caldas unsigned operator "" _t();
1184d17437d2SEduardo Caldas 
1185d17437d2SEduardo Caldas void test() {
1186c8c92b54SEduardo Caldas   [[1.2_f]];
1187c8c92b54SEduardo Caldas   [[1.2_r]];
1188c8c92b54SEduardo Caldas   [[1.2_t]];
1189d17437d2SEduardo Caldas }
1190d17437d2SEduardo Caldas     )cpp",
1191c8c92b54SEduardo Caldas       {R"txt(
1192718e550cSEduardo Caldas FloatUserDefinedLiteralExpression Expression
11936118ce79SEduardo Caldas `-'1.2_f' LiteralToken
1194c8c92b54SEduardo Caldas )txt",
1195d17437d2SEduardo Caldas        R"txt(
1196718e550cSEduardo Caldas FloatUserDefinedLiteralExpression Expression
11976118ce79SEduardo Caldas `-'1.2_r' LiteralToken
1198c8c92b54SEduardo Caldas )txt",
1199c8c92b54SEduardo Caldas        R"txt(
1200718e550cSEduardo Caldas FloatUserDefinedLiteralExpression Expression
12016118ce79SEduardo Caldas `-'1.2_t' LiteralToken
1202c8c92b54SEduardo Caldas )txt"}));
1203d17437d2SEduardo Caldas }
1204d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,IntegerLiteral_LongLong)1205c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, IntegerLiteral_LongLong) {
1206d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1207d17437d2SEduardo Caldas     return;
1208d17437d2SEduardo Caldas   }
1209c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1210d17437d2SEduardo Caldas       R"cpp(
1211d17437d2SEduardo Caldas void test() {
1212c8c92b54SEduardo Caldas   [[12ll]];
1213c8c92b54SEduardo Caldas   [[12ull]];
1214d17437d2SEduardo Caldas }
1215d17437d2SEduardo Caldas )cpp",
1216c8c92b54SEduardo Caldas       {R"txt(
1217718e550cSEduardo Caldas IntegerLiteralExpression Expression
12186118ce79SEduardo Caldas `-'12ll' LiteralToken
1219c8c92b54SEduardo Caldas )txt",
1220d17437d2SEduardo Caldas        R"txt(
1221718e550cSEduardo Caldas IntegerLiteralExpression Expression
12226118ce79SEduardo Caldas `-'12ull' LiteralToken
1223c8c92b54SEduardo Caldas )txt"}));
1224d17437d2SEduardo Caldas }
1225d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,IntegerLiteral_Binary)1226c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, IntegerLiteral_Binary) {
1227d17437d2SEduardo Caldas   if (!GetParam().isCXX14OrLater()) {
1228d17437d2SEduardo Caldas     return;
1229d17437d2SEduardo Caldas   }
1230c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1231d17437d2SEduardo Caldas       R"cpp(
1232d17437d2SEduardo Caldas void test() {
1233c8c92b54SEduardo Caldas   [[0b1100]];
1234d17437d2SEduardo Caldas }
1235d17437d2SEduardo Caldas )cpp",
1236c8c92b54SEduardo Caldas       {R"txt(
1237718e550cSEduardo Caldas IntegerLiteralExpression Expression
12386118ce79SEduardo Caldas `-'0b1100' LiteralToken
1239c8c92b54SEduardo Caldas )txt"}));
1240d17437d2SEduardo Caldas }
1241d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,IntegerLiteral_WithDigitSeparators)1242c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, IntegerLiteral_WithDigitSeparators) {
1243d17437d2SEduardo Caldas   if (!GetParam().isCXX14OrLater()) {
1244d17437d2SEduardo Caldas     return;
1245d17437d2SEduardo Caldas   }
1246c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1247d17437d2SEduardo Caldas       R"cpp(
1248d17437d2SEduardo Caldas void test() {
1249c8c92b54SEduardo Caldas   [[1'2'0ull]];
1250d17437d2SEduardo Caldas }
1251d17437d2SEduardo Caldas )cpp",
1252c8c92b54SEduardo Caldas       {R"txt(
1253718e550cSEduardo Caldas IntegerLiteralExpression Expression
12546118ce79SEduardo Caldas `-'1'2'0ull' LiteralToken
1255c8c92b54SEduardo Caldas )txt"}));
1256d17437d2SEduardo Caldas }
1257d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CharacterLiteral)1258c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CharacterLiteral) {
1259c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1260d17437d2SEduardo Caldas       R"cpp(
1261d17437d2SEduardo Caldas void test() {
1262c8c92b54SEduardo Caldas   [['a']];
1263c8c92b54SEduardo Caldas   [['\n']];
1264c8c92b54SEduardo Caldas   [['\x20']];
1265c8c92b54SEduardo Caldas   [['\0']];
1266c8c92b54SEduardo Caldas   [[L'a']];
1267c8c92b54SEduardo Caldas   [[L'α']];
1268d17437d2SEduardo Caldas }
1269d17437d2SEduardo Caldas )cpp",
1270c8c92b54SEduardo Caldas       {R"txt(
1271718e550cSEduardo Caldas CharacterLiteralExpression Expression
12726118ce79SEduardo Caldas `-''a'' LiteralToken
1273c8c92b54SEduardo Caldas )txt",
1274d17437d2SEduardo Caldas        R"txt(
1275718e550cSEduardo Caldas CharacterLiteralExpression Expression
12766118ce79SEduardo Caldas `-''\n'' LiteralToken
1277c8c92b54SEduardo Caldas )txt",
1278c8c92b54SEduardo Caldas        R"txt(
1279718e550cSEduardo Caldas CharacterLiteralExpression Expression
12806118ce79SEduardo Caldas `-''\x20'' LiteralToken
1281c8c92b54SEduardo Caldas )txt",
1282c8c92b54SEduardo Caldas        R"txt(
1283718e550cSEduardo Caldas CharacterLiteralExpression Expression
12846118ce79SEduardo Caldas `-''\0'' LiteralToken
1285c8c92b54SEduardo Caldas )txt",
1286c8c92b54SEduardo Caldas        R"txt(
1287718e550cSEduardo Caldas CharacterLiteralExpression Expression
12886118ce79SEduardo Caldas `-'L'a'' LiteralToken
1289c8c92b54SEduardo Caldas )txt",
1290c8c92b54SEduardo Caldas        R"txt(
1291718e550cSEduardo Caldas CharacterLiteralExpression Expression
12926118ce79SEduardo Caldas `-'L'α'' LiteralToken
1293c8c92b54SEduardo Caldas )txt"}));
1294d17437d2SEduardo Caldas }
1295d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CharacterLiteral_Utf)1296c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CharacterLiteral_Utf) {
1297d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1298d17437d2SEduardo Caldas     return;
1299d17437d2SEduardo Caldas   }
1300c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1301d17437d2SEduardo Caldas       R"cpp(
1302d17437d2SEduardo Caldas void test() {
1303c8c92b54SEduardo Caldas   [[u'a']];
1304c8c92b54SEduardo Caldas   [[u'構']];
1305c8c92b54SEduardo Caldas   [[U'a']];
1306c8c92b54SEduardo Caldas   [[U'��']];
1307d17437d2SEduardo Caldas }
1308d17437d2SEduardo Caldas )cpp",
1309c8c92b54SEduardo Caldas       {R"txt(
1310718e550cSEduardo Caldas CharacterLiteralExpression Expression
13116118ce79SEduardo Caldas `-'u'a'' LiteralToken
1312c8c92b54SEduardo Caldas )txt",
1313d17437d2SEduardo Caldas        R"txt(
1314718e550cSEduardo Caldas CharacterLiteralExpression Expression
13156118ce79SEduardo Caldas `-'u'構'' LiteralToken
1316c8c92b54SEduardo Caldas )txt",
1317c8c92b54SEduardo Caldas        R"txt(
1318718e550cSEduardo Caldas CharacterLiteralExpression Expression
13196118ce79SEduardo Caldas `-'U'a'' LiteralToken
1320c8c92b54SEduardo Caldas )txt",
1321c8c92b54SEduardo Caldas        R"txt(
1322718e550cSEduardo Caldas CharacterLiteralExpression Expression
13236118ce79SEduardo Caldas `-'U'��'' LiteralToken
1324c8c92b54SEduardo Caldas )txt"}));
1325d17437d2SEduardo Caldas }
1326d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CharacterLiteral_Utf8)1327c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CharacterLiteral_Utf8) {
1328d17437d2SEduardo Caldas   if (!GetParam().isCXX17OrLater()) {
1329d17437d2SEduardo Caldas     return;
1330d17437d2SEduardo Caldas   }
1331c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1332d17437d2SEduardo Caldas       R"cpp(
1333d17437d2SEduardo Caldas void test() {
1334c8c92b54SEduardo Caldas   [[u8'a']];
1335c8c92b54SEduardo Caldas   [[u8'\x7f']];
1336d17437d2SEduardo Caldas }
1337d17437d2SEduardo Caldas )cpp",
1338c8c92b54SEduardo Caldas       {R"txt(
1339718e550cSEduardo Caldas CharacterLiteralExpression Expression
13406118ce79SEduardo Caldas `-'u8'a'' LiteralToken
1341c8c92b54SEduardo Caldas )txt",
1342d17437d2SEduardo Caldas        R"txt(
1343718e550cSEduardo Caldas CharacterLiteralExpression Expression
13446118ce79SEduardo Caldas `-'u8'\x7f'' LiteralToken
1345c8c92b54SEduardo Caldas )txt"}));
1346d17437d2SEduardo Caldas }
1347d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,FloatingLiteral)1348c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, FloatingLiteral) {
1349c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1350d17437d2SEduardo Caldas       R"cpp(
1351d17437d2SEduardo Caldas void test() {
1352c8c92b54SEduardo Caldas   [[1e-2]];
1353c8c92b54SEduardo Caldas   [[2.]];
1354c8c92b54SEduardo Caldas   [[.2]];
1355c8c92b54SEduardo Caldas   [[2.f]];
1356d17437d2SEduardo Caldas }
1357d17437d2SEduardo Caldas )cpp",
1358c8c92b54SEduardo Caldas       {R"txt(
1359718e550cSEduardo Caldas FloatingLiteralExpression Expression
13606118ce79SEduardo Caldas `-'1e-2' LiteralToken
1361c8c92b54SEduardo Caldas )txt",
1362d17437d2SEduardo Caldas        R"txt(
1363718e550cSEduardo Caldas FloatingLiteralExpression Expression
13646118ce79SEduardo Caldas `-'2.' LiteralToken
1365c8c92b54SEduardo Caldas )txt",
1366c8c92b54SEduardo Caldas        R"txt(
1367718e550cSEduardo Caldas FloatingLiteralExpression Expression
13686118ce79SEduardo Caldas `-'.2' LiteralToken
1369c8c92b54SEduardo Caldas )txt",
1370c8c92b54SEduardo Caldas        R"txt(
1371718e550cSEduardo Caldas FloatingLiteralExpression Expression
13726118ce79SEduardo Caldas `-'2.f' LiteralToken
1373c8c92b54SEduardo Caldas )txt"}));
1374d17437d2SEduardo Caldas }
1375d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,FloatingLiteral_Hexadecimal)1376c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, FloatingLiteral_Hexadecimal) {
1377d17437d2SEduardo Caldas   if (!GetParam().isCXX17OrLater()) {
1378d17437d2SEduardo Caldas     return;
1379d17437d2SEduardo Caldas   }
1380c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1381d17437d2SEduardo Caldas       R"cpp(
1382d17437d2SEduardo Caldas void test() {
1383c8c92b54SEduardo Caldas   [[0xfp1]];
1384c8c92b54SEduardo Caldas   [[0xf.p1]];
1385c8c92b54SEduardo Caldas   [[0x.fp1]];
1386c8c92b54SEduardo Caldas   [[0xf.fp1f]];
1387d17437d2SEduardo Caldas }
1388d17437d2SEduardo Caldas )cpp",
1389c8c92b54SEduardo Caldas       {R"txt(
1390718e550cSEduardo Caldas FloatingLiteralExpression Expression
13916118ce79SEduardo Caldas `-'0xfp1' LiteralToken
1392c8c92b54SEduardo Caldas )txt",
1393d17437d2SEduardo Caldas        R"txt(
1394718e550cSEduardo Caldas FloatingLiteralExpression Expression
13956118ce79SEduardo Caldas `-'0xf.p1' LiteralToken
1396c8c92b54SEduardo Caldas )txt",
1397c8c92b54SEduardo Caldas        R"txt(
1398718e550cSEduardo Caldas FloatingLiteralExpression Expression
13996118ce79SEduardo Caldas `-'0x.fp1' LiteralToken
1400c8c92b54SEduardo Caldas )txt",
1401c8c92b54SEduardo Caldas        R"txt(
1402718e550cSEduardo Caldas FloatingLiteralExpression Expression
14036118ce79SEduardo Caldas `-'0xf.fp1f' LiteralToken
1404c8c92b54SEduardo Caldas )txt"}));
1405d17437d2SEduardo Caldas }
1406d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,StringLiteral)1407c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, StringLiteral) {
1408c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1409d17437d2SEduardo Caldas       R"cpp(
1410d17437d2SEduardo Caldas void test() {
1411c8c92b54SEduardo Caldas   [["a\n\0\x20"]];
1412c8c92b54SEduardo Caldas   [[L"αβ"]];
1413d17437d2SEduardo Caldas }
1414d17437d2SEduardo Caldas )cpp",
1415c8c92b54SEduardo Caldas       {R"txt(
1416718e550cSEduardo Caldas StringLiteralExpression Expression
14176118ce79SEduardo Caldas `-'"a\n\0\x20"' LiteralToken
1418c8c92b54SEduardo Caldas )txt",
1419d17437d2SEduardo Caldas        R"txt(
1420718e550cSEduardo Caldas StringLiteralExpression Expression
14216118ce79SEduardo Caldas `-'L"αβ"' LiteralToken
1422c8c92b54SEduardo Caldas )txt"}));
1423d17437d2SEduardo Caldas }
1424d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,StringLiteral_Utf)1425c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, StringLiteral_Utf) {
1426d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1427d17437d2SEduardo Caldas     return;
1428d17437d2SEduardo Caldas   }
1429c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1430d17437d2SEduardo Caldas       R"cpp(
1431d17437d2SEduardo Caldas void test() {
1432c8c92b54SEduardo Caldas   [[u8"a\x1f\x05"]];
1433c8c92b54SEduardo Caldas   [[u"C++抽象構文木"]];
1434c8c92b54SEduardo Caldas   [[U"����\n"]];
1435d17437d2SEduardo Caldas }
1436d17437d2SEduardo Caldas )cpp",
1437c8c92b54SEduardo Caldas       {R"txt(
1438718e550cSEduardo Caldas StringLiteralExpression Expression
14396118ce79SEduardo Caldas `-'u8"a\x1f\x05"' LiteralToken
1440c8c92b54SEduardo Caldas )txt",
1441d17437d2SEduardo Caldas        R"txt(
1442718e550cSEduardo Caldas StringLiteralExpression Expression
14436118ce79SEduardo Caldas `-'u"C++抽象構文木"' LiteralToken
1444c8c92b54SEduardo Caldas )txt",
1445c8c92b54SEduardo Caldas        R"txt(
1446718e550cSEduardo Caldas StringLiteralExpression Expression
14476118ce79SEduardo Caldas `-'U"����\n"' LiteralToken
1448c8c92b54SEduardo Caldas )txt"}));
1449d17437d2SEduardo Caldas }
1450d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,StringLiteral_Raw)1451c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, StringLiteral_Raw) {
1452d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1453d17437d2SEduardo Caldas     return;
1454d17437d2SEduardo Caldas   }
1455d17437d2SEduardo Caldas   // This test uses regular string literals instead of raw string literals to
1456d17437d2SEduardo Caldas   // hold source code and expected output because of a bug in MSVC up to MSVC
1457d17437d2SEduardo Caldas   // 2019 16.2:
1458d17437d2SEduardo Caldas   // https://developercommunity.visualstudio.com/content/problem/67300/stringifying-raw-string-literal.html
1459d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual( //
1460d17437d2SEduardo Caldas       "void test() {\n"
1461d17437d2SEduardo Caldas       "  R\"SyntaxTree(\n"
1462d17437d2SEduardo Caldas       "  Hello \"Syntax\" \\\"\n"
1463d17437d2SEduardo Caldas       "  )SyntaxTree\";\n"
1464d17437d2SEduardo Caldas       "}\n",
14656118ce79SEduardo Caldas       "TranslationUnit Detached\n"
1466d17437d2SEduardo Caldas       "`-SimpleDeclaration\n"
14676118ce79SEduardo Caldas       "  |-'void'\n"
14685011d431SEduardo Caldas       "  |-DeclaratorList Declarators\n"
14695011d431SEduardo Caldas       "  | `-SimpleDeclarator ListElement\n"
14706118ce79SEduardo Caldas       "  |   |-'test'\n"
1471d17437d2SEduardo Caldas       "  |   `-ParametersAndQualifiers\n"
14726118ce79SEduardo Caldas       "  |     |-'(' OpenParen\n"
14736118ce79SEduardo Caldas       "  |     `-')' CloseParen\n"
1474d17437d2SEduardo Caldas       "  `-CompoundStatement\n"
14756118ce79SEduardo Caldas       "    |-'{' OpenParen\n"
1476718e550cSEduardo Caldas       "    |-ExpressionStatement Statement\n"
1477718e550cSEduardo Caldas       "    | |-StringLiteralExpression Expression\n"
14786118ce79SEduardo Caldas       "    | | `-'R\"SyntaxTree(\n"
1479d17437d2SEduardo Caldas       "  Hello \"Syntax\" \\\"\n"
14806118ce79SEduardo Caldas       "  )SyntaxTree\"' LiteralToken\n"
14816118ce79SEduardo Caldas       "    | `-';'\n"
14826118ce79SEduardo Caldas       "    `-'}' CloseParen\n"));
1483d17437d2SEduardo Caldas }
1484d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,BoolLiteral)1485c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, BoolLiteral) {
1486d17437d2SEduardo Caldas   if (GetParam().isC()) {
1487d17437d2SEduardo Caldas     return;
1488d17437d2SEduardo Caldas   }
1489c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1490d17437d2SEduardo Caldas       R"cpp(
1491d17437d2SEduardo Caldas void test() {
1492c8c92b54SEduardo Caldas   [[true]];
1493c8c92b54SEduardo Caldas   [[false]];
1494d17437d2SEduardo Caldas }
1495d17437d2SEduardo Caldas )cpp",
1496c8c92b54SEduardo Caldas       {R"txt(
1497718e550cSEduardo Caldas BoolLiteralExpression Expression
14986118ce79SEduardo Caldas `-'true' LiteralToken
1499c8c92b54SEduardo Caldas )txt",
1500d17437d2SEduardo Caldas        R"txt(
1501718e550cSEduardo Caldas BoolLiteralExpression Expression
15026118ce79SEduardo Caldas `-'false' LiteralToken
1503c8c92b54SEduardo Caldas )txt"}));
1504d17437d2SEduardo Caldas }
1505d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CxxNullPtrLiteral)1506c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CxxNullPtrLiteral) {
1507d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
1508d17437d2SEduardo Caldas     return;
1509d17437d2SEduardo Caldas   }
1510c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1511d17437d2SEduardo Caldas       R"cpp(
1512d17437d2SEduardo Caldas void test() {
1513c8c92b54SEduardo Caldas   [[nullptr]];
1514d17437d2SEduardo Caldas }
1515d17437d2SEduardo Caldas )cpp",
1516c8c92b54SEduardo Caldas       {R"txt(
1517718e550cSEduardo Caldas CxxNullPtrExpression Expression
15186118ce79SEduardo Caldas `-'nullptr' LiteralToken
1519c8c92b54SEduardo Caldas )txt"}));
1520d17437d2SEduardo Caldas }
1521d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,PostfixUnaryOperator)1522c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, PostfixUnaryOperator) {
1523c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1524d17437d2SEduardo Caldas       R"cpp(
1525d17437d2SEduardo Caldas void test(int a) {
1526c8c92b54SEduardo Caldas   [[a++]];
1527c8c92b54SEduardo Caldas   [[a--]];
1528d17437d2SEduardo Caldas }
1529d17437d2SEduardo Caldas )cpp",
1530c8c92b54SEduardo Caldas       {R"txt(
1531718e550cSEduardo Caldas PostfixUnaryOperatorExpression Expression
1532718e550cSEduardo Caldas |-IdExpression Operand
1533718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
15346118ce79SEduardo Caldas |   `-'a'
1535718e550cSEduardo Caldas `-'++' OperatorToken
1536c8c92b54SEduardo Caldas )txt",
1537d17437d2SEduardo Caldas        R"txt(
1538718e550cSEduardo Caldas PostfixUnaryOperatorExpression Expression
1539718e550cSEduardo Caldas |-IdExpression Operand
1540718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
15416118ce79SEduardo Caldas |   `-'a'
1542718e550cSEduardo Caldas `-'--' OperatorToken
1543c8c92b54SEduardo Caldas )txt"}));
1544d17437d2SEduardo Caldas }
1545d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,PrefixUnaryOperator)1546c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, PrefixUnaryOperator) {
1547c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1548d17437d2SEduardo Caldas       R"cpp(
1549d17437d2SEduardo Caldas void test(int a, int *ap) {
1550c8c92b54SEduardo Caldas   [[--a]]; [[++a]];
1551c8c92b54SEduardo Caldas   [[~a]];
1552c8c92b54SEduardo Caldas   [[-a]];
1553c8c92b54SEduardo Caldas   [[+a]];
1554c8c92b54SEduardo Caldas   [[&a]];
1555c8c92b54SEduardo Caldas   [[*ap]];
1556c8c92b54SEduardo Caldas   [[!a]];
1557c8c92b54SEduardo Caldas   [[__real a]]; [[__imag a]];
1558d17437d2SEduardo Caldas }
1559d17437d2SEduardo Caldas )cpp",
1560c8c92b54SEduardo Caldas       {R"txt(
1561718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1562718e550cSEduardo Caldas |-'--' OperatorToken
1563718e550cSEduardo Caldas `-IdExpression Operand
1564718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
15656118ce79SEduardo Caldas     `-'a'
1566c8c92b54SEduardo Caldas )txt",
1567d17437d2SEduardo Caldas        R"txt(
1568718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1569718e550cSEduardo Caldas |-'++' OperatorToken
1570718e550cSEduardo Caldas `-IdExpression Operand
1571718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
15726118ce79SEduardo Caldas     `-'a'
1573c8c92b54SEduardo Caldas )txt",
1574c8c92b54SEduardo Caldas        R"txt(
1575718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1576718e550cSEduardo Caldas |-'~' OperatorToken
1577718e550cSEduardo Caldas `-IdExpression Operand
1578718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
15796118ce79SEduardo Caldas     `-'a'
1580c8c92b54SEduardo Caldas )txt",
1581c8c92b54SEduardo Caldas        R"txt(
1582718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1583718e550cSEduardo Caldas |-'-' OperatorToken
1584718e550cSEduardo Caldas `-IdExpression Operand
1585718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
15866118ce79SEduardo Caldas     `-'a'
1587c8c92b54SEduardo Caldas )txt",
1588c8c92b54SEduardo Caldas        R"txt(
1589718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1590718e550cSEduardo Caldas |-'+' OperatorToken
1591718e550cSEduardo Caldas `-IdExpression Operand
1592718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
15936118ce79SEduardo Caldas     `-'a'
1594c8c92b54SEduardo Caldas )txt",
1595c8c92b54SEduardo Caldas        R"txt(
1596718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1597718e550cSEduardo Caldas |-'&' OperatorToken
1598718e550cSEduardo Caldas `-IdExpression Operand
1599718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
16006118ce79SEduardo Caldas     `-'a'
1601c8c92b54SEduardo Caldas )txt",
1602c8c92b54SEduardo Caldas        R"txt(
1603718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1604718e550cSEduardo Caldas |-'*' OperatorToken
1605718e550cSEduardo Caldas `-IdExpression Operand
1606718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
16076118ce79SEduardo Caldas     `-'ap'
1608c8c92b54SEduardo Caldas )txt",
1609c8c92b54SEduardo Caldas        R"txt(
1610718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1611718e550cSEduardo Caldas |-'!' OperatorToken
1612718e550cSEduardo Caldas `-IdExpression Operand
1613718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
16146118ce79SEduardo Caldas     `-'a'
1615c8c92b54SEduardo Caldas )txt",
1616c8c92b54SEduardo Caldas        R"txt(
1617718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1618718e550cSEduardo Caldas |-'__real' OperatorToken
1619718e550cSEduardo Caldas `-IdExpression Operand
1620718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
16216118ce79SEduardo Caldas     `-'a'
1622c8c92b54SEduardo Caldas )txt",
1623c8c92b54SEduardo Caldas        R"txt(
1624718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1625718e550cSEduardo Caldas |-'__imag' OperatorToken
1626718e550cSEduardo Caldas `-IdExpression Operand
1627718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
16286118ce79SEduardo Caldas     `-'a'
1629c8c92b54SEduardo Caldas )txt"}));
1630d17437d2SEduardo Caldas }
1631d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,PrefixUnaryOperatorCxx)1632c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, PrefixUnaryOperatorCxx) {
1633d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
1634d17437d2SEduardo Caldas     return;
1635d17437d2SEduardo Caldas   }
1636c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1637d17437d2SEduardo Caldas       R"cpp(
1638d17437d2SEduardo Caldas void test(int a, bool b) {
1639c8c92b54SEduardo Caldas   [[compl a]];
1640c8c92b54SEduardo Caldas   [[not b]];
1641d17437d2SEduardo Caldas }
1642d17437d2SEduardo Caldas )cpp",
1643c8c92b54SEduardo Caldas       {R"txt(
1644718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1645718e550cSEduardo Caldas |-'compl' OperatorToken
1646718e550cSEduardo Caldas `-IdExpression Operand
1647718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
16486118ce79SEduardo Caldas     `-'a'
1649c8c92b54SEduardo Caldas )txt",
1650d17437d2SEduardo Caldas        R"txt(
1651718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
1652718e550cSEduardo Caldas |-'not' OperatorToken
1653718e550cSEduardo Caldas `-IdExpression Operand
1654718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
16556118ce79SEduardo Caldas     `-'b'
1656c8c92b54SEduardo Caldas )txt"}));
1657d17437d2SEduardo Caldas }
1658d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,BinaryOperator)1659c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, BinaryOperator) {
1660c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1661d17437d2SEduardo Caldas       R"cpp(
1662d17437d2SEduardo Caldas void test(int a) {
1663c8c92b54SEduardo Caldas   [[1 - 2]];
1664c8c92b54SEduardo Caldas   [[1 == 2]];
1665c8c92b54SEduardo Caldas   [[a = 1]];
1666c8c92b54SEduardo Caldas   [[a <<= 1]];
1667c8c92b54SEduardo Caldas   [[1 || 0]];
1668c8c92b54SEduardo Caldas   [[1 & 2]];
1669c8c92b54SEduardo Caldas   [[a != 3]];
1670d17437d2SEduardo Caldas }
1671d17437d2SEduardo Caldas )cpp",
1672c8c92b54SEduardo Caldas       {R"txt(
1673718e550cSEduardo Caldas BinaryOperatorExpression Expression
1674718e550cSEduardo Caldas |-IntegerLiteralExpression LeftHandSide
16756118ce79SEduardo Caldas | `-'1' LiteralToken
1676718e550cSEduardo Caldas |-'-' OperatorToken
1677718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
16786118ce79SEduardo Caldas   `-'2' LiteralToken
1679c8c92b54SEduardo Caldas )txt",
1680d17437d2SEduardo Caldas        R"txt(
1681718e550cSEduardo Caldas BinaryOperatorExpression Expression
1682718e550cSEduardo Caldas |-IntegerLiteralExpression LeftHandSide
16836118ce79SEduardo Caldas | `-'1' LiteralToken
1684718e550cSEduardo Caldas |-'==' OperatorToken
1685718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
16866118ce79SEduardo Caldas   `-'2' LiteralToken
1687c8c92b54SEduardo Caldas )txt",
1688c8c92b54SEduardo Caldas        R"txt(
1689718e550cSEduardo Caldas BinaryOperatorExpression Expression
1690718e550cSEduardo Caldas |-IdExpression LeftHandSide
1691718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
16926118ce79SEduardo Caldas |   `-'a'
1693718e550cSEduardo Caldas |-'=' OperatorToken
1694718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
16956118ce79SEduardo Caldas   `-'1' LiteralToken
1696c8c92b54SEduardo Caldas )txt",
1697c8c92b54SEduardo Caldas        R"txt(
1698718e550cSEduardo Caldas BinaryOperatorExpression Expression
1699718e550cSEduardo Caldas |-IdExpression LeftHandSide
1700718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
17016118ce79SEduardo Caldas |   `-'a'
1702718e550cSEduardo Caldas |-'<<=' OperatorToken
1703718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
17046118ce79SEduardo Caldas   `-'1' LiteralToken
1705c8c92b54SEduardo Caldas )txt",
1706c8c92b54SEduardo Caldas        R"txt(
1707718e550cSEduardo Caldas BinaryOperatorExpression Expression
1708718e550cSEduardo Caldas |-IntegerLiteralExpression LeftHandSide
17096118ce79SEduardo Caldas | `-'1' LiteralToken
1710718e550cSEduardo Caldas |-'||' OperatorToken
1711718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
17126118ce79SEduardo Caldas   `-'0' LiteralToken
1713c8c92b54SEduardo Caldas )txt",
1714c8c92b54SEduardo Caldas        R"txt(
1715718e550cSEduardo Caldas BinaryOperatorExpression Expression
1716718e550cSEduardo Caldas |-IntegerLiteralExpression LeftHandSide
17176118ce79SEduardo Caldas | `-'1' LiteralToken
1718718e550cSEduardo Caldas |-'&' OperatorToken
1719718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
17206118ce79SEduardo Caldas   `-'2' LiteralToken
1721c8c92b54SEduardo Caldas )txt",
1722c8c92b54SEduardo Caldas        R"txt(
1723718e550cSEduardo Caldas BinaryOperatorExpression Expression
1724718e550cSEduardo Caldas |-IdExpression LeftHandSide
1725718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
17266118ce79SEduardo Caldas |   `-'a'
1727718e550cSEduardo Caldas |-'!=' OperatorToken
1728718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
17296118ce79SEduardo Caldas   `-'3' LiteralToken
1730c8c92b54SEduardo Caldas )txt"}));
1731d17437d2SEduardo Caldas }
1732d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,BinaryOperatorCxx)1733c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, BinaryOperatorCxx) {
1734d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
1735d17437d2SEduardo Caldas     return;
1736d17437d2SEduardo Caldas   }
1737c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1738d17437d2SEduardo Caldas       R"cpp(
1739d17437d2SEduardo Caldas void test(int a) {
1740c8c92b54SEduardo Caldas   [[true || false]];
1741c8c92b54SEduardo Caldas   [[true or false]];
1742c8c92b54SEduardo Caldas   [[1 bitand 2]];
1743c8c92b54SEduardo Caldas   [[a xor_eq 3]];
1744d17437d2SEduardo Caldas }
1745d17437d2SEduardo Caldas )cpp",
1746c8c92b54SEduardo Caldas       {R"txt(
1747718e550cSEduardo Caldas BinaryOperatorExpression Expression
1748718e550cSEduardo Caldas |-BoolLiteralExpression LeftHandSide
17496118ce79SEduardo Caldas | `-'true' LiteralToken
1750718e550cSEduardo Caldas |-'||' OperatorToken
1751718e550cSEduardo Caldas `-BoolLiteralExpression RightHandSide
17526118ce79SEduardo Caldas   `-'false' LiteralToken
1753c8c92b54SEduardo Caldas )txt",
1754d17437d2SEduardo Caldas        R"txt(
1755718e550cSEduardo Caldas BinaryOperatorExpression Expression
1756718e550cSEduardo Caldas |-BoolLiteralExpression LeftHandSide
17576118ce79SEduardo Caldas | `-'true' LiteralToken
1758718e550cSEduardo Caldas |-'or' OperatorToken
1759718e550cSEduardo Caldas `-BoolLiteralExpression RightHandSide
17606118ce79SEduardo Caldas   `-'false' LiteralToken
1761c8c92b54SEduardo Caldas )txt",
1762c8c92b54SEduardo Caldas        R"txt(
1763718e550cSEduardo Caldas BinaryOperatorExpression Expression
1764718e550cSEduardo Caldas |-IntegerLiteralExpression LeftHandSide
17656118ce79SEduardo Caldas | `-'1' LiteralToken
1766718e550cSEduardo Caldas |-'bitand' OperatorToken
1767718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
17686118ce79SEduardo Caldas   `-'2' LiteralToken
1769c8c92b54SEduardo Caldas )txt",
1770c8c92b54SEduardo Caldas        R"txt(
1771718e550cSEduardo Caldas BinaryOperatorExpression Expression
1772718e550cSEduardo Caldas |-IdExpression LeftHandSide
1773718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
17746118ce79SEduardo Caldas |   `-'a'
1775718e550cSEduardo Caldas |-'xor_eq' OperatorToken
1776718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
17776118ce79SEduardo Caldas   `-'3' LiteralToken
1778c8c92b54SEduardo Caldas )txt"}));
1779d17437d2SEduardo Caldas }
1780d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,BinaryOperator_NestedWithParenthesis)1781c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, BinaryOperator_NestedWithParenthesis) {
1782c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1783d17437d2SEduardo Caldas       R"cpp(
1784d17437d2SEduardo Caldas void test() {
1785c8c92b54SEduardo Caldas   [[(1 + 2) * (4 / 2)]];
1786d17437d2SEduardo Caldas }
1787d17437d2SEduardo Caldas )cpp",
1788c8c92b54SEduardo Caldas       {R"txt(
1789718e550cSEduardo Caldas BinaryOperatorExpression Expression
1790718e550cSEduardo Caldas |-ParenExpression LeftHandSide
17916118ce79SEduardo Caldas | |-'(' OpenParen
1792718e550cSEduardo Caldas | |-BinaryOperatorExpression SubExpression
1793718e550cSEduardo Caldas | | |-IntegerLiteralExpression LeftHandSide
17946118ce79SEduardo Caldas | | | `-'1' LiteralToken
1795718e550cSEduardo Caldas | | |-'+' OperatorToken
1796718e550cSEduardo Caldas | | `-IntegerLiteralExpression RightHandSide
17976118ce79SEduardo Caldas | |   `-'2' LiteralToken
17986118ce79SEduardo Caldas | `-')' CloseParen
1799718e550cSEduardo Caldas |-'*' OperatorToken
1800718e550cSEduardo Caldas `-ParenExpression RightHandSide
18016118ce79SEduardo Caldas   |-'(' OpenParen
1802718e550cSEduardo Caldas   |-BinaryOperatorExpression SubExpression
1803718e550cSEduardo Caldas   | |-IntegerLiteralExpression LeftHandSide
18046118ce79SEduardo Caldas   | | `-'4' LiteralToken
1805718e550cSEduardo Caldas   | |-'/' OperatorToken
1806718e550cSEduardo Caldas   | `-IntegerLiteralExpression RightHandSide
18076118ce79SEduardo Caldas   |   `-'2' LiteralToken
18086118ce79SEduardo Caldas   `-')' CloseParen
1809c8c92b54SEduardo Caldas )txt"}));
1810d17437d2SEduardo Caldas }
1811d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,BinaryOperator_Associativity)1812c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, BinaryOperator_Associativity) {
1813c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1814d17437d2SEduardo Caldas       R"cpp(
1815d17437d2SEduardo Caldas void test(int a, int b) {
1816c8c92b54SEduardo Caldas   [[a + b + 42]];
1817c8c92b54SEduardo Caldas   [[a = b = 42]];
1818d17437d2SEduardo Caldas }
1819d17437d2SEduardo Caldas )cpp",
1820c8c92b54SEduardo Caldas       {R"txt(
1821718e550cSEduardo Caldas BinaryOperatorExpression Expression
1822718e550cSEduardo Caldas |-BinaryOperatorExpression LeftHandSide
1823718e550cSEduardo Caldas | |-IdExpression LeftHandSide
1824718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
18256118ce79SEduardo Caldas | |   `-'a'
1826718e550cSEduardo Caldas | |-'+' OperatorToken
1827718e550cSEduardo Caldas | `-IdExpression RightHandSide
1828718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
18296118ce79SEduardo Caldas |     `-'b'
1830718e550cSEduardo Caldas |-'+' OperatorToken
1831718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
18326118ce79SEduardo Caldas   `-'42' LiteralToken
1833c8c92b54SEduardo Caldas )txt",
1834c8c92b54SEduardo Caldas        R"txt(
1835718e550cSEduardo Caldas BinaryOperatorExpression Expression
1836718e550cSEduardo Caldas |-IdExpression LeftHandSide
1837718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
18386118ce79SEduardo Caldas |   `-'a'
1839718e550cSEduardo Caldas |-'=' OperatorToken
1840718e550cSEduardo Caldas `-BinaryOperatorExpression RightHandSide
1841718e550cSEduardo Caldas   |-IdExpression LeftHandSide
1842718e550cSEduardo Caldas   | `-UnqualifiedId UnqualifiedId
18436118ce79SEduardo Caldas   |   `-'b'
1844718e550cSEduardo Caldas   |-'=' OperatorToken
1845718e550cSEduardo Caldas   `-IntegerLiteralExpression RightHandSide
18466118ce79SEduardo Caldas     `-'42' LiteralToken
1847c8c92b54SEduardo Caldas )txt"}));
1848d17437d2SEduardo Caldas }
1849d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,BinaryOperator_Precedence)1850c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, BinaryOperator_Precedence) {
1851c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1852d17437d2SEduardo Caldas       R"cpp(
1853d17437d2SEduardo Caldas void test() {
1854c8c92b54SEduardo Caldas   [[1 + 2 * 3 + 4]];
1855c8c92b54SEduardo Caldas   [[1 % 2 + 3 * 4]];
1856d17437d2SEduardo Caldas }
1857d17437d2SEduardo Caldas )cpp",
1858c8c92b54SEduardo Caldas       {R"txt(
1859718e550cSEduardo Caldas BinaryOperatorExpression Expression
1860718e550cSEduardo Caldas |-BinaryOperatorExpression LeftHandSide
1861718e550cSEduardo Caldas | |-IntegerLiteralExpression LeftHandSide
18626118ce79SEduardo Caldas | | `-'1' LiteralToken
1863718e550cSEduardo Caldas | |-'+' OperatorToken
1864718e550cSEduardo Caldas | `-BinaryOperatorExpression RightHandSide
1865718e550cSEduardo Caldas |   |-IntegerLiteralExpression LeftHandSide
18666118ce79SEduardo Caldas |   | `-'2' LiteralToken
1867718e550cSEduardo Caldas |   |-'*' OperatorToken
1868718e550cSEduardo Caldas |   `-IntegerLiteralExpression RightHandSide
18696118ce79SEduardo Caldas |     `-'3' LiteralToken
1870718e550cSEduardo Caldas |-'+' OperatorToken
1871718e550cSEduardo Caldas `-IntegerLiteralExpression RightHandSide
18726118ce79SEduardo Caldas   `-'4' LiteralToken
1873c8c92b54SEduardo Caldas )txt",
1874d17437d2SEduardo Caldas        R"txt(
1875718e550cSEduardo Caldas BinaryOperatorExpression Expression
1876718e550cSEduardo Caldas |-BinaryOperatorExpression LeftHandSide
1877718e550cSEduardo Caldas | |-IntegerLiteralExpression LeftHandSide
18786118ce79SEduardo Caldas | | `-'1' LiteralToken
1879718e550cSEduardo Caldas | |-'%' OperatorToken
1880718e550cSEduardo Caldas | `-IntegerLiteralExpression RightHandSide
18816118ce79SEduardo Caldas |   `-'2' LiteralToken
1882718e550cSEduardo Caldas |-'+' OperatorToken
1883718e550cSEduardo Caldas `-BinaryOperatorExpression RightHandSide
1884718e550cSEduardo Caldas   |-IntegerLiteralExpression LeftHandSide
18856118ce79SEduardo Caldas   | `-'3' LiteralToken
1886718e550cSEduardo Caldas   |-'*' OperatorToken
1887718e550cSEduardo Caldas   `-IntegerLiteralExpression RightHandSide
18886118ce79SEduardo Caldas     `-'4' LiteralToken
1889c8c92b54SEduardo Caldas )txt"}));
1890d17437d2SEduardo Caldas }
1891d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_Assignment)1892c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Assignment) {
1893d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
1894d17437d2SEduardo Caldas     return;
1895d17437d2SEduardo Caldas   }
1896c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1897d17437d2SEduardo Caldas       R"cpp(
1898d17437d2SEduardo Caldas struct X {
1899d17437d2SEduardo Caldas   X& operator=(const X&);
1900d17437d2SEduardo Caldas };
1901d17437d2SEduardo Caldas void test(X x, X y) {
1902c8c92b54SEduardo Caldas   [[x = y]];
1903d17437d2SEduardo Caldas }
1904d17437d2SEduardo Caldas )cpp",
1905c8c92b54SEduardo Caldas       {R"txt(
1906718e550cSEduardo Caldas BinaryOperatorExpression Expression
1907718e550cSEduardo Caldas |-IdExpression LeftHandSide
1908718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
19096118ce79SEduardo Caldas |   `-'x'
1910718e550cSEduardo Caldas |-'=' OperatorToken
1911718e550cSEduardo Caldas `-IdExpression RightHandSide
1912718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
19136118ce79SEduardo Caldas     `-'y'
1914c8c92b54SEduardo Caldas )txt"}));
1915d17437d2SEduardo Caldas }
1916d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_Plus)1917c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Plus) {
1918d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
1919d17437d2SEduardo Caldas     return;
1920d17437d2SEduardo Caldas   }
1921c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1922d17437d2SEduardo Caldas       R"cpp(
1923d17437d2SEduardo Caldas struct X {
1924d17437d2SEduardo Caldas   friend X operator+(X, const X&);
1925d17437d2SEduardo Caldas };
1926d17437d2SEduardo Caldas void test(X x, X y) {
1927c8c92b54SEduardo Caldas   [[x + y]];
1928d17437d2SEduardo Caldas }
1929d17437d2SEduardo Caldas )cpp",
1930c8c92b54SEduardo Caldas       {R"txt(
1931718e550cSEduardo Caldas BinaryOperatorExpression Expression
19322325d6b4SEduardo Caldas |-IdExpression LeftHandSide
1933718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
19346118ce79SEduardo Caldas |   `-'x'
1935718e550cSEduardo Caldas |-'+' OperatorToken
1936718e550cSEduardo Caldas `-IdExpression RightHandSide
1937718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
19386118ce79SEduardo Caldas     `-'y'
1939c8c92b54SEduardo Caldas )txt"}));
1940d17437d2SEduardo Caldas }
1941d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_Less)1942c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Less) {
1943d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
1944d17437d2SEduardo Caldas     return;
1945d17437d2SEduardo Caldas   }
1946c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1947d17437d2SEduardo Caldas       R"cpp(
1948d17437d2SEduardo Caldas struct X {
1949d17437d2SEduardo Caldas   friend bool operator<(const X&, const X&);
1950d17437d2SEduardo Caldas };
1951d17437d2SEduardo Caldas void test(X x, X y) {
1952c8c92b54SEduardo Caldas   [[x < y]];
1953d17437d2SEduardo Caldas }
1954d17437d2SEduardo Caldas )cpp",
1955c8c92b54SEduardo Caldas       {R"txt(
1956718e550cSEduardo Caldas BinaryOperatorExpression Expression
1957718e550cSEduardo Caldas |-IdExpression LeftHandSide
1958718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
19596118ce79SEduardo Caldas |   `-'x'
1960718e550cSEduardo Caldas |-'<' OperatorToken
1961718e550cSEduardo Caldas `-IdExpression RightHandSide
1962718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
19636118ce79SEduardo Caldas     `-'y'
1964c8c92b54SEduardo Caldas )txt"}));
1965d17437d2SEduardo Caldas }
1966d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_LeftShift)1967c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_LeftShift) {
1968d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
1969d17437d2SEduardo Caldas     return;
1970d17437d2SEduardo Caldas   }
1971c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1972d17437d2SEduardo Caldas       R"cpp(
1973d17437d2SEduardo Caldas struct X {
1974d17437d2SEduardo Caldas   friend X operator<<(X&, const X&);
1975d17437d2SEduardo Caldas };
1976d17437d2SEduardo Caldas void test(X x, X y) {
1977c8c92b54SEduardo Caldas   [[x << y]];
1978d17437d2SEduardo Caldas }
1979d17437d2SEduardo Caldas )cpp",
1980c8c92b54SEduardo Caldas       {R"txt(
1981718e550cSEduardo Caldas BinaryOperatorExpression Expression
1982718e550cSEduardo Caldas |-IdExpression LeftHandSide
1983718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
19846118ce79SEduardo Caldas |   `-'x'
1985718e550cSEduardo Caldas |-'<<' OperatorToken
1986718e550cSEduardo Caldas `-IdExpression RightHandSide
1987718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
19886118ce79SEduardo Caldas     `-'y'
1989c8c92b54SEduardo Caldas )txt"}));
1990d17437d2SEduardo Caldas }
1991d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_Comma)1992c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Comma) {
1993d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
1994d17437d2SEduardo Caldas     return;
1995d17437d2SEduardo Caldas   }
1996c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
1997d17437d2SEduardo Caldas       R"cpp(
1998d17437d2SEduardo Caldas struct X {
1999d17437d2SEduardo Caldas   X operator,(X&);
2000d17437d2SEduardo Caldas };
2001d17437d2SEduardo Caldas void test(X x, X y) {
2002c8c92b54SEduardo Caldas   [[x, y]];
2003d17437d2SEduardo Caldas }
2004d17437d2SEduardo Caldas )cpp",
2005c8c92b54SEduardo Caldas       {R"txt(
2006718e550cSEduardo Caldas BinaryOperatorExpression Expression
2007718e550cSEduardo Caldas |-IdExpression LeftHandSide
2008718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
20096118ce79SEduardo Caldas |   `-'x'
2010718e550cSEduardo Caldas |-',' OperatorToken
2011718e550cSEduardo Caldas `-IdExpression RightHandSide
2012718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
20136118ce79SEduardo Caldas     `-'y'
2014c8c92b54SEduardo Caldas )txt"}));
2015d17437d2SEduardo Caldas }
2016d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_PointerToMember)2017c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_PointerToMember) {
2018d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
2019d17437d2SEduardo Caldas     return;
2020d17437d2SEduardo Caldas   }
2021c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2022d17437d2SEduardo Caldas       R"cpp(
2023d17437d2SEduardo Caldas struct X {
2024d17437d2SEduardo Caldas   X operator->*(int);
2025d17437d2SEduardo Caldas };
2026d17437d2SEduardo Caldas void test(X* xp, int X::* pmi) {
2027c8c92b54SEduardo Caldas   [[xp->*pmi]];
2028d17437d2SEduardo Caldas }
2029d17437d2SEduardo Caldas )cpp",
2030c8c92b54SEduardo Caldas       {R"txt(
2031718e550cSEduardo Caldas BinaryOperatorExpression Expression
2032718e550cSEduardo Caldas |-IdExpression LeftHandSide
2033718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
20346118ce79SEduardo Caldas |   `-'xp'
2035718e550cSEduardo Caldas |-'->*' OperatorToken
2036718e550cSEduardo Caldas `-IdExpression RightHandSide
2037718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
20386118ce79SEduardo Caldas     `-'pmi'
2039c8c92b54SEduardo Caldas )txt"}));
2040d17437d2SEduardo Caldas }
2041d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_Negation)2042c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Negation) {
2043d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
2044d17437d2SEduardo Caldas     return;
2045d17437d2SEduardo Caldas   }
2046c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2047d17437d2SEduardo Caldas       R"cpp(
2048d17437d2SEduardo Caldas struct X {
2049d17437d2SEduardo Caldas   bool operator!();
2050d17437d2SEduardo Caldas };
2051d17437d2SEduardo Caldas void test(X x) {
2052c8c92b54SEduardo Caldas   [[!x]];
2053d17437d2SEduardo Caldas }
2054d17437d2SEduardo Caldas )cpp",
2055c8c92b54SEduardo Caldas       {R"txt(
2056718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
2057718e550cSEduardo Caldas |-'!' OperatorToken
2058718e550cSEduardo Caldas `-IdExpression Operand
2059718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
20606118ce79SEduardo Caldas     `-'x'
2061c8c92b54SEduardo Caldas )txt"}));
2062d17437d2SEduardo Caldas }
2063d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_AddressOf)2064c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_AddressOf) {
2065d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
2066d17437d2SEduardo Caldas     return;
2067d17437d2SEduardo Caldas   }
2068c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2069d17437d2SEduardo Caldas       R"cpp(
2070d17437d2SEduardo Caldas struct X {
2071d17437d2SEduardo Caldas   X* operator&();
2072d17437d2SEduardo Caldas };
2073d17437d2SEduardo Caldas void test(X x) {
2074c8c92b54SEduardo Caldas   [[&x]];
2075d17437d2SEduardo Caldas }
2076d17437d2SEduardo Caldas )cpp",
2077c8c92b54SEduardo Caldas       {R"txt(
2078718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
2079718e550cSEduardo Caldas |-'&' OperatorToken
2080718e550cSEduardo Caldas `-IdExpression Operand
2081718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
20826118ce79SEduardo Caldas     `-'x'
2083c8c92b54SEduardo Caldas )txt"}));
2084d17437d2SEduardo Caldas }
2085d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_PrefixIncrement)2086c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_PrefixIncrement) {
2087d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
2088d17437d2SEduardo Caldas     return;
2089d17437d2SEduardo Caldas   }
2090c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2091d17437d2SEduardo Caldas       R"cpp(
2092d17437d2SEduardo Caldas struct X {
2093d17437d2SEduardo Caldas   X operator++();
2094d17437d2SEduardo Caldas };
2095d17437d2SEduardo Caldas void test(X x) {
2096c8c92b54SEduardo Caldas   [[++x]];
2097d17437d2SEduardo Caldas }
2098d17437d2SEduardo Caldas )cpp",
2099c8c92b54SEduardo Caldas       {R"txt(
2100718e550cSEduardo Caldas PrefixUnaryOperatorExpression Expression
2101718e550cSEduardo Caldas |-'++' OperatorToken
2102718e550cSEduardo Caldas `-IdExpression Operand
2103718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
21046118ce79SEduardo Caldas     `-'x'
2105c8c92b54SEduardo Caldas )txt"}));
2106d17437d2SEduardo Caldas }
2107d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperator_PostfixIncrement)2108c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperator_PostfixIncrement) {
2109d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
2110d17437d2SEduardo Caldas     return;
2111d17437d2SEduardo Caldas   }
2112c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2113d17437d2SEduardo Caldas       R"cpp(
2114d17437d2SEduardo Caldas struct X {
2115d17437d2SEduardo Caldas   X operator++(int);
2116d17437d2SEduardo Caldas };
2117d17437d2SEduardo Caldas void test(X x) {
2118c8c92b54SEduardo Caldas   [[x++]];
2119d17437d2SEduardo Caldas }
2120d17437d2SEduardo Caldas )cpp",
2121c8c92b54SEduardo Caldas       {R"txt(
2122718e550cSEduardo Caldas PostfixUnaryOperatorExpression Expression
2123718e550cSEduardo Caldas |-IdExpression Operand
2124718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
21256118ce79SEduardo Caldas |   `-'x'
2126718e550cSEduardo Caldas `-'++' OperatorToken
2127c8c92b54SEduardo Caldas )txt"}));
2128d17437d2SEduardo Caldas }
2129d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_SimpleWithDot)2130c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_SimpleWithDot) {
2131ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2132ba32915dSEduardo Caldas       R"cpp(
2133ba32915dSEduardo Caldas struct S {
2134ba32915dSEduardo Caldas   int a;
2135ba32915dSEduardo Caldas };
2136ba32915dSEduardo Caldas void test(struct S s) {
2137ba32915dSEduardo Caldas   [[s.a]];
2138ba32915dSEduardo Caldas }
2139ba32915dSEduardo Caldas )cpp",
2140ba32915dSEduardo Caldas       {R"txt(
2141718e550cSEduardo Caldas MemberExpression Expression
2142718e550cSEduardo Caldas |-IdExpression Object
2143718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
21446118ce79SEduardo Caldas |   `-'s'
2145718e550cSEduardo Caldas |-'.' AccessToken
2146718e550cSEduardo Caldas `-IdExpression Member
2147718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
21486118ce79SEduardo Caldas     `-'a'
2149ba32915dSEduardo Caldas )txt"}));
2150ba32915dSEduardo Caldas }
2151ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_StaticDataMember)2152c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_StaticDataMember) {
2153ba32915dSEduardo Caldas   if (!GetParam().isCXX()) {
2154ba32915dSEduardo Caldas     return;
2155ba32915dSEduardo Caldas   }
2156ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2157ba32915dSEduardo Caldas       R"cpp(
2158ba32915dSEduardo Caldas struct S {
2159ba32915dSEduardo Caldas   static int a;
2160ba32915dSEduardo Caldas };
2161ba32915dSEduardo Caldas void test(S s) {
2162ba32915dSEduardo Caldas   [[s.a]];
2163ba32915dSEduardo Caldas }
2164ba32915dSEduardo Caldas )cpp",
2165ba32915dSEduardo Caldas       {R"txt(
2166718e550cSEduardo Caldas MemberExpression Expression
2167718e550cSEduardo Caldas |-IdExpression Object
2168718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
21696118ce79SEduardo Caldas |   `-'s'
2170718e550cSEduardo Caldas |-'.' AccessToken
2171718e550cSEduardo Caldas `-IdExpression Member
2172718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
21736118ce79SEduardo Caldas     `-'a'
2174ba32915dSEduardo Caldas )txt"}));
2175ba32915dSEduardo Caldas }
2176ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_SimpleWithArrow)2177c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_SimpleWithArrow) {
2178ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2179ba32915dSEduardo Caldas       R"cpp(
2180ba32915dSEduardo Caldas struct S {
2181ba32915dSEduardo Caldas   int a;
2182ba32915dSEduardo Caldas };
2183ba32915dSEduardo Caldas void test(struct S* sp) {
2184ba32915dSEduardo Caldas   [[sp->a]];
2185ba32915dSEduardo Caldas }
2186ba32915dSEduardo Caldas )cpp",
2187ba32915dSEduardo Caldas       {R"txt(
2188718e550cSEduardo Caldas MemberExpression Expression
2189718e550cSEduardo Caldas |-IdExpression Object
2190718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
21916118ce79SEduardo Caldas |   `-'sp'
2192718e550cSEduardo Caldas |-'->' AccessToken
2193718e550cSEduardo Caldas `-IdExpression Member
2194718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
21956118ce79SEduardo Caldas     `-'a'
2196ba32915dSEduardo Caldas )txt"}));
2197ba32915dSEduardo Caldas }
2198ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_Chaining)2199c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_Chaining) {
2200ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2201ba32915dSEduardo Caldas       R"cpp(
2202ba32915dSEduardo Caldas struct S {
2203ba32915dSEduardo Caldas   struct S* next;
2204ba32915dSEduardo Caldas };
2205ba32915dSEduardo Caldas void test(struct S s){
2206ba32915dSEduardo Caldas   [[s.next->next]];
2207ba32915dSEduardo Caldas }
2208ba32915dSEduardo Caldas )cpp",
2209ba32915dSEduardo Caldas       {R"txt(
2210718e550cSEduardo Caldas MemberExpression Expression
2211718e550cSEduardo Caldas |-MemberExpression Object
2212718e550cSEduardo Caldas | |-IdExpression Object
2213718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
22146118ce79SEduardo Caldas | |   `-'s'
2215718e550cSEduardo Caldas | |-'.' AccessToken
2216718e550cSEduardo Caldas | `-IdExpression Member
2217718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
22186118ce79SEduardo Caldas |     `-'next'
2219718e550cSEduardo Caldas |-'->' AccessToken
2220718e550cSEduardo Caldas `-IdExpression Member
2221718e550cSEduardo Caldas   `-UnqualifiedId UnqualifiedId
22226118ce79SEduardo Caldas     `-'next'
2223ba32915dSEduardo Caldas )txt"}));
2224ba32915dSEduardo Caldas }
2225ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_OperatorFunction)2226c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_OperatorFunction) {
2227ba32915dSEduardo Caldas   if (!GetParam().isCXX()) {
2228ba32915dSEduardo Caldas     return;
2229ba32915dSEduardo Caldas   }
2230ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2231ba32915dSEduardo Caldas       R"cpp(
2232ba32915dSEduardo Caldas struct S {
2233ba32915dSEduardo Caldas   bool operator!();
2234ba32915dSEduardo Caldas };
2235ba32915dSEduardo Caldas void test(S s) {
2236ba32915dSEduardo Caldas   [[s.operator!()]];
2237ba32915dSEduardo Caldas }
2238ba32915dSEduardo Caldas )cpp",
2239ba32915dSEduardo Caldas       {R"txt(
2240718e550cSEduardo Caldas CallExpression Expression
2241718e550cSEduardo Caldas |-MemberExpression Callee
2242718e550cSEduardo Caldas | |-IdExpression Object
2243718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
22446118ce79SEduardo Caldas | |   `-'s'
2245718e550cSEduardo Caldas | |-'.' AccessToken
2246718e550cSEduardo Caldas | `-IdExpression Member
2247718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
22486118ce79SEduardo Caldas |     |-'operator'
22496118ce79SEduardo Caldas |     `-'!'
22502de2ca34SEduardo Caldas |-'(' OpenParen
22512de2ca34SEduardo Caldas `-')' CloseParen
2252ba32915dSEduardo Caldas )txt"}));
2253ba32915dSEduardo Caldas }
2254ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_VariableTemplate)2255c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_VariableTemplate) {
2256ba32915dSEduardo Caldas   if (!GetParam().isCXX14OrLater()) {
2257ba32915dSEduardo Caldas     return;
2258ba32915dSEduardo Caldas   }
2259ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2260ba32915dSEduardo Caldas       R"cpp(
2261ba32915dSEduardo Caldas struct S {
2262ba32915dSEduardo Caldas   template<typename T>
2263ba32915dSEduardo Caldas   static constexpr T x = 42;
2264ba32915dSEduardo Caldas };
2265ba32915dSEduardo Caldas // FIXME: `<int>` should be a child of `MemberExpression` and `;` of
2266ba32915dSEduardo Caldas // `ExpressionStatement`. This is a bug in clang, in `getSourceRange` methods.
2267ba32915dSEduardo Caldas void test(S s) [[{
2268ba32915dSEduardo Caldas   s.x<int>;
2269ba32915dSEduardo Caldas }]]
2270ba32915dSEduardo Caldas )cpp",
2271ba32915dSEduardo Caldas       {R"txt(
2272ba32915dSEduardo Caldas CompoundStatement
22736118ce79SEduardo Caldas |-'{' OpenParen
2274718e550cSEduardo Caldas |-ExpressionStatement Statement
2275718e550cSEduardo Caldas | `-MemberExpression Expression
2276718e550cSEduardo Caldas |   |-IdExpression Object
2277718e550cSEduardo Caldas |   | `-UnqualifiedId UnqualifiedId
22786118ce79SEduardo Caldas |   |   `-'s'
2279718e550cSEduardo Caldas |   |-'.' AccessToken
2280718e550cSEduardo Caldas |   `-IdExpression Member
2281718e550cSEduardo Caldas |     `-UnqualifiedId UnqualifiedId
22826118ce79SEduardo Caldas |       `-'x'
22836118ce79SEduardo Caldas |-'<'
22846118ce79SEduardo Caldas |-'int'
22856118ce79SEduardo Caldas |-'>'
22866118ce79SEduardo Caldas |-';'
22876118ce79SEduardo Caldas `-'}' CloseParen
2288ba32915dSEduardo Caldas )txt"}));
2289ba32915dSEduardo Caldas }
2290ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_FunctionTemplate)2291c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_FunctionTemplate) {
2292ba32915dSEduardo Caldas   if (!GetParam().isCXX()) {
2293ba32915dSEduardo Caldas     return;
2294ba32915dSEduardo Caldas   }
2295ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2296ba32915dSEduardo Caldas       R"cpp(
2297ba32915dSEduardo Caldas struct S {
2298ba32915dSEduardo Caldas   template<typename T>
2299ba32915dSEduardo Caldas   T f();
2300ba32915dSEduardo Caldas };
2301ba32915dSEduardo Caldas void test(S* sp){
2302ba32915dSEduardo Caldas   [[sp->f<int>()]];
2303ba32915dSEduardo Caldas }
2304ba32915dSEduardo Caldas )cpp",
2305ba32915dSEduardo Caldas       {R"txt(
2306718e550cSEduardo Caldas CallExpression Expression
2307718e550cSEduardo Caldas |-MemberExpression Callee
2308718e550cSEduardo Caldas | |-IdExpression Object
2309718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
23106118ce79SEduardo Caldas | |   `-'sp'
2311718e550cSEduardo Caldas | |-'->' AccessToken
2312718e550cSEduardo Caldas | `-IdExpression Member
2313718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
23146118ce79SEduardo Caldas |     |-'f'
23156118ce79SEduardo Caldas |     |-'<'
23166118ce79SEduardo Caldas |     |-'int'
23176118ce79SEduardo Caldas |     `-'>'
23182de2ca34SEduardo Caldas |-'(' OpenParen
23192de2ca34SEduardo Caldas `-')' CloseParen
2320ba32915dSEduardo Caldas )txt"}));
2321ba32915dSEduardo Caldas }
2322ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_FunctionTemplateWithTemplateKeyword)2323c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
2324c01d28dcSEduardo Caldas        MemberExpression_FunctionTemplateWithTemplateKeyword) {
2325ba32915dSEduardo Caldas   if (!GetParam().isCXX()) {
2326ba32915dSEduardo Caldas     return;
2327ba32915dSEduardo Caldas   }
2328ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2329ba32915dSEduardo Caldas       R"cpp(
2330ba32915dSEduardo Caldas struct S {
2331ba32915dSEduardo Caldas   template<typename T>
2332ba32915dSEduardo Caldas   T f();
2333ba32915dSEduardo Caldas };
2334ba32915dSEduardo Caldas void test(S s){
2335ba32915dSEduardo Caldas   [[s.template f<int>()]];
2336ba32915dSEduardo Caldas }
2337ba32915dSEduardo Caldas )cpp",
2338ba32915dSEduardo Caldas       {R"txt(
2339718e550cSEduardo Caldas CallExpression Expression
2340718e550cSEduardo Caldas |-MemberExpression Callee
2341718e550cSEduardo Caldas | |-IdExpression Object
2342718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
23436118ce79SEduardo Caldas | |   `-'s'
2344718e550cSEduardo Caldas | |-'.' AccessToken
23456118ce79SEduardo Caldas | |-'template'
2346718e550cSEduardo Caldas | `-IdExpression Member
2347718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
23486118ce79SEduardo Caldas |     |-'f'
23496118ce79SEduardo Caldas |     |-'<'
23506118ce79SEduardo Caldas |     |-'int'
23516118ce79SEduardo Caldas |     `-'>'
23522de2ca34SEduardo Caldas |-'(' OpenParen
23532de2ca34SEduardo Caldas `-')' CloseParen
2354ba32915dSEduardo Caldas )txt"}));
2355ba32915dSEduardo Caldas }
2356ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_WithQualifier)2357c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_WithQualifier) {
2358ba32915dSEduardo Caldas   if (!GetParam().isCXX()) {
2359ba32915dSEduardo Caldas     return;
2360ba32915dSEduardo Caldas   }
2361ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2362ba32915dSEduardo Caldas       R"cpp(
2363ba32915dSEduardo Caldas struct Base {
2364ba32915dSEduardo Caldas   void f();
2365ba32915dSEduardo Caldas };
2366ba32915dSEduardo Caldas struct S : public Base {};
2367ba32915dSEduardo Caldas void test(S s){
2368ba32915dSEduardo Caldas   [[s.Base::f()]];
2369ba32915dSEduardo Caldas   [[s.::S::~S()]];
2370ba32915dSEduardo Caldas }
2371ba32915dSEduardo Caldas )cpp",
2372ba32915dSEduardo Caldas       {R"txt(
2373718e550cSEduardo Caldas CallExpression Expression
2374718e550cSEduardo Caldas |-MemberExpression Callee
2375718e550cSEduardo Caldas | |-IdExpression Object
2376718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
23776118ce79SEduardo Caldas | |   `-'s'
2378718e550cSEduardo Caldas | |-'.' AccessToken
2379718e550cSEduardo Caldas | `-IdExpression Member
2380718e550cSEduardo Caldas |   |-NestedNameSpecifier Qualifier
2381718e550cSEduardo Caldas |   | |-IdentifierNameSpecifier ListElement
23826118ce79SEduardo Caldas |   | | `-'Base'
2383718e550cSEduardo Caldas |   | `-'::' ListDelimiter
2384718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
23856118ce79SEduardo Caldas |     `-'f'
23862de2ca34SEduardo Caldas |-'(' OpenParen
23872de2ca34SEduardo Caldas `-')' CloseParen
2388ba32915dSEduardo Caldas       )txt",
2389ba32915dSEduardo Caldas        R"txt(
2390718e550cSEduardo Caldas CallExpression Expression
2391718e550cSEduardo Caldas |-MemberExpression Callee
2392718e550cSEduardo Caldas | |-IdExpression Object
2393718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
23946118ce79SEduardo Caldas | |   `-'s'
2395718e550cSEduardo Caldas | |-'.' AccessToken
2396718e550cSEduardo Caldas | `-IdExpression Member
2397718e550cSEduardo Caldas |   |-NestedNameSpecifier Qualifier
2398718e550cSEduardo Caldas |   | |-'::' ListDelimiter
2399718e550cSEduardo Caldas |   | |-IdentifierNameSpecifier ListElement
24006118ce79SEduardo Caldas |   | | `-'S'
2401718e550cSEduardo Caldas |   | `-'::' ListDelimiter
2402718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
24036118ce79SEduardo Caldas |     |-'~'
24046118ce79SEduardo Caldas |     `-'S'
24052de2ca34SEduardo Caldas |-'(' OpenParen
24062de2ca34SEduardo Caldas `-')' CloseParen
2407ba32915dSEduardo Caldas )txt"}));
2408ba32915dSEduardo Caldas }
2409ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberExpression_Complex)2410c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberExpression_Complex) {
2411ba32915dSEduardo Caldas   if (!GetParam().isCXX()) {
2412ba32915dSEduardo Caldas     return;
2413ba32915dSEduardo Caldas   }
2414ba32915dSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2415ba32915dSEduardo Caldas       R"cpp(
2416ba32915dSEduardo Caldas template<typename T>
2417ba32915dSEduardo Caldas struct U {
2418ba32915dSEduardo Caldas   template<typename U>
2419ba32915dSEduardo Caldas   U f();
2420ba32915dSEduardo Caldas };
2421ba32915dSEduardo Caldas struct S {
2422ba32915dSEduardo Caldas   U<int> getU();
2423ba32915dSEduardo Caldas };
2424ba32915dSEduardo Caldas void test(S* sp) {
2425ba32915dSEduardo Caldas   // FIXME: The first 'template' keyword is a child of `NestedNameSpecifier`,
2426ba32915dSEduardo Caldas   // but it should be a child of `MemberExpression` according to the grammar.
2427ba32915dSEduardo Caldas   // However one might argue that the 'template' keyword fits better inside
2428ba32915dSEduardo Caldas   // `NestedNameSpecifier` because if we change `U<int>` to `UI` we would like
2429ba32915dSEduardo Caldas   // equally to change the `NameSpecifier` `template U<int>` to just `UI`.
2430ba32915dSEduardo Caldas   [[sp->getU().template U<int>::template f<int>()]];
2431ba32915dSEduardo Caldas }
2432ba32915dSEduardo Caldas )cpp",
2433ba32915dSEduardo Caldas       {R"txt(
2434718e550cSEduardo Caldas CallExpression Expression
2435718e550cSEduardo Caldas |-MemberExpression Callee
2436718e550cSEduardo Caldas | |-CallExpression Object
2437718e550cSEduardo Caldas | | |-MemberExpression Callee
2438718e550cSEduardo Caldas | | | |-IdExpression Object
2439718e550cSEduardo Caldas | | | | `-UnqualifiedId UnqualifiedId
24406118ce79SEduardo Caldas | | | |   `-'sp'
2441718e550cSEduardo Caldas | | | |-'->' AccessToken
2442718e550cSEduardo Caldas | | | `-IdExpression Member
2443718e550cSEduardo Caldas | | |   `-UnqualifiedId UnqualifiedId
24446118ce79SEduardo Caldas | | |     `-'getU'
24452de2ca34SEduardo Caldas | | |-'(' OpenParen
24462de2ca34SEduardo Caldas | | `-')' CloseParen
2447718e550cSEduardo Caldas | |-'.' AccessToken
2448718e550cSEduardo Caldas | `-IdExpression Member
2449718e550cSEduardo Caldas |   |-NestedNameSpecifier Qualifier
2450718e550cSEduardo Caldas |   | |-SimpleTemplateNameSpecifier ListElement
24516118ce79SEduardo Caldas |   | | |-'template'
24526118ce79SEduardo Caldas |   | | |-'U'
24536118ce79SEduardo Caldas |   | | |-'<'
24546118ce79SEduardo Caldas |   | | |-'int'
24556118ce79SEduardo Caldas |   | | `-'>'
2456718e550cSEduardo Caldas |   | `-'::' ListDelimiter
24576118ce79SEduardo Caldas |   |-'template' TemplateKeyword
2458718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
24596118ce79SEduardo Caldas |     |-'f'
24606118ce79SEduardo Caldas |     |-'<'
24616118ce79SEduardo Caldas |     |-'int'
24626118ce79SEduardo Caldas |     `-'>'
24632de2ca34SEduardo Caldas |-'(' OpenParen
24642de2ca34SEduardo Caldas `-')' CloseParen
24652de2ca34SEduardo Caldas )txt"}));
24662de2ca34SEduardo Caldas }
24672de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Callee_Member)2468c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_Member) {
24692de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
24702de2ca34SEduardo Caldas     return;
24712de2ca34SEduardo Caldas   }
24722de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
24732de2ca34SEduardo Caldas       R"cpp(
24742de2ca34SEduardo Caldas struct S{
24752de2ca34SEduardo Caldas   void f();
24762de2ca34SEduardo Caldas };
24772de2ca34SEduardo Caldas void test(S s) {
24782de2ca34SEduardo Caldas   [[s.f()]];
24792de2ca34SEduardo Caldas }
24802de2ca34SEduardo Caldas )cpp",
24812de2ca34SEduardo Caldas       {R"txt(
2482718e550cSEduardo Caldas CallExpression Expression
2483718e550cSEduardo Caldas |-MemberExpression Callee
2484718e550cSEduardo Caldas | |-IdExpression Object
2485718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
24862de2ca34SEduardo Caldas | |   `-'s'
2487718e550cSEduardo Caldas | |-'.' AccessToken
2488718e550cSEduardo Caldas | `-IdExpression Member
2489718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
24902de2ca34SEduardo Caldas |     `-'f'
24912de2ca34SEduardo Caldas |-'(' OpenParen
24922de2ca34SEduardo Caldas `-')' CloseParen
24932de2ca34SEduardo Caldas )txt"}));
24942de2ca34SEduardo Caldas }
24952de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Callee_OperatorParens)2496c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_OperatorParens) {
24972de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
24982de2ca34SEduardo Caldas     return;
24992de2ca34SEduardo Caldas   }
25002de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
25012de2ca34SEduardo Caldas       R"cpp(
25022de2ca34SEduardo Caldas struct S {
25032de2ca34SEduardo Caldas   void operator()();
25042de2ca34SEduardo Caldas };
25052de2ca34SEduardo Caldas void test(S s) {
25062de2ca34SEduardo Caldas   [[s()]];
25072de2ca34SEduardo Caldas }
25082de2ca34SEduardo Caldas )cpp",
25092de2ca34SEduardo Caldas       {R"txt(
2510718e550cSEduardo Caldas CallExpression Expression
2511718e550cSEduardo Caldas |-IdExpression Callee
2512718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
25132de2ca34SEduardo Caldas |   `-'s'
25142de2ca34SEduardo Caldas |-'(' OpenParen
25152de2ca34SEduardo Caldas `-')' CloseParen
25162de2ca34SEduardo Caldas )txt"}));
25172de2ca34SEduardo Caldas }
25182de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Callee_OperatorParensChaining)2519c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_OperatorParensChaining) {
25202de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
25212de2ca34SEduardo Caldas     return;
25222de2ca34SEduardo Caldas   }
25232de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
25242de2ca34SEduardo Caldas       R"cpp(
25252de2ca34SEduardo Caldas struct S {
25262de2ca34SEduardo Caldas   S operator()();
25272de2ca34SEduardo Caldas };
25282de2ca34SEduardo Caldas void test(S s) {
25292de2ca34SEduardo Caldas   [[s()()]];
25302de2ca34SEduardo Caldas }
25312de2ca34SEduardo Caldas )cpp",
25322de2ca34SEduardo Caldas       {R"txt(
2533718e550cSEduardo Caldas CallExpression Expression
2534718e550cSEduardo Caldas |-CallExpression Callee
2535718e550cSEduardo Caldas | |-IdExpression Callee
2536718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
25372de2ca34SEduardo Caldas | |   `-'s'
25382de2ca34SEduardo Caldas | |-'(' OpenParen
25392de2ca34SEduardo Caldas | `-')' CloseParen
25402de2ca34SEduardo Caldas |-'(' OpenParen
25412de2ca34SEduardo Caldas `-')' CloseParen
25422de2ca34SEduardo Caldas )txt"}));
25432de2ca34SEduardo Caldas }
25442de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Callee_MemberWithThis)2545c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_MemberWithThis) {
25462de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
25472de2ca34SEduardo Caldas     return;
25482de2ca34SEduardo Caldas   }
25492de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
25502de2ca34SEduardo Caldas       R"cpp(
25512de2ca34SEduardo Caldas struct Base {
25522de2ca34SEduardo Caldas   void f();
25532de2ca34SEduardo Caldas };
25542de2ca34SEduardo Caldas struct S: public Base {
25552de2ca34SEduardo Caldas   void f();
25562de2ca34SEduardo Caldas   void test() {
25572de2ca34SEduardo Caldas     [[this->f()]];
25582de2ca34SEduardo Caldas     [[f()]];
25592de2ca34SEduardo Caldas     [[this->Base::f()]];
25602de2ca34SEduardo Caldas   }
25612de2ca34SEduardo Caldas };
25622de2ca34SEduardo Caldas )cpp",
25632de2ca34SEduardo Caldas       {R"txt(
2564718e550cSEduardo Caldas CallExpression Expression
2565718e550cSEduardo Caldas |-MemberExpression Callee
2566718e550cSEduardo Caldas | |-ThisExpression Object
25672de2ca34SEduardo Caldas | | `-'this' IntroducerKeyword
2568718e550cSEduardo Caldas | |-'->' AccessToken
2569718e550cSEduardo Caldas | `-IdExpression Member
2570718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
25712de2ca34SEduardo Caldas |     `-'f'
25722de2ca34SEduardo Caldas |-'(' OpenParen
25732de2ca34SEduardo Caldas `-')' CloseParen
25742de2ca34SEduardo Caldas       )txt",
25752de2ca34SEduardo Caldas        R"txt(
2576718e550cSEduardo Caldas CallExpression Expression
2577718e550cSEduardo Caldas |-IdExpression Callee
2578718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
25792de2ca34SEduardo Caldas |   `-'f'
25802de2ca34SEduardo Caldas |-'(' OpenParen
25812de2ca34SEduardo Caldas `-')' CloseParen
25822de2ca34SEduardo Caldas       )txt",
25832de2ca34SEduardo Caldas        R"txt(
2584718e550cSEduardo Caldas CallExpression Expression
2585718e550cSEduardo Caldas |-MemberExpression Callee
2586718e550cSEduardo Caldas | |-ThisExpression Object
25872de2ca34SEduardo Caldas | | `-'this' IntroducerKeyword
2588718e550cSEduardo Caldas | |-'->' AccessToken
2589718e550cSEduardo Caldas | `-IdExpression Member
2590718e550cSEduardo Caldas |   |-NestedNameSpecifier Qualifier
2591718e550cSEduardo Caldas |   | |-IdentifierNameSpecifier ListElement
25922de2ca34SEduardo Caldas |   | | `-'Base'
2593718e550cSEduardo Caldas |   | `-'::' ListDelimiter
2594718e550cSEduardo Caldas |   `-UnqualifiedId UnqualifiedId
25952de2ca34SEduardo Caldas |     `-'f'
25962de2ca34SEduardo Caldas |-'(' OpenParen
25972de2ca34SEduardo Caldas `-')' CloseParen
25982de2ca34SEduardo Caldas )txt"}));
25992de2ca34SEduardo Caldas }
26002de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Callee_FunctionPointer)2601c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_FunctionPointer) {
26022de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
26032de2ca34SEduardo Caldas     return;
26042de2ca34SEduardo Caldas   }
26052de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
26062de2ca34SEduardo Caldas       R"cpp(
26072de2ca34SEduardo Caldas void (*pf)();
26082de2ca34SEduardo Caldas void test() {
26092de2ca34SEduardo Caldas   [[pf()]];
26102de2ca34SEduardo Caldas   [[(*pf)()]];
26112de2ca34SEduardo Caldas }
26122de2ca34SEduardo Caldas )cpp",
26132de2ca34SEduardo Caldas       {R"txt(
2614718e550cSEduardo Caldas CallExpression Expression
2615718e550cSEduardo Caldas |-IdExpression Callee
2616718e550cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
26172de2ca34SEduardo Caldas |   `-'pf'
26182de2ca34SEduardo Caldas |-'(' OpenParen
26192de2ca34SEduardo Caldas `-')' CloseParen
26202de2ca34SEduardo Caldas )txt",
26212de2ca34SEduardo Caldas        R"txt(
2622718e550cSEduardo Caldas CallExpression Expression
2623718e550cSEduardo Caldas |-ParenExpression Callee
26242de2ca34SEduardo Caldas | |-'(' OpenParen
2625718e550cSEduardo Caldas | |-PrefixUnaryOperatorExpression SubExpression
2626718e550cSEduardo Caldas | | |-'*' OperatorToken
2627718e550cSEduardo Caldas | | `-IdExpression Operand
2628718e550cSEduardo Caldas | |   `-UnqualifiedId UnqualifiedId
26292de2ca34SEduardo Caldas | |     `-'pf'
26302de2ca34SEduardo Caldas | `-')' CloseParen
26312de2ca34SEduardo Caldas |-'(' OpenParen
26322de2ca34SEduardo Caldas `-')' CloseParen
26332de2ca34SEduardo Caldas )txt"}));
26342de2ca34SEduardo Caldas }
26352de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Callee_MemberFunctionPointer)2636c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_MemberFunctionPointer) {
26372de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
26382de2ca34SEduardo Caldas     return;
26392de2ca34SEduardo Caldas   }
26402de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
26412de2ca34SEduardo Caldas       R"cpp(
26422de2ca34SEduardo Caldas struct S {
26432de2ca34SEduardo Caldas   void f();
26442de2ca34SEduardo Caldas };
26452de2ca34SEduardo Caldas void test(S s) {
26462de2ca34SEduardo Caldas   void (S::*pmf)();
26472de2ca34SEduardo Caldas   pmf = &S::f;
26482de2ca34SEduardo Caldas   [[(s.*pmf)()]];
26492de2ca34SEduardo Caldas }
26502de2ca34SEduardo Caldas )cpp",
26512de2ca34SEduardo Caldas       {R"txt(
2652718e550cSEduardo Caldas CallExpression Expression
2653718e550cSEduardo Caldas |-ParenExpression Callee
26542de2ca34SEduardo Caldas | |-'(' OpenParen
2655718e550cSEduardo Caldas | |-BinaryOperatorExpression SubExpression
2656718e550cSEduardo Caldas | | |-IdExpression LeftHandSide
2657718e550cSEduardo Caldas | | | `-UnqualifiedId UnqualifiedId
26582de2ca34SEduardo Caldas | | |   `-'s'
2659718e550cSEduardo Caldas | | |-'.*' OperatorToken
2660718e550cSEduardo Caldas | | `-IdExpression RightHandSide
2661718e550cSEduardo Caldas | |   `-UnqualifiedId UnqualifiedId
26622de2ca34SEduardo Caldas | |     `-'pmf'
26632de2ca34SEduardo Caldas | `-')' CloseParen
26642de2ca34SEduardo Caldas |-'(' OpenParen
26652de2ca34SEduardo Caldas `-')' CloseParen
26662de2ca34SEduardo Caldas )txt"}));
26672de2ca34SEduardo Caldas }
26682de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_Zero)2669c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_Zero) {
26702de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
26712de2ca34SEduardo Caldas     return;
26722de2ca34SEduardo Caldas   }
26732de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
26742de2ca34SEduardo Caldas       R"cpp(
26752de2ca34SEduardo Caldas void f();
26762de2ca34SEduardo Caldas void test() {
26772de2ca34SEduardo Caldas   [[f();]]
26782de2ca34SEduardo Caldas }
26792de2ca34SEduardo Caldas )cpp",
26802de2ca34SEduardo Caldas       {R"txt(
2681718e550cSEduardo Caldas ExpressionStatement Statement
2682718e550cSEduardo Caldas |-CallExpression Expression
2683718e550cSEduardo Caldas | |-IdExpression Callee
2684718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
26852de2ca34SEduardo Caldas | |   `-'f'
26862de2ca34SEduardo Caldas | |-'(' OpenParen
26872de2ca34SEduardo Caldas | `-')' CloseParen
26882de2ca34SEduardo Caldas `-';'
26892de2ca34SEduardo Caldas )txt"}));
26902de2ca34SEduardo Caldas }
26912de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_One)2692c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_One) {
26932de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
26942de2ca34SEduardo Caldas     return;
26952de2ca34SEduardo Caldas   }
26962de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
26972de2ca34SEduardo Caldas       R"cpp(
26982de2ca34SEduardo Caldas void f(int);
26992de2ca34SEduardo Caldas void test() {
27002de2ca34SEduardo Caldas   [[f(1);]]
27012de2ca34SEduardo Caldas }
27022de2ca34SEduardo Caldas )cpp",
27032de2ca34SEduardo Caldas       {R"txt(
2704718e550cSEduardo Caldas ExpressionStatement Statement
2705718e550cSEduardo Caldas |-CallExpression Expression
2706718e550cSEduardo Caldas | |-IdExpression Callee
2707718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
27082de2ca34SEduardo Caldas | |   `-'f'
27092de2ca34SEduardo Caldas | |-'(' OpenParen
2710718e550cSEduardo Caldas | |-CallArguments Arguments
2711718e550cSEduardo Caldas | | `-IntegerLiteralExpression ListElement
27122de2ca34SEduardo Caldas | |   `-'1' LiteralToken
27132de2ca34SEduardo Caldas | `-')' CloseParen
27142de2ca34SEduardo Caldas `-';'
27152de2ca34SEduardo Caldas )txt"}));
27162de2ca34SEduardo Caldas }
27172de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_Multiple)2718c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_Multiple) {
27192de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
27202de2ca34SEduardo Caldas     return;
27212de2ca34SEduardo Caldas   }
27222de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
27232de2ca34SEduardo Caldas       R"cpp(
27242de2ca34SEduardo Caldas void f(int, char, float);
27252de2ca34SEduardo Caldas void test() {
27262de2ca34SEduardo Caldas   [[f(1, '2', 3.);]]
27272de2ca34SEduardo Caldas }
27282de2ca34SEduardo Caldas )cpp",
27292de2ca34SEduardo Caldas       {R"txt(
2730718e550cSEduardo Caldas ExpressionStatement Statement
2731718e550cSEduardo Caldas |-CallExpression Expression
2732718e550cSEduardo Caldas | |-IdExpression Callee
2733718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
27342de2ca34SEduardo Caldas | |   `-'f'
27352de2ca34SEduardo Caldas | |-'(' OpenParen
2736718e550cSEduardo Caldas | |-CallArguments Arguments
2737718e550cSEduardo Caldas | | |-IntegerLiteralExpression ListElement
27382de2ca34SEduardo Caldas | | | `-'1' LiteralToken
2739718e550cSEduardo Caldas | | |-',' ListDelimiter
2740718e550cSEduardo Caldas | | |-CharacterLiteralExpression ListElement
27412de2ca34SEduardo Caldas | | | `-''2'' LiteralToken
2742718e550cSEduardo Caldas | | |-',' ListDelimiter
2743718e550cSEduardo Caldas | | `-FloatingLiteralExpression ListElement
27442de2ca34SEduardo Caldas | |   `-'3.' LiteralToken
27452de2ca34SEduardo Caldas | `-')' CloseParen
27462de2ca34SEduardo Caldas `-';'
27472de2ca34SEduardo Caldas )txt"}));
27482de2ca34SEduardo Caldas }
27492de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_Assignment)2750c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_Assignment) {
27512de2ca34SEduardo Caldas   if (!GetParam().isCXX()) {
27522de2ca34SEduardo Caldas     return;
27532de2ca34SEduardo Caldas   }
27542de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
27552de2ca34SEduardo Caldas       R"cpp(
27562de2ca34SEduardo Caldas void f(int);
27572de2ca34SEduardo Caldas void test(int a) {
27582de2ca34SEduardo Caldas   [[f(a = 1);]]
27592de2ca34SEduardo Caldas }
27602de2ca34SEduardo Caldas )cpp",
27612de2ca34SEduardo Caldas       {R"txt(
2762718e550cSEduardo Caldas ExpressionStatement Statement
2763718e550cSEduardo Caldas |-CallExpression Expression
2764718e550cSEduardo Caldas | |-IdExpression Callee
2765718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
27662de2ca34SEduardo Caldas | |   `-'f'
27672de2ca34SEduardo Caldas | |-'(' OpenParen
2768718e550cSEduardo Caldas | |-CallArguments Arguments
2769718e550cSEduardo Caldas | | `-BinaryOperatorExpression ListElement
2770718e550cSEduardo Caldas | |   |-IdExpression LeftHandSide
2771718e550cSEduardo Caldas | |   | `-UnqualifiedId UnqualifiedId
27722de2ca34SEduardo Caldas | |   |   `-'a'
2773718e550cSEduardo Caldas | |   |-'=' OperatorToken
2774718e550cSEduardo Caldas | |   `-IntegerLiteralExpression RightHandSide
27752de2ca34SEduardo Caldas | |     `-'1' LiteralToken
27762de2ca34SEduardo Caldas | `-')' CloseParen
27772de2ca34SEduardo Caldas `-';'
27782de2ca34SEduardo Caldas )txt"}));
27792de2ca34SEduardo Caldas }
27802de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_BracedInitList_Empty)2781c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_BracedInitList_Empty) {
27822de2ca34SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
27832de2ca34SEduardo Caldas     return;
27842de2ca34SEduardo Caldas   }
27852de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
27862de2ca34SEduardo Caldas       R"cpp(
27872de2ca34SEduardo Caldas void f(int[]);
27882de2ca34SEduardo Caldas void test() {
27892de2ca34SEduardo Caldas   [[f({});]]
27902de2ca34SEduardo Caldas }
27912de2ca34SEduardo Caldas )cpp",
27922de2ca34SEduardo Caldas       {R"txt(
2793718e550cSEduardo Caldas ExpressionStatement Statement
2794718e550cSEduardo Caldas |-CallExpression Expression
2795718e550cSEduardo Caldas | |-IdExpression Callee
2796718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
27972de2ca34SEduardo Caldas | |   `-'f'
27982de2ca34SEduardo Caldas | |-'(' OpenParen
2799718e550cSEduardo Caldas | |-CallArguments Arguments
2800718e550cSEduardo Caldas | | `-UnknownExpression ListElement
28012de2ca34SEduardo Caldas | |   `-UnknownExpression
28022de2ca34SEduardo Caldas | |     |-'{'
28032de2ca34SEduardo Caldas | |     `-'}'
28042de2ca34SEduardo Caldas | `-')' CloseParen
28052de2ca34SEduardo Caldas `-';'
28062de2ca34SEduardo Caldas )txt"}));
28072de2ca34SEduardo Caldas }
28082de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_BracedInitList_Simple)2809c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_BracedInitList_Simple) {
28102de2ca34SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
28112de2ca34SEduardo Caldas     return;
28122de2ca34SEduardo Caldas   }
28132de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
28142de2ca34SEduardo Caldas       R"cpp(
28152de2ca34SEduardo Caldas struct TT {};
28162de2ca34SEduardo Caldas struct T{
28172de2ca34SEduardo Caldas   int a;
28182de2ca34SEduardo Caldas   TT b;
28192de2ca34SEduardo Caldas };
28202de2ca34SEduardo Caldas void f(T);
28212de2ca34SEduardo Caldas void test() {
28222de2ca34SEduardo Caldas   [[f({1, {}});]]
28232de2ca34SEduardo Caldas }
28242de2ca34SEduardo Caldas )cpp",
28252de2ca34SEduardo Caldas       {R"txt(
2826718e550cSEduardo Caldas ExpressionStatement Statement
2827718e550cSEduardo Caldas |-CallExpression Expression
2828718e550cSEduardo Caldas | |-IdExpression Callee
2829718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
28302de2ca34SEduardo Caldas | |   `-'f'
28312de2ca34SEduardo Caldas | |-'(' OpenParen
2832718e550cSEduardo Caldas | |-CallArguments Arguments
2833718e550cSEduardo Caldas | | `-UnknownExpression ListElement
28342de2ca34SEduardo Caldas | |   `-UnknownExpression
28352de2ca34SEduardo Caldas | |     |-'{'
28362de2ca34SEduardo Caldas | |     |-IntegerLiteralExpression
28372de2ca34SEduardo Caldas | |     | `-'1' LiteralToken
28382de2ca34SEduardo Caldas | |     |-','
28392de2ca34SEduardo Caldas | |     |-UnknownExpression
28402de2ca34SEduardo Caldas | |     | `-UnknownExpression
28412de2ca34SEduardo Caldas | |     |   |-'{'
28422de2ca34SEduardo Caldas | |     |   `-'}'
28432de2ca34SEduardo Caldas | |     `-'}'
28442de2ca34SEduardo Caldas | `-')' CloseParen
28452de2ca34SEduardo Caldas `-';'
28462de2ca34SEduardo Caldas )txt"}));
28472de2ca34SEduardo Caldas }
28482de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_BracedInitList_Designated)2849c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
2850c01d28dcSEduardo Caldas        CallExpression_Arguments_BracedInitList_Designated) {
28512de2ca34SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
28522de2ca34SEduardo Caldas     return;
28532de2ca34SEduardo Caldas   }
28542de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
28552de2ca34SEduardo Caldas       R"cpp(
28562de2ca34SEduardo Caldas struct TT {};
28572de2ca34SEduardo Caldas struct T{
28582de2ca34SEduardo Caldas   int a;
28592de2ca34SEduardo Caldas   TT b;
28602de2ca34SEduardo Caldas };
28612de2ca34SEduardo Caldas void f(T);
28622de2ca34SEduardo Caldas void test() {
28632de2ca34SEduardo Caldas   [[f({.a = 1, .b {}});]]
28642de2ca34SEduardo Caldas }
28652de2ca34SEduardo Caldas )cpp",
28662de2ca34SEduardo Caldas       {R"txt(
2867718e550cSEduardo Caldas ExpressionStatement Statement
2868718e550cSEduardo Caldas |-CallExpression Expression
2869718e550cSEduardo Caldas | |-IdExpression Callee
2870718e550cSEduardo Caldas | | `-UnqualifiedId UnqualifiedId
28712de2ca34SEduardo Caldas | |   `-'f'
28722de2ca34SEduardo Caldas | |-'(' OpenParen
2873718e550cSEduardo Caldas | |-CallArguments Arguments
2874718e550cSEduardo Caldas | | `-UnknownExpression ListElement
28752de2ca34SEduardo Caldas | |   `-UnknownExpression
28762de2ca34SEduardo Caldas | |     |-'{'
28772de2ca34SEduardo Caldas | |     |-UnknownExpression
28782de2ca34SEduardo Caldas | |     | |-'.'
28792de2ca34SEduardo Caldas | |     | |-'a'
28802de2ca34SEduardo Caldas | |     | |-'='
28812de2ca34SEduardo Caldas | |     | `-IntegerLiteralExpression
28822de2ca34SEduardo Caldas | |     |   `-'1' LiteralToken
28832de2ca34SEduardo Caldas | |     |-','
28842de2ca34SEduardo Caldas | |     |-UnknownExpression
28852de2ca34SEduardo Caldas | |     | |-'.'
28862de2ca34SEduardo Caldas | |     | |-'b'
28872de2ca34SEduardo Caldas | |     | `-UnknownExpression
28882de2ca34SEduardo Caldas | |     |   `-UnknownExpression
28892de2ca34SEduardo Caldas | |     |     |-'{'
28902de2ca34SEduardo Caldas | |     |     `-'}'
28912de2ca34SEduardo Caldas | |     `-'}'
28922de2ca34SEduardo Caldas | `-')' CloseParen
28932de2ca34SEduardo Caldas `-';'
28942de2ca34SEduardo Caldas )txt"}));
28952de2ca34SEduardo Caldas }
28962de2ca34SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_Arguments_ParameterPack)2897c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_ParameterPack) {
28982de2ca34SEduardo Caldas   if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) {
28992de2ca34SEduardo Caldas     return;
29002de2ca34SEduardo Caldas   }
29012de2ca34SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
29022de2ca34SEduardo Caldas       R"cpp(
29032de2ca34SEduardo Caldas template<typename T, typename... Args>
29042de2ca34SEduardo Caldas void test(T t, Args... args) {
29052de2ca34SEduardo Caldas   [[test(args...)]];
29062de2ca34SEduardo Caldas }
29072de2ca34SEduardo Caldas )cpp",
29082de2ca34SEduardo Caldas       {R"txt(
2909718e550cSEduardo Caldas CallExpression Expression
2910718e550cSEduardo Caldas |-UnknownExpression Callee
29112de2ca34SEduardo Caldas | `-'test'
29122de2ca34SEduardo Caldas |-'(' OpenParen
2913718e550cSEduardo Caldas |-CallArguments Arguments
2914718e550cSEduardo Caldas | `-UnknownExpression ListElement
29152de2ca34SEduardo Caldas |   |-IdExpression
2916718e550cSEduardo Caldas |   | `-UnqualifiedId UnqualifiedId
29172de2ca34SEduardo Caldas |   |   `-'args'
29182de2ca34SEduardo Caldas |   `-'...'
29192de2ca34SEduardo Caldas `-')' CloseParen
2920ba32915dSEduardo Caldas )txt"}));
2921ba32915dSEduardo Caldas }
2922ba32915dSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,CallExpression_DefaultArguments)2923c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, CallExpression_DefaultArguments) {
2924f5087d5cSEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
2925f5087d5cSEduardo Caldas     return;
2926f5087d5cSEduardo Caldas   }
2927f5087d5cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
2928f5087d5cSEduardo Caldas       R"cpp(
2929f5087d5cSEduardo Caldas void f(int i = 1, char c = '2');
2930f5087d5cSEduardo Caldas void test() {
2931f5087d5cSEduardo Caldas   [[f()]];
2932f5087d5cSEduardo Caldas   [[f(1)]];
2933f5087d5cSEduardo Caldas   [[f(1, '2')]];
2934f5087d5cSEduardo Caldas }
2935f5087d5cSEduardo Caldas )cpp",
2936f5087d5cSEduardo Caldas       {R"txt(
2937f5087d5cSEduardo Caldas CallExpression Expression
2938f5087d5cSEduardo Caldas |-IdExpression Callee
2939f5087d5cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
2940f5087d5cSEduardo Caldas |   `-'f'
2941f5087d5cSEduardo Caldas |-'(' OpenParen
2942f5087d5cSEduardo Caldas `-')' CloseParen
2943f5087d5cSEduardo Caldas       )txt",
2944f5087d5cSEduardo Caldas        R"txt(
2945f5087d5cSEduardo Caldas CallExpression Expression
2946f5087d5cSEduardo Caldas |-IdExpression Callee
2947f5087d5cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
2948f5087d5cSEduardo Caldas |   `-'f'
2949f5087d5cSEduardo Caldas |-'(' OpenParen
2950f5087d5cSEduardo Caldas |-CallArguments Arguments
2951f5087d5cSEduardo Caldas | `-IntegerLiteralExpression ListElement
2952f5087d5cSEduardo Caldas |   `-'1' LiteralToken
2953f5087d5cSEduardo Caldas `-')' CloseParen
2954f5087d5cSEduardo Caldas       )txt",
2955f5087d5cSEduardo Caldas        R"txt(
2956f5087d5cSEduardo Caldas CallExpression Expression
2957f5087d5cSEduardo Caldas |-IdExpression Callee
2958f5087d5cSEduardo Caldas | `-UnqualifiedId UnqualifiedId
2959f5087d5cSEduardo Caldas |   `-'f'
2960f5087d5cSEduardo Caldas |-'(' OpenParen
2961f5087d5cSEduardo Caldas |-CallArguments Arguments
2962f5087d5cSEduardo Caldas | |-IntegerLiteralExpression ListElement
2963f5087d5cSEduardo Caldas | | `-'1' LiteralToken
2964f5087d5cSEduardo Caldas | |-',' ListDelimiter
2965f5087d5cSEduardo Caldas | `-CharacterLiteralExpression ListElement
2966f5087d5cSEduardo Caldas |   `-''2'' LiteralToken
2967f5087d5cSEduardo Caldas `-')' CloseParen
2968f5087d5cSEduardo Caldas )txt"}));
2969f5087d5cSEduardo Caldas }
2970f5087d5cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MultipleDeclaratorsGrouping)2971c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MultipleDeclaratorsGrouping) {
2972d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
2973d17437d2SEduardo Caldas       R"cpp(
2974d17437d2SEduardo Caldas int *a, b;
2975d17437d2SEduardo Caldas int *c, d;
2976d17437d2SEduardo Caldas )cpp",
2977d17437d2SEduardo Caldas       R"txt(
29785c11c08dSEduardo Caldas TranslationUnit Detached
2979d17437d2SEduardo Caldas |-SimpleDeclaration
29805c11c08dSEduardo Caldas | |-'int'
29815011d431SEduardo Caldas | |-DeclaratorList Declarators
29825011d431SEduardo Caldas | | |-SimpleDeclarator ListElement
29835011d431SEduardo Caldas | | | |-'*'
29845011d431SEduardo Caldas | | | `-'a'
29855011d431SEduardo Caldas | | |-',' ListDelimiter
29865011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
29875c11c08dSEduardo Caldas | |   `-'b'
29885c11c08dSEduardo Caldas | `-';'
2989d17437d2SEduardo Caldas `-SimpleDeclaration
29905c11c08dSEduardo Caldas   |-'int'
29915011d431SEduardo Caldas   |-DeclaratorList Declarators
29925011d431SEduardo Caldas   | |-SimpleDeclarator ListElement
29935011d431SEduardo Caldas   | | |-'*'
29945011d431SEduardo Caldas   | | `-'c'
29955011d431SEduardo Caldas   | |-',' ListDelimiter
29965011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
29975c11c08dSEduardo Caldas   |   `-'d'
29985c11c08dSEduardo Caldas   `-';'
2999d17437d2SEduardo Caldas )txt"));
3000d17437d2SEduardo Caldas }
3001d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MultipleDeclaratorsGroupingTypedef)3002c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MultipleDeclaratorsGroupingTypedef) {
3003d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3004d17437d2SEduardo Caldas       R"cpp(
3005d17437d2SEduardo Caldas typedef int *a, b;
3006d17437d2SEduardo Caldas )cpp",
3007d17437d2SEduardo Caldas       R"txt(
30085c11c08dSEduardo Caldas TranslationUnit Detached
3009d17437d2SEduardo Caldas `-SimpleDeclaration
30105c11c08dSEduardo Caldas   |-'typedef'
30115c11c08dSEduardo Caldas   |-'int'
30125011d431SEduardo Caldas   |-DeclaratorList Declarators
30135011d431SEduardo Caldas   | |-SimpleDeclarator ListElement
30145011d431SEduardo Caldas   | | |-'*'
30155011d431SEduardo Caldas   | | `-'a'
30165011d431SEduardo Caldas   | |-',' ListDelimiter
30175011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
30185c11c08dSEduardo Caldas   |   `-'b'
30195c11c08dSEduardo Caldas   `-';'
3020d17437d2SEduardo Caldas )txt"));
3021d17437d2SEduardo Caldas }
3022d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MultipleDeclaratorsInsideStatement)3023c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MultipleDeclaratorsInsideStatement) {
3024d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3025d17437d2SEduardo Caldas       R"cpp(
3026d17437d2SEduardo Caldas void foo() {
3027d17437d2SEduardo Caldas   int *a, b;
3028d17437d2SEduardo Caldas   typedef int *ta, tb;
3029d17437d2SEduardo Caldas }
3030d17437d2SEduardo Caldas )cpp",
3031d17437d2SEduardo Caldas       R"txt(
30325c11c08dSEduardo Caldas TranslationUnit Detached
3033d17437d2SEduardo Caldas `-SimpleDeclaration
30345c11c08dSEduardo Caldas   |-'void'
30355011d431SEduardo Caldas   |-DeclaratorList Declarators
30365011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
30375c11c08dSEduardo Caldas   |   |-'foo'
3038d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
30395c11c08dSEduardo Caldas   |     |-'(' OpenParen
30405c11c08dSEduardo Caldas   |     `-')' CloseParen
3041d17437d2SEduardo Caldas   `-CompoundStatement
30425c11c08dSEduardo Caldas     |-'{' OpenParen
3043718e550cSEduardo Caldas     |-DeclarationStatement Statement
3044d17437d2SEduardo Caldas     | |-SimpleDeclaration
30455c11c08dSEduardo Caldas     | | |-'int'
30465011d431SEduardo Caldas     | | `-DeclaratorList Declarators
30475011d431SEduardo Caldas     | |   |-SimpleDeclarator ListElement
30485c11c08dSEduardo Caldas     | |   | |-'*'
30495c11c08dSEduardo Caldas     | |   | `-'a'
30505011d431SEduardo Caldas     | |   |-',' ListDelimiter
30515011d431SEduardo Caldas     | |   `-SimpleDeclarator ListElement
30525c11c08dSEduardo Caldas     | |     `-'b'
30535c11c08dSEduardo Caldas     | `-';'
3054718e550cSEduardo Caldas     |-DeclarationStatement Statement
3055d17437d2SEduardo Caldas     | |-SimpleDeclaration
30565c11c08dSEduardo Caldas     | | |-'typedef'
30575c11c08dSEduardo Caldas     | | |-'int'
30585011d431SEduardo Caldas     | | `-DeclaratorList Declarators
30595011d431SEduardo Caldas     | |   |-SimpleDeclarator ListElement
30605c11c08dSEduardo Caldas     | |   | |-'*'
30615c11c08dSEduardo Caldas     | |   | `-'ta'
30625011d431SEduardo Caldas     | |   |-',' ListDelimiter
30635011d431SEduardo Caldas     | |   `-SimpleDeclarator ListElement
30645c11c08dSEduardo Caldas     | |     `-'tb'
30655c11c08dSEduardo Caldas     | `-';'
30665c11c08dSEduardo Caldas     `-'}' CloseParen
3067d17437d2SEduardo Caldas )txt"));
3068d17437d2SEduardo Caldas }
3069d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,SizeTTypedef)3070c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, SizeTTypedef) {
3071c8c92b54SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
3072c8c92b54SEduardo Caldas     return;
3073c8c92b54SEduardo Caldas   }
3074c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3075c8c92b54SEduardo Caldas       R"cpp(
3076c8c92b54SEduardo Caldas typedef decltype(sizeof(void *)) size_t;
3077c8c92b54SEduardo Caldas     )cpp",
3078c8c92b54SEduardo Caldas       R"txt(
30795c11c08dSEduardo Caldas TranslationUnit Detached
3080c8c92b54SEduardo Caldas `-SimpleDeclaration
30815c11c08dSEduardo Caldas   |-'typedef'
30825c11c08dSEduardo Caldas   |-'decltype'
30835c11c08dSEduardo Caldas   |-'('
3084c8c92b54SEduardo Caldas   |-UnknownExpression
30855c11c08dSEduardo Caldas   | |-'sizeof'
30865c11c08dSEduardo Caldas   | |-'('
30875c11c08dSEduardo Caldas   | |-'void'
30885c11c08dSEduardo Caldas   | |-'*'
30895c11c08dSEduardo Caldas   | `-')'
30905c11c08dSEduardo Caldas   |-')'
30915011d431SEduardo Caldas   |-DeclaratorList Declarators
30925011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
30935c11c08dSEduardo Caldas   |   `-'size_t'
30945c11c08dSEduardo Caldas   `-';'
3095c8c92b54SEduardo Caldas )txt"));
3096c8c92b54SEduardo Caldas }
3097c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Namespace_Nested)3098c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Namespace_Nested) {
3099d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
3100d17437d2SEduardo Caldas     return;
3101d17437d2SEduardo Caldas   }
3102d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3103d17437d2SEduardo Caldas       R"cpp(
3104d17437d2SEduardo Caldas namespace a { namespace b {} }
31053b75f65eSEduardo Caldas )cpp",
31063b75f65eSEduardo Caldas       R"txt(
31073b75f65eSEduardo Caldas TranslationUnit Detached
31083b75f65eSEduardo Caldas `-NamespaceDefinition
31093b75f65eSEduardo Caldas   |-'namespace'
31103b75f65eSEduardo Caldas   |-'a'
31113b75f65eSEduardo Caldas   |-'{'
31123b75f65eSEduardo Caldas   |-NamespaceDefinition
31133b75f65eSEduardo Caldas   | |-'namespace'
31143b75f65eSEduardo Caldas   | |-'b'
31153b75f65eSEduardo Caldas   | |-'{'
31163b75f65eSEduardo Caldas   | `-'}'
31173b75f65eSEduardo Caldas   `-'}'
31183b75f65eSEduardo Caldas )txt"));
31193b75f65eSEduardo Caldas }
31203b75f65eSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Namespace_NestedDefinition)3121c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Namespace_NestedDefinition) {
31223b75f65eSEduardo Caldas   if (!GetParam().isCXX17OrLater()) {
31233b75f65eSEduardo Caldas     return;
31243b75f65eSEduardo Caldas   }
31253b75f65eSEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
31263b75f65eSEduardo Caldas       R"cpp(
3127d17437d2SEduardo Caldas namespace a::b {}
3128d17437d2SEduardo Caldas )cpp",
3129d17437d2SEduardo Caldas       R"txt(
31305c11c08dSEduardo Caldas TranslationUnit Detached
3131e4e983e2SEduardo Caldas `-NamespaceDefinition
31325c11c08dSEduardo Caldas   |-'namespace'
31335c11c08dSEduardo Caldas   |-'a'
31345c11c08dSEduardo Caldas   |-'::'
31355c11c08dSEduardo Caldas   |-'b'
31365c11c08dSEduardo Caldas   |-'{'
31375c11c08dSEduardo Caldas   `-'}'
3138e4e983e2SEduardo Caldas )txt"));
3139e4e983e2SEduardo Caldas }
3140e4e983e2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Namespace_Unnamed)3141c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Namespace_Unnamed) {
3142e4e983e2SEduardo Caldas   if (!GetParam().isCXX()) {
3143e4e983e2SEduardo Caldas     return;
3144e4e983e2SEduardo Caldas   }
3145e4e983e2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3146e4e983e2SEduardo Caldas       R"cpp(
3147e4e983e2SEduardo Caldas namespace {}
3148e4e983e2SEduardo Caldas )cpp",
3149e4e983e2SEduardo Caldas       R"txt(
31505c11c08dSEduardo Caldas TranslationUnit Detached
3151e4e983e2SEduardo Caldas `-NamespaceDefinition
31525c11c08dSEduardo Caldas   |-'namespace'
31535c11c08dSEduardo Caldas   |-'{'
31545c11c08dSEduardo Caldas   `-'}'
3155e4e983e2SEduardo Caldas )txt"));
3156e4e983e2SEduardo Caldas }
3157e4e983e2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Namespace_Alias)3158c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Namespace_Alias) {
3159e4e983e2SEduardo Caldas   if (!GetParam().isCXX()) {
3160e4e983e2SEduardo Caldas     return;
3161e4e983e2SEduardo Caldas   }
3162e4e983e2SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3163e4e983e2SEduardo Caldas       R"cpp(
3164e4e983e2SEduardo Caldas namespace a {}
3165e4e983e2SEduardo Caldas [[namespace foo = a;]]
3166e4e983e2SEduardo Caldas )cpp",
3167e4e983e2SEduardo Caldas       {R"txt(
3168e4e983e2SEduardo Caldas NamespaceAliasDefinition
31695c11c08dSEduardo Caldas |-'namespace'
31705c11c08dSEduardo Caldas |-'foo'
31715c11c08dSEduardo Caldas |-'='
31725c11c08dSEduardo Caldas |-'a'
31735c11c08dSEduardo Caldas `-';'
3174e4e983e2SEduardo Caldas )txt"}));
3175d17437d2SEduardo Caldas }
3176d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UsingDirective)3177c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UsingDirective) {
3178d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
3179d17437d2SEduardo Caldas     return;
3180d17437d2SEduardo Caldas   }
3181e4e983e2SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3182d17437d2SEduardo Caldas       R"cpp(
3183d17437d2SEduardo Caldas namespace ns {}
3184e4e983e2SEduardo Caldas [[using namespace ::ns;]]
3185d17437d2SEduardo Caldas )cpp",
3186e4e983e2SEduardo Caldas       {R"txt(
3187e4e983e2SEduardo Caldas UsingNamespaceDirective
31885c11c08dSEduardo Caldas |-'using'
31895c11c08dSEduardo Caldas |-'namespace'
3190d17437d2SEduardo Caldas |-NestedNameSpecifier
3191718e550cSEduardo Caldas | `-'::' ListDelimiter
31925c11c08dSEduardo Caldas |-'ns'
31935c11c08dSEduardo Caldas `-';'
3194e4e983e2SEduardo Caldas )txt"}));
3195d17437d2SEduardo Caldas }
3196d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UsingDeclaration_Namespace)3197c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UsingDeclaration_Namespace) {
3198d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
3199d17437d2SEduardo Caldas     return;
3200d17437d2SEduardo Caldas   }
3201e4e983e2SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3202d17437d2SEduardo Caldas       R"cpp(
3203d17437d2SEduardo Caldas namespace ns { int a; }
3204e4e983e2SEduardo Caldas [[using ns::a;]]
3205d17437d2SEduardo Caldas )cpp",
3206e4e983e2SEduardo Caldas       {R"txt(
3207e4e983e2SEduardo Caldas UsingDeclaration
32085c11c08dSEduardo Caldas |-'using'
3209d17437d2SEduardo Caldas |-NestedNameSpecifier
3210718e550cSEduardo Caldas | |-IdentifierNameSpecifier ListElement
32115c11c08dSEduardo Caldas | | `-'ns'
3212718e550cSEduardo Caldas | `-'::' ListDelimiter
32135c11c08dSEduardo Caldas |-'a'
32145c11c08dSEduardo Caldas `-';'
3215e4e983e2SEduardo Caldas )txt"}));
3216d17437d2SEduardo Caldas }
3217d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UsingDeclaration_ClassMember)3218c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UsingDeclaration_ClassMember) {
321990f85dfcSEduardo Caldas   if (!GetParam().isCXX()) {
322090f85dfcSEduardo Caldas     return;
322190f85dfcSEduardo Caldas   }
322290f85dfcSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
322390f85dfcSEduardo Caldas       R"cpp(
322490f85dfcSEduardo Caldas template <class T> struct X {
322590f85dfcSEduardo Caldas   [[using T::foo;]]
322690f85dfcSEduardo Caldas   [[using typename T::bar;]]
322790f85dfcSEduardo Caldas };
322890f85dfcSEduardo Caldas )cpp",
322990f85dfcSEduardo Caldas       {R"txt(
323090f85dfcSEduardo Caldas UsingDeclaration
32315c11c08dSEduardo Caldas |-'using'
323290f85dfcSEduardo Caldas |-NestedNameSpecifier
3233718e550cSEduardo Caldas | |-IdentifierNameSpecifier ListElement
32345c11c08dSEduardo Caldas | | `-'T'
3235718e550cSEduardo Caldas | `-'::' ListDelimiter
32365c11c08dSEduardo Caldas |-'foo'
32375c11c08dSEduardo Caldas `-';'
323890f85dfcSEduardo Caldas )txt",
323990f85dfcSEduardo Caldas        R"txt(
324090f85dfcSEduardo Caldas UsingDeclaration
32415c11c08dSEduardo Caldas |-'using'
32425c11c08dSEduardo Caldas |-'typename'
324390f85dfcSEduardo Caldas |-NestedNameSpecifier
3244718e550cSEduardo Caldas | |-IdentifierNameSpecifier ListElement
32455c11c08dSEduardo Caldas | | `-'T'
3246718e550cSEduardo Caldas | `-'::' ListDelimiter
32475c11c08dSEduardo Caldas |-'bar'
32485c11c08dSEduardo Caldas `-';'
324990f85dfcSEduardo Caldas )txt"}));
325090f85dfcSEduardo Caldas }
325190f85dfcSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,UsingTypeAlias)3252c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, UsingTypeAlias) {
32533b75f65eSEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
325490f85dfcSEduardo Caldas     return;
325590f85dfcSEduardo Caldas   }
325690f85dfcSEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
325790f85dfcSEduardo Caldas       R"cpp(
325890f85dfcSEduardo Caldas using type = int;
325990f85dfcSEduardo Caldas )cpp",
326090f85dfcSEduardo Caldas       R"txt(
32615c11c08dSEduardo Caldas TranslationUnit Detached
326290f85dfcSEduardo Caldas `-TypeAliasDeclaration
32635c11c08dSEduardo Caldas   |-'using'
32645c11c08dSEduardo Caldas   |-'type'
32655c11c08dSEduardo Caldas   |-'='
32665c11c08dSEduardo Caldas   |-'int'
32675c11c08dSEduardo Caldas   `-';'
326890f85dfcSEduardo Caldas )txt"));
326990f85dfcSEduardo Caldas }
327090f85dfcSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,FreeStandingClass_ForwardDeclaration)3271c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, FreeStandingClass_ForwardDeclaration) {
3272b4093d66SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3273d17437d2SEduardo Caldas       R"cpp(
3274b4093d66SEduardo Caldas [[struct X;]]
3275b4093d66SEduardo Caldas [[struct Y *y1;]]
3276d17437d2SEduardo Caldas )cpp",
3277b4093d66SEduardo Caldas       {R"txt(
3278b4093d66SEduardo Caldas SimpleDeclaration
32795c11c08dSEduardo Caldas |-'struct'
32805c11c08dSEduardo Caldas |-'X'
32815c11c08dSEduardo Caldas `-';'
3282b4093d66SEduardo Caldas )txt",
3283d17437d2SEduardo Caldas        R"txt(
3284b4093d66SEduardo Caldas SimpleDeclaration
32855c11c08dSEduardo Caldas |-'struct'
32865c11c08dSEduardo Caldas |-'Y'
32875011d431SEduardo Caldas |-DeclaratorList Declarators
32885011d431SEduardo Caldas | `-SimpleDeclarator ListElement
32895c11c08dSEduardo Caldas |   |-'*'
32905c11c08dSEduardo Caldas |   `-'y1'
32915c11c08dSEduardo Caldas `-';'
3292b4093d66SEduardo Caldas )txt"}));
3293b4093d66SEduardo Caldas }
3294b4093d66SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,FreeStandingClasses_Definition)3295c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, FreeStandingClasses_Definition) {
3296b4093d66SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3297b4093d66SEduardo Caldas       R"cpp(
3298b4093d66SEduardo Caldas [[struct X {};]]
3299b4093d66SEduardo Caldas [[struct Y {} *y2;]]
3300b4093d66SEduardo Caldas [[struct {} *a1;]]
3301b4093d66SEduardo Caldas )cpp",
3302b4093d66SEduardo Caldas       {R"txt(
3303b4093d66SEduardo Caldas SimpleDeclaration
33045c11c08dSEduardo Caldas |-'struct'
33055c11c08dSEduardo Caldas |-'X'
33065c11c08dSEduardo Caldas |-'{'
33075c11c08dSEduardo Caldas |-'}'
33085c11c08dSEduardo Caldas `-';'
3309b4093d66SEduardo Caldas )txt",
3310b4093d66SEduardo Caldas        R"txt(
3311b4093d66SEduardo Caldas SimpleDeclaration
33125c11c08dSEduardo Caldas |-'struct'
33135c11c08dSEduardo Caldas |-'Y'
33145c11c08dSEduardo Caldas |-'{'
33155c11c08dSEduardo Caldas |-'}'
33165011d431SEduardo Caldas |-DeclaratorList Declarators
33175011d431SEduardo Caldas | `-SimpleDeclarator ListElement
33185c11c08dSEduardo Caldas |   |-'*'
33195c11c08dSEduardo Caldas |   `-'y2'
33205c11c08dSEduardo Caldas `-';'
3321b4093d66SEduardo Caldas )txt",
3322b4093d66SEduardo Caldas        R"txt(
3323b4093d66SEduardo Caldas SimpleDeclaration
33245c11c08dSEduardo Caldas |-'struct'
33255c11c08dSEduardo Caldas |-'{'
33265c11c08dSEduardo Caldas |-'}'
33275011d431SEduardo Caldas |-DeclaratorList Declarators
33285011d431SEduardo Caldas | `-SimpleDeclarator ListElement
33295c11c08dSEduardo Caldas |   |-'*'
33305c11c08dSEduardo Caldas |   `-'a1'
33315c11c08dSEduardo Caldas `-';'
3332b4093d66SEduardo Caldas )txt"}));
3333d17437d2SEduardo Caldas }
3334d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,StaticMemberFunction)3335c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, StaticMemberFunction) {
3336c8c92b54SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
3337d17437d2SEduardo Caldas     return;
3338d17437d2SEduardo Caldas   }
3339ed830952SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3340d17437d2SEduardo Caldas       R"cpp(
3341c8c92b54SEduardo Caldas struct S {
3342ed830952SEduardo Caldas   [[static void f(){}]]
3343c8c92b54SEduardo Caldas };
3344d17437d2SEduardo Caldas )cpp",
3345ed830952SEduardo Caldas       {R"txt(
3346ed830952SEduardo Caldas SimpleDeclaration
33475c11c08dSEduardo Caldas |-'static'
33485c11c08dSEduardo Caldas |-'void'
33495011d431SEduardo Caldas |-DeclaratorList Declarators
33505011d431SEduardo Caldas | `-SimpleDeclarator ListElement
33515c11c08dSEduardo Caldas |   |-'f'
3352ed830952SEduardo Caldas |   `-ParametersAndQualifiers
33535c11c08dSEduardo Caldas |     |-'(' OpenParen
33545c11c08dSEduardo Caldas |     `-')' CloseParen
3355ed830952SEduardo Caldas `-CompoundStatement
33565c11c08dSEduardo Caldas   |-'{' OpenParen
33575c11c08dSEduardo Caldas   `-'}' CloseParen
3358ed830952SEduardo Caldas )txt"}));
3359c8c92b54SEduardo Caldas }
3360c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OutOfLineMemberFunctionDefinition)3361c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OutOfLineMemberFunctionDefinition) {
3362a1461953SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
3363a1461953SEduardo Caldas     return;
3364a1461953SEduardo Caldas   }
3365a1461953SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3366a1461953SEduardo Caldas       R"cpp(
3367a1461953SEduardo Caldas struct S {
3368a1461953SEduardo Caldas   void f();
3369a1461953SEduardo Caldas };
3370a1461953SEduardo Caldas [[void S::f(){}]]
3371a1461953SEduardo Caldas )cpp",
3372a1461953SEduardo Caldas       {R"txt(
3373a1461953SEduardo Caldas SimpleDeclaration
3374a1461953SEduardo Caldas |-'void'
33755011d431SEduardo Caldas |-DeclaratorList Declarators
33765011d431SEduardo Caldas | `-SimpleDeclarator ListElement
3377a1461953SEduardo Caldas |   |-NestedNameSpecifier
3378a1461953SEduardo Caldas |   | |-IdentifierNameSpecifier ListElement
3379a1461953SEduardo Caldas |   | | `-'S'
3380a1461953SEduardo Caldas |   | `-'::' ListDelimiter
3381a1461953SEduardo Caldas |   |-'f'
3382a1461953SEduardo Caldas |   `-ParametersAndQualifiers
3383a1461953SEduardo Caldas |     |-'(' OpenParen
3384a1461953SEduardo Caldas |     `-')' CloseParen
3385a1461953SEduardo Caldas `-CompoundStatement
3386a1461953SEduardo Caldas   |-'{' OpenParen
3387a1461953SEduardo Caldas   `-'}' CloseParen
3388a1461953SEduardo Caldas )txt"}));
3389a1461953SEduardo Caldas }
3390a1461953SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ConversionMemberFunction)3391c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ConversionMemberFunction) {
3392c8c92b54SEduardo Caldas   if (!GetParam().isCXX()) {
3393c8c92b54SEduardo Caldas     return;
3394c8c92b54SEduardo Caldas   }
3395ed830952SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3396c8c92b54SEduardo Caldas       R"cpp(
3397c8c92b54SEduardo Caldas struct X {
3398ed830952SEduardo Caldas   [[operator int();]]
3399c8c92b54SEduardo Caldas };
3400c8c92b54SEduardo Caldas )cpp",
3401ed830952SEduardo Caldas       {R"txt(
3402ed830952SEduardo Caldas SimpleDeclaration
34035011d431SEduardo Caldas |-DeclaratorList Declarators
34045011d431SEduardo Caldas | `-SimpleDeclarator ListElement
34055c11c08dSEduardo Caldas |   |-'operator'
34065c11c08dSEduardo Caldas |   |-'int'
3407ed830952SEduardo Caldas |   `-ParametersAndQualifiers
34085c11c08dSEduardo Caldas |     |-'(' OpenParen
34095c11c08dSEduardo Caldas |     `-')' CloseParen
34105c11c08dSEduardo Caldas `-';'
3411ed830952SEduardo Caldas )txt"}));
3412c8c92b54SEduardo Caldas }
3413c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,LiteralOperatorDeclaration)3414c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, LiteralOperatorDeclaration) {
3415c8c92b54SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
3416c8c92b54SEduardo Caldas     return;
3417c8c92b54SEduardo Caldas   }
3418c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3419c8c92b54SEduardo Caldas       R"cpp(
3420c8c92b54SEduardo Caldas unsigned operator "" _c(char);
3421c8c92b54SEduardo Caldas     )cpp",
3422c8c92b54SEduardo Caldas       R"txt(
34235c11c08dSEduardo Caldas TranslationUnit Detached
3424c8c92b54SEduardo Caldas `-SimpleDeclaration
34255c11c08dSEduardo Caldas   |-'unsigned'
34265011d431SEduardo Caldas   |-DeclaratorList Declarators
34275011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
34285c11c08dSEduardo Caldas   |   |-'operator'
34295c11c08dSEduardo Caldas   |   |-'""'
34305c11c08dSEduardo Caldas   |   |-'_c'
3431c8c92b54SEduardo Caldas   |   `-ParametersAndQualifiers
34325c11c08dSEduardo Caldas   |     |-'(' OpenParen
3433718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
3434718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
34355c11c08dSEduardo Caldas   |     |   `-'char'
34365c11c08dSEduardo Caldas   |     `-')' CloseParen
34375c11c08dSEduardo Caldas   `-';'
3438c8c92b54SEduardo Caldas )txt"));
3439c8c92b54SEduardo Caldas }
3440c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,NumericLiteralOperatorTemplateDeclaration)3441c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, NumericLiteralOperatorTemplateDeclaration) {
3442c8c92b54SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
3443c8c92b54SEduardo Caldas     return;
3444c8c92b54SEduardo Caldas   }
3445c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3446c8c92b54SEduardo Caldas       R"cpp(
3447c8c92b54SEduardo Caldas template <char...>
3448c8c92b54SEduardo Caldas unsigned operator "" _t();
3449c8c92b54SEduardo Caldas     )cpp",
3450c8c92b54SEduardo Caldas       R"txt(
34515c11c08dSEduardo Caldas TranslationUnit Detached
3452718e550cSEduardo Caldas `-TemplateDeclaration Declaration
34535c11c08dSEduardo Caldas   |-'template' IntroducerKeyword
34545c11c08dSEduardo Caldas   |-'<'
3455c8c92b54SEduardo Caldas   |-SimpleDeclaration
34565c11c08dSEduardo Caldas   | `-'char'
34575c11c08dSEduardo Caldas   |-'...'
34585c11c08dSEduardo Caldas   |-'>'
3459c8c92b54SEduardo Caldas   `-SimpleDeclaration
34605c11c08dSEduardo Caldas     |-'unsigned'
34615011d431SEduardo Caldas     |-DeclaratorList Declarators
34625011d431SEduardo Caldas     | `-SimpleDeclarator ListElement
34635c11c08dSEduardo Caldas     |   |-'operator'
34645c11c08dSEduardo Caldas     |   |-'""'
34655c11c08dSEduardo Caldas     |   |-'_t'
3466c8c92b54SEduardo Caldas     |   `-ParametersAndQualifiers
34675c11c08dSEduardo Caldas     |     |-'(' OpenParen
34685c11c08dSEduardo Caldas     |     `-')' CloseParen
34695c11c08dSEduardo Caldas     `-';'
3470c8c92b54SEduardo Caldas )txt"));
3471c8c92b54SEduardo Caldas }
3472c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperatorDeclaration)3473c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperatorDeclaration) {
3474c8c92b54SEduardo Caldas   if (!GetParam().isCXX()) {
3475c8c92b54SEduardo Caldas     return;
3476c8c92b54SEduardo Caldas   }
3477ed830952SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3478c8c92b54SEduardo Caldas       R"cpp(
3479c8c92b54SEduardo Caldas struct X {
3480ed830952SEduardo Caldas   [[X& operator=(const X&);]]
3481c8c92b54SEduardo Caldas };
3482c8c92b54SEduardo Caldas )cpp",
3483ed830952SEduardo Caldas       {R"txt(
3484ed830952SEduardo Caldas SimpleDeclaration
34855c11c08dSEduardo Caldas |-'X'
34865011d431SEduardo Caldas |-DeclaratorList Declarators
34875011d431SEduardo Caldas | `-SimpleDeclarator ListElement
34885c11c08dSEduardo Caldas |   |-'&'
34895c11c08dSEduardo Caldas |   |-'operator'
34905c11c08dSEduardo Caldas |   |-'='
3491ed830952SEduardo Caldas |   `-ParametersAndQualifiers
34925c11c08dSEduardo Caldas |     |-'(' OpenParen
3493718e550cSEduardo Caldas |     |-ParameterDeclarationList Parameters
3494718e550cSEduardo Caldas |     | `-SimpleDeclaration ListElement
34955c11c08dSEduardo Caldas |     |   |-'const'
34965c11c08dSEduardo Caldas |     |   |-'X'
34975011d431SEduardo Caldas |     |   `-DeclaratorList Declarators
34985011d431SEduardo Caldas |     |     `-SimpleDeclarator ListElement
34995c11c08dSEduardo Caldas |     |       `-'&'
35005c11c08dSEduardo Caldas |     `-')' CloseParen
35015c11c08dSEduardo Caldas `-';'
3502ed830952SEduardo Caldas )txt"}));
3503c8c92b54SEduardo Caldas }
3504c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,OverloadedOperatorFriendDeclaration)3505c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, OverloadedOperatorFriendDeclaration) {
3506c8c92b54SEduardo Caldas   if (!GetParam().isCXX()) {
3507c8c92b54SEduardo Caldas     return;
3508c8c92b54SEduardo Caldas   }
3509ed830952SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3510c8c92b54SEduardo Caldas       R"cpp(
3511c8c92b54SEduardo Caldas struct X {
3512ed830952SEduardo Caldas   [[friend X operator+(X, const X&);]]
3513c8c92b54SEduardo Caldas };
3514c8c92b54SEduardo Caldas )cpp",
3515ed830952SEduardo Caldas       {R"txt(
3516ed830952SEduardo Caldas UnknownDeclaration
3517c8c92b54SEduardo Caldas `-SimpleDeclaration
35185c11c08dSEduardo Caldas   |-'friend'
35195c11c08dSEduardo Caldas   |-'X'
35205011d431SEduardo Caldas   |-DeclaratorList Declarators
35215011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
35225c11c08dSEduardo Caldas   |   |-'operator'
35235c11c08dSEduardo Caldas   |   |-'+'
3524ed830952SEduardo Caldas   |   `-ParametersAndQualifiers
35255c11c08dSEduardo Caldas   |     |-'(' OpenParen
3526718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
3527718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
3528dc3d4743SEduardo Caldas   |     | | `-'X'
3529718e550cSEduardo Caldas   |     | |-',' ListDelimiter
3530718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
35315c11c08dSEduardo Caldas   |     |   |-'const'
35325c11c08dSEduardo Caldas   |     |   |-'X'
35335011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
35345011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
35355c11c08dSEduardo Caldas   |     |       `-'&'
35365c11c08dSEduardo Caldas   |     `-')' CloseParen
35375c11c08dSEduardo Caldas   `-';'
3538ed830952SEduardo Caldas )txt"}));
3539c8c92b54SEduardo Caldas }
3540c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ClassTemplateDeclaration)3541c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ClassTemplateDeclaration) {
3542c8c92b54SEduardo Caldas   if (!GetParam().isCXX()) {
3543c8c92b54SEduardo Caldas     return;
3544c8c92b54SEduardo Caldas   }
3545c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3546c8c92b54SEduardo Caldas       R"cpp(
3547c8c92b54SEduardo Caldas template<typename T>
3548c8c92b54SEduardo Caldas struct ST {};
3549c8c92b54SEduardo Caldas )cpp",
3550c8c92b54SEduardo Caldas       R"txt(
35515c11c08dSEduardo Caldas TranslationUnit Detached
3552718e550cSEduardo Caldas `-TemplateDeclaration Declaration
35535c11c08dSEduardo Caldas   |-'template' IntroducerKeyword
35545c11c08dSEduardo Caldas   |-'<'
3555c8c92b54SEduardo Caldas   |-UnknownDeclaration
35565c11c08dSEduardo Caldas   | |-'typename'
35575c11c08dSEduardo Caldas   | `-'T'
35585c11c08dSEduardo Caldas   |-'>'
3559c8c92b54SEduardo Caldas   `-SimpleDeclaration
35605c11c08dSEduardo Caldas     |-'struct'
35615c11c08dSEduardo Caldas     |-'ST'
35625c11c08dSEduardo Caldas     |-'{'
35635c11c08dSEduardo Caldas     |-'}'
35645c11c08dSEduardo Caldas     `-';'
3565c8c92b54SEduardo Caldas )txt"));
3566c8c92b54SEduardo Caldas }
3567c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,FunctionTemplateDeclaration)3568c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, FunctionTemplateDeclaration) {
3569c8c92b54SEduardo Caldas   if (!GetParam().isCXX()) {
3570c8c92b54SEduardo Caldas     return;
3571c8c92b54SEduardo Caldas   }
3572c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3573c8c92b54SEduardo Caldas       R"cpp(
3574c8c92b54SEduardo Caldas template<typename T>
3575c8c92b54SEduardo Caldas T f();
3576c8c92b54SEduardo Caldas )cpp",
3577c8c92b54SEduardo Caldas       R"txt(
35785c11c08dSEduardo Caldas TranslationUnit Detached
3579718e550cSEduardo Caldas `-TemplateDeclaration Declaration
35805c11c08dSEduardo Caldas   |-'template' IntroducerKeyword
35815c11c08dSEduardo Caldas   |-'<'
3582c8c92b54SEduardo Caldas   |-UnknownDeclaration
35835c11c08dSEduardo Caldas   | |-'typename'
35845c11c08dSEduardo Caldas   | `-'T'
35855c11c08dSEduardo Caldas   |-'>'
3586c8c92b54SEduardo Caldas   `-SimpleDeclaration
35875c11c08dSEduardo Caldas     |-'T'
35885011d431SEduardo Caldas     |-DeclaratorList Declarators
35895011d431SEduardo Caldas     | `-SimpleDeclarator ListElement
35905c11c08dSEduardo Caldas     |   |-'f'
3591c8c92b54SEduardo Caldas     |   `-ParametersAndQualifiers
35925c11c08dSEduardo Caldas     |     |-'(' OpenParen
35935c11c08dSEduardo Caldas     |     `-')' CloseParen
35945c11c08dSEduardo Caldas     `-';'
3595c8c92b54SEduardo Caldas )txt"));
3596c8c92b54SEduardo Caldas }
3597c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,VariableTemplateDeclaration)3598c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, VariableTemplateDeclaration) {
35993b75f65eSEduardo Caldas   if (!GetParam().isCXX14OrLater()) {
3600c8c92b54SEduardo Caldas     return;
3601c8c92b54SEduardo Caldas   }
3602c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3603c8c92b54SEduardo Caldas       R"cpp(
3604c8c92b54SEduardo Caldas template <class T> T var = 10;
3605c8c92b54SEduardo Caldas )cpp",
3606c8c92b54SEduardo Caldas       R"txt(
36075c11c08dSEduardo Caldas TranslationUnit Detached
3608718e550cSEduardo Caldas `-TemplateDeclaration Declaration
36095c11c08dSEduardo Caldas   |-'template' IntroducerKeyword
36105c11c08dSEduardo Caldas   |-'<'
3611d17437d2SEduardo Caldas   |-UnknownDeclaration
36125c11c08dSEduardo Caldas   | |-'class'
36135c11c08dSEduardo Caldas   | `-'T'
36145c11c08dSEduardo Caldas   |-'>'
3615d17437d2SEduardo Caldas   `-SimpleDeclaration
36165c11c08dSEduardo Caldas     |-'T'
36175011d431SEduardo Caldas     |-DeclaratorList Declarators
36185011d431SEduardo Caldas     | `-SimpleDeclarator ListElement
36195c11c08dSEduardo Caldas     |   |-'var'
36205c11c08dSEduardo Caldas     |   |-'='
3621c8c92b54SEduardo Caldas     |   `-IntegerLiteralExpression
36225c11c08dSEduardo Caldas     |     `-'10' LiteralToken
36235c11c08dSEduardo Caldas     `-';'
3624c8c92b54SEduardo Caldas )txt"));
3625c8c92b54SEduardo Caldas }
3626c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,StaticMemberFunctionTemplate)3627c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, StaticMemberFunctionTemplate) {
3628c8c92b54SEduardo Caldas   if (!GetParam().isCXX()) {
3629c8c92b54SEduardo Caldas     return;
3630c8c92b54SEduardo Caldas   }
3631ed830952SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3632c8c92b54SEduardo Caldas       R"cpp(
3633c8c92b54SEduardo Caldas struct S {
3634ed830952SEduardo Caldas   [[template<typename U>
3635ed830952SEduardo Caldas   static U f();]]
3636c8c92b54SEduardo Caldas };
3637c8c92b54SEduardo Caldas )cpp",
3638ed830952SEduardo Caldas       {R"txt(
3639718e550cSEduardo Caldas TemplateDeclaration Declaration
36405c11c08dSEduardo Caldas |-'template' IntroducerKeyword
36415c11c08dSEduardo Caldas |-'<'
3642ed830952SEduardo Caldas |-UnknownDeclaration
36435c11c08dSEduardo Caldas | |-'typename'
36445c11c08dSEduardo Caldas | `-'U'
36455c11c08dSEduardo Caldas |-'>'
3646c8c92b54SEduardo Caldas `-SimpleDeclaration
36475c11c08dSEduardo Caldas   |-'static'
36485c11c08dSEduardo Caldas   |-'U'
36495011d431SEduardo Caldas   |-DeclaratorList Declarators
36505011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
36515c11c08dSEduardo Caldas   |   |-'f'
3652ed830952SEduardo Caldas   |   `-ParametersAndQualifiers
36535c11c08dSEduardo Caldas   |     |-'(' OpenParen
36545c11c08dSEduardo Caldas   |     `-')' CloseParen
36555c11c08dSEduardo Caldas   `-';'
3656ed830952SEduardo Caldas )txt"}));
3657d17437d2SEduardo Caldas }
3658d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,NestedTemplates)3659c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, NestedTemplates) {
3660d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
3661d17437d2SEduardo Caldas     return;
3662d17437d2SEduardo Caldas   }
3663d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3664d17437d2SEduardo Caldas       R"cpp(
3665d17437d2SEduardo Caldas template <class T>
3666d17437d2SEduardo Caldas struct X {
3667d17437d2SEduardo Caldas   template <class U>
3668d17437d2SEduardo Caldas   U foo();
3669d17437d2SEduardo Caldas };
3670d17437d2SEduardo Caldas )cpp",
3671d17437d2SEduardo Caldas       R"txt(
36725c11c08dSEduardo Caldas TranslationUnit Detached
3673718e550cSEduardo Caldas `-TemplateDeclaration Declaration
36745c11c08dSEduardo Caldas   |-'template' IntroducerKeyword
36755c11c08dSEduardo Caldas   |-'<'
3676d17437d2SEduardo Caldas   |-UnknownDeclaration
36775c11c08dSEduardo Caldas   | |-'class'
36785c11c08dSEduardo Caldas   | `-'T'
36795c11c08dSEduardo Caldas   |-'>'
3680d17437d2SEduardo Caldas   `-SimpleDeclaration
36815c11c08dSEduardo Caldas     |-'struct'
36825c11c08dSEduardo Caldas     |-'X'
36835c11c08dSEduardo Caldas     |-'{'
3684718e550cSEduardo Caldas     |-TemplateDeclaration Declaration
36855c11c08dSEduardo Caldas     | |-'template' IntroducerKeyword
36865c11c08dSEduardo Caldas     | |-'<'
3687d17437d2SEduardo Caldas     | |-UnknownDeclaration
36885c11c08dSEduardo Caldas     | | |-'class'
36895c11c08dSEduardo Caldas     | | `-'U'
36905c11c08dSEduardo Caldas     | |-'>'
3691d17437d2SEduardo Caldas     | `-SimpleDeclaration
36925c11c08dSEduardo Caldas     |   |-'U'
36935011d431SEduardo Caldas     |   |-DeclaratorList Declarators
36945011d431SEduardo Caldas     |   | `-SimpleDeclarator ListElement
36955c11c08dSEduardo Caldas     |   |   |-'foo'
3696d17437d2SEduardo Caldas     |   |   `-ParametersAndQualifiers
36975c11c08dSEduardo Caldas     |   |     |-'(' OpenParen
36985c11c08dSEduardo Caldas     |   |     `-')' CloseParen
36995c11c08dSEduardo Caldas     |   `-';'
37005c11c08dSEduardo Caldas     |-'}'
37015c11c08dSEduardo Caldas     `-';'
3702d17437d2SEduardo Caldas )txt"));
3703d17437d2SEduardo Caldas }
3704d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,NestedTemplatesInNamespace)3705c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, NestedTemplatesInNamespace) {
3706c8c92b54SEduardo Caldas   if (!GetParam().isCXX()) {
3707c8c92b54SEduardo Caldas     return;
3708c8c92b54SEduardo Caldas   }
3709c8c92b54SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3710c8c92b54SEduardo Caldas       R"cpp(
3711c8c92b54SEduardo Caldas namespace n {
3712c8c92b54SEduardo Caldas   template<typename T>
3713c8c92b54SEduardo Caldas   struct ST {
3714c8c92b54SEduardo Caldas     template<typename U>
3715c8c92b54SEduardo Caldas     static U f();
3716c8c92b54SEduardo Caldas   };
3717c8c92b54SEduardo Caldas }
3718c8c92b54SEduardo Caldas )cpp",
3719c8c92b54SEduardo Caldas       R"txt(
37205c11c08dSEduardo Caldas TranslationUnit Detached
3721c8c92b54SEduardo Caldas `-NamespaceDefinition
37225c11c08dSEduardo Caldas   |-'namespace'
37235c11c08dSEduardo Caldas   |-'n'
37245c11c08dSEduardo Caldas   |-'{'
3725718e550cSEduardo Caldas   |-TemplateDeclaration Declaration
37265c11c08dSEduardo Caldas   | |-'template' IntroducerKeyword
37275c11c08dSEduardo Caldas   | |-'<'
3728c8c92b54SEduardo Caldas   | |-UnknownDeclaration
37295c11c08dSEduardo Caldas   | | |-'typename'
37305c11c08dSEduardo Caldas   | | `-'T'
37315c11c08dSEduardo Caldas   | |-'>'
3732c8c92b54SEduardo Caldas   | `-SimpleDeclaration
37335c11c08dSEduardo Caldas   |   |-'struct'
37345c11c08dSEduardo Caldas   |   |-'ST'
37355c11c08dSEduardo Caldas   |   |-'{'
3736718e550cSEduardo Caldas   |   |-TemplateDeclaration Declaration
37375c11c08dSEduardo Caldas   |   | |-'template' IntroducerKeyword
37385c11c08dSEduardo Caldas   |   | |-'<'
3739c8c92b54SEduardo Caldas   |   | |-UnknownDeclaration
37405c11c08dSEduardo Caldas   |   | | |-'typename'
37415c11c08dSEduardo Caldas   |   | | `-'U'
37425c11c08dSEduardo Caldas   |   | |-'>'
3743c8c92b54SEduardo Caldas   |   | `-SimpleDeclaration
37445c11c08dSEduardo Caldas   |   |   |-'static'
37455c11c08dSEduardo Caldas   |   |   |-'U'
37465011d431SEduardo Caldas   |   |   |-DeclaratorList Declarators
37475011d431SEduardo Caldas   |   |   | `-SimpleDeclarator ListElement
37485c11c08dSEduardo Caldas   |   |   |   |-'f'
3749c8c92b54SEduardo Caldas   |   |   |   `-ParametersAndQualifiers
37505c11c08dSEduardo Caldas   |   |   |     |-'(' OpenParen
37515c11c08dSEduardo Caldas   |   |   |     `-')' CloseParen
37525c11c08dSEduardo Caldas   |   |   `-';'
37535c11c08dSEduardo Caldas   |   |-'}'
37545c11c08dSEduardo Caldas   |   `-';'
37555c11c08dSEduardo Caldas   `-'}'
3756c8c92b54SEduardo Caldas )txt"));
3757c8c92b54SEduardo Caldas }
3758c8c92b54SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ClassTemplate_MemberClassDefinition)3759c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ClassTemplate_MemberClassDefinition) {
3760d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
3761d17437d2SEduardo Caldas     return;
3762d17437d2SEduardo Caldas   }
37637f426c65SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3764d17437d2SEduardo Caldas       R"cpp(
3765d17437d2SEduardo Caldas template <class T> struct X { struct Y; };
37667f426c65SEduardo Caldas [[template <class T> struct X<T>::Y {};]]
3767d17437d2SEduardo Caldas )cpp",
37687f426c65SEduardo Caldas       {R"txt(
3769718e550cSEduardo Caldas TemplateDeclaration Declaration
37705c11c08dSEduardo Caldas |-'template' IntroducerKeyword
37715c11c08dSEduardo Caldas |-'<'
3772d17437d2SEduardo Caldas |-UnknownDeclaration
37735c11c08dSEduardo Caldas | |-'class'
37745c11c08dSEduardo Caldas | `-'T'
37755c11c08dSEduardo Caldas |-'>'
3776d17437d2SEduardo Caldas `-SimpleDeclaration
37775c11c08dSEduardo Caldas   |-'struct'
3778d17437d2SEduardo Caldas   |-NestedNameSpecifier
3779718e550cSEduardo Caldas   | |-SimpleTemplateNameSpecifier ListElement
37805c11c08dSEduardo Caldas   | | |-'X'
37815c11c08dSEduardo Caldas   | | |-'<'
37825c11c08dSEduardo Caldas   | | |-'T'
37835c11c08dSEduardo Caldas   | | `-'>'
3784718e550cSEduardo Caldas   | `-'::' ListDelimiter
37855c11c08dSEduardo Caldas   |-'Y'
37865c11c08dSEduardo Caldas   |-'{'
37875c11c08dSEduardo Caldas   |-'}'
37885c11c08dSEduardo Caldas   `-';'
37897f426c65SEduardo Caldas )txt"}));
3790d17437d2SEduardo Caldas }
3791d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ExplicitClassTemplateInstantiation_Definition)3792e181a6aeSArthur O'Dwyer TEST_P(BuildSyntaxTreeTest, ExplicitClassTemplateInstantiation_Definition) {
3793d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
3794d17437d2SEduardo Caldas     return;
3795d17437d2SEduardo Caldas   }
3796a722d6a1SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3797d17437d2SEduardo Caldas       R"cpp(
3798d17437d2SEduardo Caldas template <class T> struct X {};
3799a722d6a1SEduardo Caldas [[template struct X<double>;]]
3800d17437d2SEduardo Caldas )cpp",
3801a722d6a1SEduardo Caldas       {R"txt(
3802a722d6a1SEduardo Caldas ExplicitTemplateInstantiation
38035c11c08dSEduardo Caldas |-'template' IntroducerKeyword
3804718e550cSEduardo Caldas `-SimpleDeclaration Declaration
38055c11c08dSEduardo Caldas   |-'struct'
38065c11c08dSEduardo Caldas   |-'X'
38075c11c08dSEduardo Caldas   |-'<'
38085c11c08dSEduardo Caldas   |-'double'
38095c11c08dSEduardo Caldas   |-'>'
38105c11c08dSEduardo Caldas   `-';'
3811a722d6a1SEduardo Caldas )txt"}));
3812a722d6a1SEduardo Caldas }
3813a722d6a1SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ExplicitClassTemplateInstantiation_Declaration)3814e181a6aeSArthur O'Dwyer TEST_P(BuildSyntaxTreeTest, ExplicitClassTemplateInstantiation_Declaration) {
3815a722d6a1SEduardo Caldas   if (!GetParam().isCXX()) {
3816a722d6a1SEduardo Caldas     return;
3817a722d6a1SEduardo Caldas   }
3818a722d6a1SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3819a722d6a1SEduardo Caldas       R"cpp(
3820a722d6a1SEduardo Caldas template <class T> struct X {};
3821a722d6a1SEduardo Caldas [[extern template struct X<float>;]]
3822a722d6a1SEduardo Caldas )cpp",
3823a722d6a1SEduardo Caldas       {R"txt(
3824a722d6a1SEduardo Caldas ExplicitTemplateInstantiation
38255c11c08dSEduardo Caldas |-'extern' ExternKeyword
38265c11c08dSEduardo Caldas |-'template' IntroducerKeyword
3827718e550cSEduardo Caldas `-SimpleDeclaration Declaration
38285c11c08dSEduardo Caldas   |-'struct'
38295c11c08dSEduardo Caldas   |-'X'
38305c11c08dSEduardo Caldas   |-'<'
38315c11c08dSEduardo Caldas   |-'float'
38325c11c08dSEduardo Caldas   |-'>'
38335c11c08dSEduardo Caldas   `-';'
3834a722d6a1SEduardo Caldas )txt"}));
3835a722d6a1SEduardo Caldas }
3836a722d6a1SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ClassTemplateSpecialization_Partial)3837c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ClassTemplateSpecialization_Partial) {
3838a722d6a1SEduardo Caldas   if (!GetParam().isCXX()) {
3839a722d6a1SEduardo Caldas     return;
3840a722d6a1SEduardo Caldas   }
3841a722d6a1SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3842a722d6a1SEduardo Caldas       R"cpp(
3843a722d6a1SEduardo Caldas template <class T> struct X {};
3844a722d6a1SEduardo Caldas [[template <class T> struct X<T*> {};]]
3845a722d6a1SEduardo Caldas )cpp",
3846a722d6a1SEduardo Caldas       {R"txt(
3847718e550cSEduardo Caldas TemplateDeclaration Declaration
38485c11c08dSEduardo Caldas |-'template' IntroducerKeyword
38495c11c08dSEduardo Caldas |-'<'
3850a722d6a1SEduardo Caldas |-UnknownDeclaration
38515c11c08dSEduardo Caldas | |-'class'
38525c11c08dSEduardo Caldas | `-'T'
38535c11c08dSEduardo Caldas |-'>'
3854a722d6a1SEduardo Caldas `-SimpleDeclaration
38555c11c08dSEduardo Caldas   |-'struct'
38565c11c08dSEduardo Caldas   |-'X'
38575c11c08dSEduardo Caldas   |-'<'
38585c11c08dSEduardo Caldas   |-'T'
38595c11c08dSEduardo Caldas   |-'*'
38605c11c08dSEduardo Caldas   |-'>'
38615c11c08dSEduardo Caldas   |-'{'
38625c11c08dSEduardo Caldas   |-'}'
38635c11c08dSEduardo Caldas   `-';'
3864a722d6a1SEduardo Caldas )txt"}));
3865a722d6a1SEduardo Caldas }
3866a722d6a1SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ClassTemplateSpecialization_Full)3867c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ClassTemplateSpecialization_Full) {
3868a722d6a1SEduardo Caldas   if (!GetParam().isCXX()) {
3869a722d6a1SEduardo Caldas     return;
3870a722d6a1SEduardo Caldas   }
3871a722d6a1SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
3872a722d6a1SEduardo Caldas       R"cpp(
3873a722d6a1SEduardo Caldas template <class T> struct X {};
3874a722d6a1SEduardo Caldas [[template <> struct X<int> {};]]
3875a722d6a1SEduardo Caldas )cpp",
3876a722d6a1SEduardo Caldas       {R"txt(
3877718e550cSEduardo Caldas TemplateDeclaration Declaration
38785c11c08dSEduardo Caldas |-'template' IntroducerKeyword
38795c11c08dSEduardo Caldas |-'<'
38805c11c08dSEduardo Caldas |-'>'
3881a722d6a1SEduardo Caldas `-SimpleDeclaration
38825c11c08dSEduardo Caldas   |-'struct'
38835c11c08dSEduardo Caldas   |-'X'
38845c11c08dSEduardo Caldas   |-'<'
38855c11c08dSEduardo Caldas   |-'int'
38865c11c08dSEduardo Caldas   |-'>'
38875c11c08dSEduardo Caldas   |-'{'
38885c11c08dSEduardo Caldas   |-'}'
38895c11c08dSEduardo Caldas   `-';'
3890a722d6a1SEduardo Caldas )txt"}));
3891d17437d2SEduardo Caldas }
3892d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,EmptyDeclaration)3893c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, EmptyDeclaration) {
3894d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3895d17437d2SEduardo Caldas       R"cpp(
3896d17437d2SEduardo Caldas ;
3897d17437d2SEduardo Caldas )cpp",
3898d17437d2SEduardo Caldas       R"txt(
38995c11c08dSEduardo Caldas TranslationUnit Detached
3900d17437d2SEduardo Caldas `-EmptyDeclaration
39015c11c08dSEduardo Caldas   `-';'
3902d17437d2SEduardo Caldas )txt"));
3903d17437d2SEduardo Caldas }
3904d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,StaticAssert)3905c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, StaticAssert) {
3906d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
3907d17437d2SEduardo Caldas     return;
3908d17437d2SEduardo Caldas   }
3909d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3910d17437d2SEduardo Caldas       R"cpp(
3911d17437d2SEduardo Caldas static_assert(true, "message");
39123b75f65eSEduardo Caldas )cpp",
39133b75f65eSEduardo Caldas       R"txt(
39143b75f65eSEduardo Caldas TranslationUnit Detached
39153b75f65eSEduardo Caldas `-StaticAssertDeclaration
39163b75f65eSEduardo Caldas   |-'static_assert'
39173b75f65eSEduardo Caldas   |-'('
3918718e550cSEduardo Caldas   |-BoolLiteralExpression Condition
39193b75f65eSEduardo Caldas   | `-'true' LiteralToken
39203b75f65eSEduardo Caldas   |-','
3921718e550cSEduardo Caldas   |-StringLiteralExpression Message
39223b75f65eSEduardo Caldas   | `-'"message"' LiteralToken
39233b75f65eSEduardo Caldas   |-')'
39243b75f65eSEduardo Caldas   `-';'
39253b75f65eSEduardo Caldas )txt"));
39263b75f65eSEduardo Caldas }
39273b75f65eSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,StaticAssert_WithoutMessage)3928c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, StaticAssert_WithoutMessage) {
39293b75f65eSEduardo Caldas   if (!GetParam().isCXX17OrLater()) {
39303b75f65eSEduardo Caldas     return;
39313b75f65eSEduardo Caldas   }
39323b75f65eSEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
39333b75f65eSEduardo Caldas       R"cpp(
3934d17437d2SEduardo Caldas static_assert(true);
3935d17437d2SEduardo Caldas )cpp",
3936d17437d2SEduardo Caldas       R"txt(
39375c11c08dSEduardo Caldas TranslationUnit Detached
3938d17437d2SEduardo Caldas `-StaticAssertDeclaration
39395c11c08dSEduardo Caldas   |-'static_assert'
39405c11c08dSEduardo Caldas   |-'('
3941718e550cSEduardo Caldas   |-BoolLiteralExpression Condition
39425c11c08dSEduardo Caldas   | `-'true' LiteralToken
39435c11c08dSEduardo Caldas   |-')'
39445c11c08dSEduardo Caldas   `-';'
3945d17437d2SEduardo Caldas )txt"));
3946d17437d2SEduardo Caldas }
3947d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ExternC)3948c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ExternC) {
3949d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
3950d17437d2SEduardo Caldas     return;
3951d17437d2SEduardo Caldas   }
3952d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3953d17437d2SEduardo Caldas       R"cpp(
3954d17437d2SEduardo Caldas extern "C" int a;
3955d17437d2SEduardo Caldas extern "C" { int b; int c; }
3956d17437d2SEduardo Caldas )cpp",
3957d17437d2SEduardo Caldas       R"txt(
39585c11c08dSEduardo Caldas TranslationUnit Detached
3959d17437d2SEduardo Caldas |-LinkageSpecificationDeclaration
39605c11c08dSEduardo Caldas | |-'extern'
39615c11c08dSEduardo Caldas | |-'"C"'
3962d17437d2SEduardo Caldas | `-SimpleDeclaration
39635c11c08dSEduardo Caldas |   |-'int'
39645011d431SEduardo Caldas |   |-DeclaratorList Declarators
39655011d431SEduardo Caldas |   | `-SimpleDeclarator ListElement
39665c11c08dSEduardo Caldas |   |   `-'a'
39675c11c08dSEduardo Caldas |   `-';'
3968d17437d2SEduardo Caldas `-LinkageSpecificationDeclaration
39695c11c08dSEduardo Caldas   |-'extern'
39705c11c08dSEduardo Caldas   |-'"C"'
39715c11c08dSEduardo Caldas   |-'{'
3972d17437d2SEduardo Caldas   |-SimpleDeclaration
39735c11c08dSEduardo Caldas   | |-'int'
39745011d431SEduardo Caldas   | |-DeclaratorList Declarators
39755011d431SEduardo Caldas   | | `-SimpleDeclarator ListElement
39765c11c08dSEduardo Caldas   | |   `-'b'
39775c11c08dSEduardo Caldas   | `-';'
3978d17437d2SEduardo Caldas   |-SimpleDeclaration
39795c11c08dSEduardo Caldas   | |-'int'
39805011d431SEduardo Caldas   | |-DeclaratorList Declarators
39815011d431SEduardo Caldas   | | `-SimpleDeclarator ListElement
39825c11c08dSEduardo Caldas   | |   `-'c'
39835c11c08dSEduardo Caldas   | `-';'
39845c11c08dSEduardo Caldas   `-'}'
3985d17437d2SEduardo Caldas )txt"));
3986d17437d2SEduardo Caldas }
3987d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Macro_ObjectLike_Leaf)39886dc06fa0SEduardo Caldas TEST_P(BuildSyntaxTreeTest, Macro_ObjectLike_Leaf) {
3989d17437d2SEduardo Caldas   // All nodes can be mutated.
3990d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
3991d17437d2SEduardo Caldas       R"cpp(
3992d17437d2SEduardo Caldas #define OPEN {
3993d17437d2SEduardo Caldas #define CLOSE }
3994d17437d2SEduardo Caldas 
3995d17437d2SEduardo Caldas void test() {
3996d17437d2SEduardo Caldas   OPEN
3997d17437d2SEduardo Caldas     1;
3998d17437d2SEduardo Caldas   CLOSE
3999d17437d2SEduardo Caldas 
4000d17437d2SEduardo Caldas   OPEN
4001d17437d2SEduardo Caldas     2;
4002d17437d2SEduardo Caldas   }
4003d17437d2SEduardo Caldas }
4004d17437d2SEduardo Caldas )cpp",
4005d17437d2SEduardo Caldas       R"txt(
4006be2bc7d4SEduardo Caldas TranslationUnit Detached
4007d17437d2SEduardo Caldas `-SimpleDeclaration
4008be2bc7d4SEduardo Caldas   |-'void'
40095011d431SEduardo Caldas   |-DeclaratorList Declarators
40105011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
4011be2bc7d4SEduardo Caldas   |   |-'test'
4012d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
4013be2bc7d4SEduardo Caldas   |     |-'(' OpenParen
4014be2bc7d4SEduardo Caldas   |     `-')' CloseParen
4015d17437d2SEduardo Caldas   `-CompoundStatement
4016be2bc7d4SEduardo Caldas     |-'{' OpenParen
4017718e550cSEduardo Caldas     |-CompoundStatement Statement
4018be2bc7d4SEduardo Caldas     | |-'{' OpenParen
4019718e550cSEduardo Caldas     | |-ExpressionStatement Statement
4020718e550cSEduardo Caldas     | | |-IntegerLiteralExpression Expression
4021be2bc7d4SEduardo Caldas     | | | `-'1' LiteralToken
4022be2bc7d4SEduardo Caldas     | | `-';'
4023be2bc7d4SEduardo Caldas     | `-'}' CloseParen
4024718e550cSEduardo Caldas     |-CompoundStatement Statement
4025be2bc7d4SEduardo Caldas     | |-'{' OpenParen
4026718e550cSEduardo Caldas     | |-ExpressionStatement Statement
4027718e550cSEduardo Caldas     | | |-IntegerLiteralExpression Expression
4028be2bc7d4SEduardo Caldas     | | | `-'2' LiteralToken
4029be2bc7d4SEduardo Caldas     | | `-';'
4030be2bc7d4SEduardo Caldas     | `-'}' CloseParen
4031be2bc7d4SEduardo Caldas     `-'}' CloseParen
4032d17437d2SEduardo Caldas )txt"));
4033d17437d2SEduardo Caldas }
4034d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Macro_ObjectLike_MatchTree)40356dc06fa0SEduardo Caldas TEST_P(BuildSyntaxTreeTest, Macro_ObjectLike_MatchTree) {
40366dc06fa0SEduardo Caldas   // Some nodes are unmodifiable, they are marked with 'unmodifiable'.
40376dc06fa0SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
40386dc06fa0SEduardo Caldas       R"cpp(
40396dc06fa0SEduardo Caldas #define BRACES {}
40406dc06fa0SEduardo Caldas 
40416dc06fa0SEduardo Caldas void test() BRACES
40426dc06fa0SEduardo Caldas )cpp",
40436dc06fa0SEduardo Caldas       R"txt(
40446dc06fa0SEduardo Caldas TranslationUnit Detached
40456dc06fa0SEduardo Caldas `-SimpleDeclaration
40466dc06fa0SEduardo Caldas   |-'void'
40475011d431SEduardo Caldas   |-DeclaratorList Declarators
40485011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
40496dc06fa0SEduardo Caldas   |   |-'test'
40506dc06fa0SEduardo Caldas   |   `-ParametersAndQualifiers
40516dc06fa0SEduardo Caldas   |     |-'(' OpenParen
40526dc06fa0SEduardo Caldas   |     `-')' CloseParen
40536dc06fa0SEduardo Caldas   `-CompoundStatement
40546dc06fa0SEduardo Caldas     |-'{' OpenParen unmodifiable
40556dc06fa0SEduardo Caldas     `-'}' CloseParen unmodifiable
40566dc06fa0SEduardo Caldas )txt"));
40576dc06fa0SEduardo Caldas }
40586dc06fa0SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Macro_ObjectLike_MismatchTree)40596dc06fa0SEduardo Caldas TEST_P(BuildSyntaxTreeTest, Macro_ObjectLike_MismatchTree) {
40606dc06fa0SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
40616dc06fa0SEduardo Caldas       R"cpp(
40626dc06fa0SEduardo Caldas #define HALF_IF if (1+
40636dc06fa0SEduardo Caldas #define HALF_IF_2 1) {}
40646dc06fa0SEduardo Caldas void test() {
40656dc06fa0SEduardo Caldas   HALF_IF HALF_IF_2 else {}
40666dc06fa0SEduardo Caldas })cpp",
40676dc06fa0SEduardo Caldas       R"txt(
40686dc06fa0SEduardo Caldas TranslationUnit Detached
40696dc06fa0SEduardo Caldas `-SimpleDeclaration
40706dc06fa0SEduardo Caldas   |-'void'
40715011d431SEduardo Caldas   |-DeclaratorList Declarators
40725011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
40736dc06fa0SEduardo Caldas   |   |-'test'
40746dc06fa0SEduardo Caldas   |   `-ParametersAndQualifiers
40756dc06fa0SEduardo Caldas   |     |-'(' OpenParen
40766dc06fa0SEduardo Caldas   |     `-')' CloseParen
40776dc06fa0SEduardo Caldas   `-CompoundStatement
40786dc06fa0SEduardo Caldas     |-'{' OpenParen
40796dc06fa0SEduardo Caldas     |-IfStatement Statement
40806dc06fa0SEduardo Caldas     | |-'if' IntroducerKeyword unmodifiable
40816dc06fa0SEduardo Caldas     | |-'(' unmodifiable
40826c1a2330SHaojian Wu     | |-ExpressionStatement Condition unmodifiable
40836c1a2330SHaojian Wu     | | `-BinaryOperatorExpression Expression unmodifiable
40846dc06fa0SEduardo Caldas     | |   |-IntegerLiteralExpression LeftHandSide unmodifiable
40856dc06fa0SEduardo Caldas     | |   | `-'1' LiteralToken unmodifiable
40866dc06fa0SEduardo Caldas     | |   |-'+' OperatorToken unmodifiable
40876dc06fa0SEduardo Caldas     | |   `-IntegerLiteralExpression RightHandSide unmodifiable
40886dc06fa0SEduardo Caldas     | |     `-'1' LiteralToken unmodifiable
40896dc06fa0SEduardo Caldas     | |-')' unmodifiable
40906dc06fa0SEduardo Caldas     | |-CompoundStatement ThenStatement unmodifiable
40916dc06fa0SEduardo Caldas     | | |-'{' OpenParen unmodifiable
40926dc06fa0SEduardo Caldas     | | `-'}' CloseParen unmodifiable
40936dc06fa0SEduardo Caldas     | |-'else' ElseKeyword
40946dc06fa0SEduardo Caldas     | `-CompoundStatement ElseStatement
40956dc06fa0SEduardo Caldas     |   |-'{' OpenParen
40966dc06fa0SEduardo Caldas     |   `-'}' CloseParen
40976dc06fa0SEduardo Caldas     `-'}' CloseParen
40986dc06fa0SEduardo Caldas )txt"));
40996dc06fa0SEduardo Caldas }
41006dc06fa0SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Macro_FunctionLike_ModifiableArguments)41016dc06fa0SEduardo Caldas TEST_P(BuildSyntaxTreeTest, Macro_FunctionLike_ModifiableArguments) {
41026dc06fa0SEduardo Caldas   // FIXME: Note that the substitutions for `X` and `Y` are marked modifiable.
41036dc06fa0SEduardo Caldas   // However we cannot change `X` freely. Indeed if we change its substitution
41046dc06fa0SEduardo Caldas   // in the condition we should also change it the then-branch.
41056dc06fa0SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
41066dc06fa0SEduardo Caldas       R"cpp(
41076dc06fa0SEduardo Caldas #define MIN(X,Y) X < Y ? X : Y
41086dc06fa0SEduardo Caldas 
41096dc06fa0SEduardo Caldas void test() {
41106dc06fa0SEduardo Caldas   MIN(1,2);
41116dc06fa0SEduardo Caldas }
41126dc06fa0SEduardo Caldas )cpp",
41136dc06fa0SEduardo Caldas       R"txt(
41146dc06fa0SEduardo Caldas TranslationUnit Detached
41156dc06fa0SEduardo Caldas `-SimpleDeclaration
41166dc06fa0SEduardo Caldas   |-'void'
41175011d431SEduardo Caldas   |-DeclaratorList Declarators
41185011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
41196dc06fa0SEduardo Caldas   |   |-'test'
41206dc06fa0SEduardo Caldas   |   `-ParametersAndQualifiers
41216dc06fa0SEduardo Caldas   |     |-'(' OpenParen
41226dc06fa0SEduardo Caldas   |     `-')' CloseParen
41236dc06fa0SEduardo Caldas   `-CompoundStatement
41246dc06fa0SEduardo Caldas     |-'{' OpenParen
41256dc06fa0SEduardo Caldas     |-ExpressionStatement Statement
41266dc06fa0SEduardo Caldas     | |-UnknownExpression Expression
41276dc06fa0SEduardo Caldas     | | |-BinaryOperatorExpression unmodifiable
41286dc06fa0SEduardo Caldas     | | | |-IntegerLiteralExpression LeftHandSide
41296dc06fa0SEduardo Caldas     | | | | `-'1' LiteralToken
41306dc06fa0SEduardo Caldas     | | | |-'<' OperatorToken unmodifiable
41316dc06fa0SEduardo Caldas     | | | `-IntegerLiteralExpression RightHandSide
41326dc06fa0SEduardo Caldas     | | |   `-'2' LiteralToken
41336dc06fa0SEduardo Caldas     | | |-'?' unmodifiable
41346dc06fa0SEduardo Caldas     | | |-IntegerLiteralExpression
41356dc06fa0SEduardo Caldas     | | | `-'1' LiteralToken
41366dc06fa0SEduardo Caldas     | | |-':' unmodifiable
41376dc06fa0SEduardo Caldas     | | `-IntegerLiteralExpression
41386dc06fa0SEduardo Caldas     | |   `-'2' LiteralToken
41396dc06fa0SEduardo Caldas     | `-';'
41406dc06fa0SEduardo Caldas     `-'}' CloseParen
41416dc06fa0SEduardo Caldas )txt"));
41426dc06fa0SEduardo Caldas }
41436dc06fa0SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Macro_FunctionLike_MismatchTree)41446dc06fa0SEduardo Caldas TEST_P(BuildSyntaxTreeTest, Macro_FunctionLike_MismatchTree) {
41456dc06fa0SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
41466dc06fa0SEduardo Caldas       R"cpp(
41476dc06fa0SEduardo Caldas #define HALF_IF(X) if (X &&
41486dc06fa0SEduardo Caldas #define HALF_IF_2(Y) Y) {}
41496dc06fa0SEduardo Caldas void test() {
41506dc06fa0SEduardo Caldas   HALF_IF(1) HALF_IF_2(0) else {}
41516dc06fa0SEduardo Caldas })cpp",
41526dc06fa0SEduardo Caldas       R"txt(
41536dc06fa0SEduardo Caldas TranslationUnit Detached
41546dc06fa0SEduardo Caldas `-SimpleDeclaration
41556dc06fa0SEduardo Caldas   |-'void'
41565011d431SEduardo Caldas   |-DeclaratorList Declarators
41575011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
41586dc06fa0SEduardo Caldas   |   |-'test'
41596dc06fa0SEduardo Caldas   |   `-ParametersAndQualifiers
41606dc06fa0SEduardo Caldas   |     |-'(' OpenParen
41616dc06fa0SEduardo Caldas   |     `-')' CloseParen
41626dc06fa0SEduardo Caldas   `-CompoundStatement
41636dc06fa0SEduardo Caldas     |-'{' OpenParen
41646dc06fa0SEduardo Caldas     |-IfStatement Statement
41656dc06fa0SEduardo Caldas     | |-'if' IntroducerKeyword unmodifiable
41666dc06fa0SEduardo Caldas     | |-'(' unmodifiable
41676c1a2330SHaojian Wu     | |-ExpressionStatement Condition unmodifiable
41686c1a2330SHaojian Wu     | | `-BinaryOperatorExpression Expression unmodifiable
41696dc06fa0SEduardo Caldas     | |   |-IntegerLiteralExpression LeftHandSide
41706dc06fa0SEduardo Caldas     | |   | `-'1' LiteralToken
41716dc06fa0SEduardo Caldas     | |   |-'&&' OperatorToken unmodifiable
41726dc06fa0SEduardo Caldas     | |   `-IntegerLiteralExpression RightHandSide
41736dc06fa0SEduardo Caldas     | |     `-'0' LiteralToken
41746dc06fa0SEduardo Caldas     | |-')' unmodifiable
41756dc06fa0SEduardo Caldas     | |-CompoundStatement ThenStatement unmodifiable
41766dc06fa0SEduardo Caldas     | | |-'{' OpenParen unmodifiable
41776dc06fa0SEduardo Caldas     | | `-'}' CloseParen unmodifiable
41786dc06fa0SEduardo Caldas     | |-'else' ElseKeyword
41796dc06fa0SEduardo Caldas     | `-CompoundStatement ElseStatement
41806dc06fa0SEduardo Caldas     |   |-'{' OpenParen
41816dc06fa0SEduardo Caldas     |   `-'}' CloseParen
41826dc06fa0SEduardo Caldas     `-'}' CloseParen
41836dc06fa0SEduardo Caldas )txt"));
41846dc06fa0SEduardo Caldas }
41856dc06fa0SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Macro_FunctionLike_Variadic)41866dc06fa0SEduardo Caldas TEST_P(BuildSyntaxTreeTest, Macro_FunctionLike_Variadic) {
41876dc06fa0SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
41886dc06fa0SEduardo Caldas       R"cpp(
41896dc06fa0SEduardo Caldas #define CALL(F_NAME, ...) F_NAME(__VA_ARGS__)
41906dc06fa0SEduardo Caldas 
41916dc06fa0SEduardo Caldas void f(int);
41926dc06fa0SEduardo Caldas void g(int, int);
41936dc06fa0SEduardo Caldas void test() [[{
41946dc06fa0SEduardo Caldas   CALL(f, 0);
41956dc06fa0SEduardo Caldas   CALL(g, 0, 1);
41966dc06fa0SEduardo Caldas }]]
41976dc06fa0SEduardo Caldas )cpp",
41986dc06fa0SEduardo Caldas       {R"txt(
41996dc06fa0SEduardo Caldas CompoundStatement
42006dc06fa0SEduardo Caldas |-'{' OpenParen
42016dc06fa0SEduardo Caldas |-ExpressionStatement Statement
42026dc06fa0SEduardo Caldas | |-CallExpression Expression
42036dc06fa0SEduardo Caldas | | |-IdExpression Callee
42046dc06fa0SEduardo Caldas | | | `-UnqualifiedId UnqualifiedId
42056dc06fa0SEduardo Caldas | | |   `-'f'
42066dc06fa0SEduardo Caldas | | |-'(' OpenParen unmodifiable
42076dc06fa0SEduardo Caldas | | |-CallArguments Arguments
42086dc06fa0SEduardo Caldas | | | `-IntegerLiteralExpression ListElement
42096dc06fa0SEduardo Caldas | | |   `-'0' LiteralToken
42106dc06fa0SEduardo Caldas | | `-')' CloseParen unmodifiable
42116dc06fa0SEduardo Caldas | `-';'
42126dc06fa0SEduardo Caldas |-ExpressionStatement Statement
42136dc06fa0SEduardo Caldas | |-CallExpression Expression
42146dc06fa0SEduardo Caldas | | |-IdExpression Callee
42156dc06fa0SEduardo Caldas | | | `-UnqualifiedId UnqualifiedId
42166dc06fa0SEduardo Caldas | | |   `-'g'
42176dc06fa0SEduardo Caldas | | |-'(' OpenParen unmodifiable
42186dc06fa0SEduardo Caldas | | |-CallArguments Arguments
42196dc06fa0SEduardo Caldas | | | |-IntegerLiteralExpression ListElement
42206dc06fa0SEduardo Caldas | | | | `-'0' LiteralToken
42216dc06fa0SEduardo Caldas | | | |-',' ListDelimiter
42226dc06fa0SEduardo Caldas | | | `-IntegerLiteralExpression ListElement
42236dc06fa0SEduardo Caldas | | |   `-'1' LiteralToken
42246dc06fa0SEduardo Caldas | | `-')' CloseParen unmodifiable
42256dc06fa0SEduardo Caldas | `-';'
42266dc06fa0SEduardo Caldas `-'}' CloseParen
42276dc06fa0SEduardo Caldas )txt"}));
42286dc06fa0SEduardo Caldas }
42296dc06fa0SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,InitDeclarator_Equal)4230c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, InitDeclarator_Equal) {
42312325d6b4SEduardo Caldas   if (!GetParam().isCXX()) {
42322325d6b4SEduardo Caldas     return;
42332325d6b4SEduardo Caldas   }
42342325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
42352325d6b4SEduardo Caldas       R"cpp(
42362325d6b4SEduardo Caldas struct S { S(int);};
42372325d6b4SEduardo Caldas void test() {
42382325d6b4SEduardo Caldas   [[S s = 1]];
42392325d6b4SEduardo Caldas }
42402325d6b4SEduardo Caldas )cpp",
42412325d6b4SEduardo Caldas       {R"txt(
42422325d6b4SEduardo Caldas SimpleDeclaration
42432325d6b4SEduardo Caldas |-'S'
42445011d431SEduardo Caldas `-DeclaratorList Declarators
42455011d431SEduardo Caldas   `-SimpleDeclarator ListElement
42462325d6b4SEduardo Caldas     |-'s'
42472325d6b4SEduardo Caldas     |-'='
42482325d6b4SEduardo Caldas     `-IntegerLiteralExpression
42492325d6b4SEduardo Caldas       `-'1' LiteralToken
42502325d6b4SEduardo Caldas )txt"}));
42512325d6b4SEduardo Caldas }
42522325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,InitDeclarator_Brace)4253c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, InitDeclarator_Brace) {
4254a1461953SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
4255a1461953SEduardo Caldas     return;
4256a1461953SEduardo Caldas   }
42572325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4258a1461953SEduardo Caldas       R"cpp(
42592325d6b4SEduardo Caldas struct S {
42602325d6b4SEduardo Caldas   S();
42612325d6b4SEduardo Caldas   S(int);
42622325d6b4SEduardo Caldas   S(int, float);
42632325d6b4SEduardo Caldas };
42642325d6b4SEduardo Caldas void test(){
42652325d6b4SEduardo Caldas   // FIXME: 's...' is a declarator and '{...}' is initializer
42662325d6b4SEduardo Caldas   [[S s0{}]];
42672325d6b4SEduardo Caldas   [[S s1{1}]];
42682325d6b4SEduardo Caldas   [[S s2{1, 2.}]];
42692325d6b4SEduardo Caldas }
4270a1461953SEduardo Caldas )cpp",
42712325d6b4SEduardo Caldas       {R"txt(
42722325d6b4SEduardo Caldas SimpleDeclaration
42732325d6b4SEduardo Caldas |-'S'
42745011d431SEduardo Caldas `-DeclaratorList Declarators
42755011d431SEduardo Caldas   `-SimpleDeclarator ListElement
42762325d6b4SEduardo Caldas     `-UnknownExpression
42772325d6b4SEduardo Caldas       |-'s0'
42782325d6b4SEduardo Caldas       |-'{'
42792325d6b4SEduardo Caldas       `-'}'
42802325d6b4SEduardo Caldas   )txt",
4281a1461953SEduardo Caldas        R"txt(
42822325d6b4SEduardo Caldas SimpleDeclaration
42832325d6b4SEduardo Caldas |-'S'
42845011d431SEduardo Caldas `-DeclaratorList Declarators
42855011d431SEduardo Caldas   `-SimpleDeclarator ListElement
42862325d6b4SEduardo Caldas     `-UnknownExpression
42872325d6b4SEduardo Caldas       |-'s1'
42882325d6b4SEduardo Caldas       |-'{'
42892325d6b4SEduardo Caldas       |-IntegerLiteralExpression
42902325d6b4SEduardo Caldas       | `-'1' LiteralToken
42912325d6b4SEduardo Caldas       `-'}'
42922325d6b4SEduardo Caldas   )txt",
42932325d6b4SEduardo Caldas        R"txt(
42942325d6b4SEduardo Caldas SimpleDeclaration
42952325d6b4SEduardo Caldas |-'S'
42965011d431SEduardo Caldas `-DeclaratorList Declarators
42975011d431SEduardo Caldas   `-SimpleDeclarator ListElement
42982325d6b4SEduardo Caldas     `-UnknownExpression
42992325d6b4SEduardo Caldas       |-'s2'
43002325d6b4SEduardo Caldas       |-'{'
43012325d6b4SEduardo Caldas       |-IntegerLiteralExpression
43022325d6b4SEduardo Caldas       | `-'1' LiteralToken
43032325d6b4SEduardo Caldas       |-','
43042325d6b4SEduardo Caldas       |-FloatingLiteralExpression
43052325d6b4SEduardo Caldas       | `-'2.' LiteralToken
43062325d6b4SEduardo Caldas       `-'}'
43072325d6b4SEduardo Caldas )txt"}));
43082325d6b4SEduardo Caldas }
43092325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,InitDeclarator_EqualBrace)4310c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, InitDeclarator_EqualBrace) {
43112325d6b4SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
43122325d6b4SEduardo Caldas     return;
43132325d6b4SEduardo Caldas   }
43142325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
43152325d6b4SEduardo Caldas       R"cpp(
43162325d6b4SEduardo Caldas struct S {
43172325d6b4SEduardo Caldas   S();
43182325d6b4SEduardo Caldas   S(int);
43192325d6b4SEduardo Caldas   S(int, float);
43202325d6b4SEduardo Caldas };
43212325d6b4SEduardo Caldas void test() {
43222325d6b4SEduardo Caldas   // FIXME: '= {...}' is initializer
43232325d6b4SEduardo Caldas   [[S s0 = {}]];
43242325d6b4SEduardo Caldas   [[S s1 = {1}]];
43252325d6b4SEduardo Caldas   [[S s2 = {1, 2.}]];
43262325d6b4SEduardo Caldas }
43272325d6b4SEduardo Caldas )cpp",
43282325d6b4SEduardo Caldas       {R"txt(
43292325d6b4SEduardo Caldas SimpleDeclaration
43302325d6b4SEduardo Caldas |-'S'
43315011d431SEduardo Caldas `-DeclaratorList Declarators
43325011d431SEduardo Caldas   `-SimpleDeclarator ListElement
43332325d6b4SEduardo Caldas     |-'s0'
43342325d6b4SEduardo Caldas     |-'='
43352325d6b4SEduardo Caldas     `-UnknownExpression
43362325d6b4SEduardo Caldas       |-'{'
43372325d6b4SEduardo Caldas       `-'}'
43382325d6b4SEduardo Caldas   )txt",
43392325d6b4SEduardo Caldas        R"txt(
43402325d6b4SEduardo Caldas SimpleDeclaration
43412325d6b4SEduardo Caldas |-'S'
43425011d431SEduardo Caldas `-DeclaratorList Declarators
43435011d431SEduardo Caldas   `-SimpleDeclarator ListElement
43442325d6b4SEduardo Caldas     |-'s1'
43452325d6b4SEduardo Caldas     |-'='
43462325d6b4SEduardo Caldas     `-UnknownExpression
43472325d6b4SEduardo Caldas       |-'{'
43482325d6b4SEduardo Caldas       |-IntegerLiteralExpression
43492325d6b4SEduardo Caldas       | `-'1' LiteralToken
43502325d6b4SEduardo Caldas       `-'}'
43512325d6b4SEduardo Caldas   )txt",
43522325d6b4SEduardo Caldas        R"txt(
43532325d6b4SEduardo Caldas SimpleDeclaration
43542325d6b4SEduardo Caldas |-'S'
43555011d431SEduardo Caldas `-DeclaratorList Declarators
43565011d431SEduardo Caldas   `-SimpleDeclarator ListElement
43572325d6b4SEduardo Caldas     |-'s2'
43582325d6b4SEduardo Caldas     |-'='
43592325d6b4SEduardo Caldas     `-UnknownExpression
43602325d6b4SEduardo Caldas       |-'{'
43612325d6b4SEduardo Caldas       |-IntegerLiteralExpression
43622325d6b4SEduardo Caldas       | `-'1' LiteralToken
43632325d6b4SEduardo Caldas       |-','
43642325d6b4SEduardo Caldas       |-FloatingLiteralExpression
43652325d6b4SEduardo Caldas       | `-'2.' LiteralToken
43662325d6b4SEduardo Caldas       `-'}'
43672325d6b4SEduardo Caldas )txt"}));
4368a1461953SEduardo Caldas }
4369a1461953SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,InitDeclarator_Paren)4370c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, InitDeclarator_Paren) {
4371a1461953SEduardo Caldas   if (!GetParam().isCXX()) {
4372a1461953SEduardo Caldas     return;
4373a1461953SEduardo Caldas   }
4374a1461953SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4375a1461953SEduardo Caldas       R"cpp(
4376a1461953SEduardo Caldas struct S {
4377a1461953SEduardo Caldas   S(int);
43782325d6b4SEduardo Caldas   S(int, float);
4379a1461953SEduardo Caldas };
43802325d6b4SEduardo Caldas // FIXME: 's...' is a declarator and '(...)' is initializer
43812325d6b4SEduardo Caldas [[S s1(1);]]
43822325d6b4SEduardo Caldas [[S s2(1, 2.);]]
4383a1461953SEduardo Caldas )cpp",
4384a1461953SEduardo Caldas       {R"txt(
4385a1461953SEduardo Caldas SimpleDeclaration
4386a1461953SEduardo Caldas |-'S'
43875011d431SEduardo Caldas |-DeclaratorList Declarators
43885011d431SEduardo Caldas | `-SimpleDeclarator ListElement
4389a1461953SEduardo Caldas |   `-UnknownExpression
43902325d6b4SEduardo Caldas |     |-'s1'
43912325d6b4SEduardo Caldas |     |-'('
43922325d6b4SEduardo Caldas |     |-IntegerLiteralExpression
43932325d6b4SEduardo Caldas |     | `-'1' LiteralToken
43942325d6b4SEduardo Caldas |     `-')'
43952325d6b4SEduardo Caldas `-';'
43962325d6b4SEduardo Caldas   )txt",
43972325d6b4SEduardo Caldas        R"txt(
43982325d6b4SEduardo Caldas SimpleDeclaration
43992325d6b4SEduardo Caldas |-'S'
44005011d431SEduardo Caldas |-DeclaratorList Declarators
44015011d431SEduardo Caldas | `-SimpleDeclarator ListElement
44022325d6b4SEduardo Caldas |   `-UnknownExpression
44032325d6b4SEduardo Caldas |     |-'s2'
44042325d6b4SEduardo Caldas |     |-'('
44052325d6b4SEduardo Caldas |     |-IntegerLiteralExpression
44062325d6b4SEduardo Caldas |     | `-'1' LiteralToken
44072325d6b4SEduardo Caldas |     |-','
44082325d6b4SEduardo Caldas |     |-FloatingLiteralExpression
44092325d6b4SEduardo Caldas |     | `-'2.' LiteralToken
44102325d6b4SEduardo Caldas |     `-')'
44112325d6b4SEduardo Caldas `-';'
44122325d6b4SEduardo Caldas )txt"}));
44132325d6b4SEduardo Caldas }
44142325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,InitDeclarator_Paren_DefaultArguments)4415c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, InitDeclarator_Paren_DefaultArguments) {
4416f5087d5cSEduardo Caldas   if (!GetParam().isCXX()) {
4417f5087d5cSEduardo Caldas     return;
4418f5087d5cSEduardo Caldas   }
4419f5087d5cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4420f5087d5cSEduardo Caldas       R"cpp(
4421f5087d5cSEduardo Caldas struct S {
4422f5087d5cSEduardo Caldas   S(int i = 1, float = 2.);
4423f5087d5cSEduardo Caldas };
4424f5087d5cSEduardo Caldas [[S s0;]]
4425f5087d5cSEduardo Caldas // FIXME: 's...' is a declarator and '(...)' is initializer
4426f5087d5cSEduardo Caldas [[S s1(1);]]
4427f5087d5cSEduardo Caldas [[S s2(1, 2.);]]
4428f5087d5cSEduardo Caldas )cpp",
4429f5087d5cSEduardo Caldas       {R"txt(
4430f5087d5cSEduardo Caldas SimpleDeclaration
4431f5087d5cSEduardo Caldas |-'S'
44325011d431SEduardo Caldas |-DeclaratorList Declarators
44335011d431SEduardo Caldas | `-SimpleDeclarator ListElement
4434f5087d5cSEduardo Caldas |   `-'s0'
4435f5087d5cSEduardo Caldas `-';'
4436f5087d5cSEduardo Caldas   )txt",
4437f5087d5cSEduardo Caldas        R"txt(
4438f5087d5cSEduardo Caldas SimpleDeclaration
4439f5087d5cSEduardo Caldas |-'S'
44405011d431SEduardo Caldas |-DeclaratorList Declarators
44415011d431SEduardo Caldas | `-SimpleDeclarator ListElement
4442f5087d5cSEduardo Caldas |   `-UnknownExpression
4443f5087d5cSEduardo Caldas |     |-'s1'
4444f5087d5cSEduardo Caldas |     |-'('
4445f5087d5cSEduardo Caldas |     |-IntegerLiteralExpression
4446f5087d5cSEduardo Caldas |     | `-'1' LiteralToken
4447f5087d5cSEduardo Caldas |     `-')'
4448f5087d5cSEduardo Caldas `-';'
4449f5087d5cSEduardo Caldas   )txt",
4450f5087d5cSEduardo Caldas        R"txt(
4451f5087d5cSEduardo Caldas SimpleDeclaration
4452f5087d5cSEduardo Caldas |-'S'
44535011d431SEduardo Caldas |-DeclaratorList Declarators
44545011d431SEduardo Caldas | `-SimpleDeclarator ListElement
4455f5087d5cSEduardo Caldas |   `-UnknownExpression
4456f5087d5cSEduardo Caldas |     |-'s2'
4457f5087d5cSEduardo Caldas |     |-'('
4458f5087d5cSEduardo Caldas |     |-IntegerLiteralExpression
4459f5087d5cSEduardo Caldas |     | `-'1' LiteralToken
4460f5087d5cSEduardo Caldas |     |-','
4461f5087d5cSEduardo Caldas |     |-FloatingLiteralExpression
4462f5087d5cSEduardo Caldas |     | `-'2.' LiteralToken
4463f5087d5cSEduardo Caldas |     `-')'
4464f5087d5cSEduardo Caldas `-';'
4465f5087d5cSEduardo Caldas )txt"}));
4466f5087d5cSEduardo Caldas }
4467f5087d5cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ImplicitConversion_Argument)4468c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ImplicitConversion_Argument) {
44692325d6b4SEduardo Caldas   if (!GetParam().isCXX()) {
44702325d6b4SEduardo Caldas     return;
44712325d6b4SEduardo Caldas   }
44722325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
44732325d6b4SEduardo Caldas       R"cpp(
44742325d6b4SEduardo Caldas struct X {
44752325d6b4SEduardo Caldas   X(int);
44762325d6b4SEduardo Caldas };
44772325d6b4SEduardo Caldas void TakeX(const X&);
44782325d6b4SEduardo Caldas void test() {
44792325d6b4SEduardo Caldas   [[TakeX(1)]];
44802325d6b4SEduardo Caldas }
44812325d6b4SEduardo Caldas )cpp",
44822325d6b4SEduardo Caldas       {R"txt(
44832325d6b4SEduardo Caldas CallExpression Expression
44842325d6b4SEduardo Caldas |-IdExpression Callee
44852325d6b4SEduardo Caldas | `-UnqualifiedId UnqualifiedId
44862325d6b4SEduardo Caldas |   `-'TakeX'
44872325d6b4SEduardo Caldas |-'(' OpenParen
44882325d6b4SEduardo Caldas |-CallArguments Arguments
44892325d6b4SEduardo Caldas | `-IntegerLiteralExpression ListElement
44902325d6b4SEduardo Caldas |   `-'1' LiteralToken
44912325d6b4SEduardo Caldas `-')' CloseParen
44922325d6b4SEduardo Caldas )txt"}));
44932325d6b4SEduardo Caldas }
44942325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ImplicitConversion_Return)4495c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ImplicitConversion_Return) {
44962325d6b4SEduardo Caldas   if (!GetParam().isCXX()) {
44972325d6b4SEduardo Caldas     return;
44982325d6b4SEduardo Caldas   }
44992325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
45002325d6b4SEduardo Caldas       R"cpp(
45012325d6b4SEduardo Caldas struct X {
45022325d6b4SEduardo Caldas   X(int);
45032325d6b4SEduardo Caldas };
45042325d6b4SEduardo Caldas X CreateX(){
45052325d6b4SEduardo Caldas   [[return 1;]]
45062325d6b4SEduardo Caldas }
45072325d6b4SEduardo Caldas )cpp",
45082325d6b4SEduardo Caldas       {R"txt(
45092325d6b4SEduardo Caldas ReturnStatement Statement
45102325d6b4SEduardo Caldas |-'return' IntroducerKeyword
45112325d6b4SEduardo Caldas |-IntegerLiteralExpression ReturnValue
45122325d6b4SEduardo Caldas | `-'1' LiteralToken
45132325d6b4SEduardo Caldas `-';'
45142325d6b4SEduardo Caldas )txt"}));
45152325d6b4SEduardo Caldas }
45162325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ConstructorCall_ZeroArguments)4517c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ConstructorCall_ZeroArguments) {
45182325d6b4SEduardo Caldas   if (!GetParam().isCXX()) {
45192325d6b4SEduardo Caldas     return;
45202325d6b4SEduardo Caldas   }
45212325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
45222325d6b4SEduardo Caldas       R"cpp(
45232325d6b4SEduardo Caldas struct X {
45242325d6b4SEduardo Caldas   X();
45252325d6b4SEduardo Caldas };
45262325d6b4SEduardo Caldas X test() {
45272325d6b4SEduardo Caldas   [[return X();]]
45282325d6b4SEduardo Caldas }
45292325d6b4SEduardo Caldas )cpp",
45302325d6b4SEduardo Caldas       {R"txt(
45312325d6b4SEduardo Caldas ReturnStatement Statement
45322325d6b4SEduardo Caldas |-'return' IntroducerKeyword
45332325d6b4SEduardo Caldas |-UnknownExpression ReturnValue
45342325d6b4SEduardo Caldas | |-'X'
45352325d6b4SEduardo Caldas | |-'('
45362325d6b4SEduardo Caldas | `-')'
45372325d6b4SEduardo Caldas `-';'
45382325d6b4SEduardo Caldas )txt"}));
45392325d6b4SEduardo Caldas }
45402325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ConstructorCall_OneArgument)4541c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ConstructorCall_OneArgument) {
45422325d6b4SEduardo Caldas   if (!GetParam().isCXX()) {
45432325d6b4SEduardo Caldas     return;
45442325d6b4SEduardo Caldas   }
45452325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
45462325d6b4SEduardo Caldas       R"cpp(
45472325d6b4SEduardo Caldas struct X {
45482325d6b4SEduardo Caldas   X(int);
45492325d6b4SEduardo Caldas };
45502325d6b4SEduardo Caldas X test() {
45512325d6b4SEduardo Caldas   [[return X(1);]]
45522325d6b4SEduardo Caldas }
45532325d6b4SEduardo Caldas )cpp",
45542325d6b4SEduardo Caldas       {R"txt(
45552325d6b4SEduardo Caldas ReturnStatement Statement
45562325d6b4SEduardo Caldas |-'return' IntroducerKeyword
45572325d6b4SEduardo Caldas |-UnknownExpression ReturnValue
45582325d6b4SEduardo Caldas | |-'X'
45592325d6b4SEduardo Caldas | |-'('
45602325d6b4SEduardo Caldas | |-IntegerLiteralExpression
45612325d6b4SEduardo Caldas | | `-'1' LiteralToken
45622325d6b4SEduardo Caldas | `-')'
45632325d6b4SEduardo Caldas `-';'
45642325d6b4SEduardo Caldas )txt"}));
45652325d6b4SEduardo Caldas }
45662325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ConstructorCall_MultipleArguments)4567c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ConstructorCall_MultipleArguments) {
45682325d6b4SEduardo Caldas   if (!GetParam().isCXX()) {
45692325d6b4SEduardo Caldas     return;
45702325d6b4SEduardo Caldas   }
45712325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
45722325d6b4SEduardo Caldas       R"cpp(
45732325d6b4SEduardo Caldas struct X {
45742325d6b4SEduardo Caldas   X(int, char);
45752325d6b4SEduardo Caldas };
45762325d6b4SEduardo Caldas X test() {
45772325d6b4SEduardo Caldas   [[return X(1, '2');]]
45782325d6b4SEduardo Caldas }
45792325d6b4SEduardo Caldas )cpp",
45802325d6b4SEduardo Caldas       {R"txt(
45812325d6b4SEduardo Caldas ReturnStatement Statement
45822325d6b4SEduardo Caldas |-'return' IntroducerKeyword
45832325d6b4SEduardo Caldas |-UnknownExpression ReturnValue
45842325d6b4SEduardo Caldas | |-'X'
45852325d6b4SEduardo Caldas | |-'('
45862325d6b4SEduardo Caldas | |-IntegerLiteralExpression
45872325d6b4SEduardo Caldas | | `-'1' LiteralToken
45882325d6b4SEduardo Caldas | |-','
45892325d6b4SEduardo Caldas | |-CharacterLiteralExpression
45902325d6b4SEduardo Caldas | | `-''2'' LiteralToken
45912325d6b4SEduardo Caldas | `-')'
45922325d6b4SEduardo Caldas `-';'
45932325d6b4SEduardo Caldas )txt"}));
45942325d6b4SEduardo Caldas }
45952325d6b4SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ConstructorCall_DefaultArguments)4596c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ConstructorCall_DefaultArguments) {
4597f5087d5cSEduardo Caldas   if (!GetParam().isCXX()) {
4598f5087d5cSEduardo Caldas     return;
4599f5087d5cSEduardo Caldas   }
4600f5087d5cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4601f5087d5cSEduardo Caldas       R"cpp(
4602f5087d5cSEduardo Caldas struct X {
4603f5087d5cSEduardo Caldas   X(int i = 1, char c = '2');
4604f5087d5cSEduardo Caldas };
4605f5087d5cSEduardo Caldas X test() {
4606f5087d5cSEduardo Caldas   auto x0 = [[X()]];
4607f5087d5cSEduardo Caldas   auto x1 = [[X(1)]];
4608f5087d5cSEduardo Caldas   auto x2 = [[X(1, '2')]];
4609f5087d5cSEduardo Caldas }
4610f5087d5cSEduardo Caldas )cpp",
4611f5087d5cSEduardo Caldas       {R"txt(
4612f5087d5cSEduardo Caldas UnknownExpression
4613f5087d5cSEduardo Caldas |-'X'
4614f5087d5cSEduardo Caldas |-'('
4615f5087d5cSEduardo Caldas `-')'
4616f5087d5cSEduardo Caldas )txt",
4617f5087d5cSEduardo Caldas        R"txt(
4618f5087d5cSEduardo Caldas UnknownExpression
4619f5087d5cSEduardo Caldas |-'X'
4620f5087d5cSEduardo Caldas |-'('
4621f5087d5cSEduardo Caldas |-IntegerLiteralExpression
4622f5087d5cSEduardo Caldas | `-'1' LiteralToken
4623f5087d5cSEduardo Caldas `-')'
4624f5087d5cSEduardo Caldas )txt",
4625f5087d5cSEduardo Caldas        R"txt(
4626f5087d5cSEduardo Caldas UnknownExpression
4627f5087d5cSEduardo Caldas |-'X'
4628f5087d5cSEduardo Caldas |-'('
4629f5087d5cSEduardo Caldas |-IntegerLiteralExpression
4630f5087d5cSEduardo Caldas | `-'1' LiteralToken
4631f5087d5cSEduardo Caldas |-','
4632f5087d5cSEduardo Caldas |-CharacterLiteralExpression
4633f5087d5cSEduardo Caldas | `-''2'' LiteralToken
4634f5087d5cSEduardo Caldas `-')'
4635f5087d5cSEduardo Caldas )txt"}));
4636f5087d5cSEduardo Caldas }
4637f5087d5cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,TypeConversion_FunctionalNotation)4638c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, TypeConversion_FunctionalNotation) {
46392325d6b4SEduardo Caldas   if (!GetParam().isCXX()) {
46402325d6b4SEduardo Caldas     return;
46412325d6b4SEduardo Caldas   }
46422325d6b4SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
46432325d6b4SEduardo Caldas       R"cpp(
46442325d6b4SEduardo Caldas float test() {
46452325d6b4SEduardo Caldas   [[return float(1);]]
46462325d6b4SEduardo Caldas }
46472325d6b4SEduardo Caldas )cpp",
46482325d6b4SEduardo Caldas       {R"txt(
46492325d6b4SEduardo Caldas ReturnStatement Statement
46502325d6b4SEduardo Caldas |-'return' IntroducerKeyword
46512325d6b4SEduardo Caldas |-UnknownExpression ReturnValue
46522325d6b4SEduardo Caldas | |-'float'
4653a1461953SEduardo Caldas | |-'('
4654a1461953SEduardo Caldas | |-IntegerLiteralExpression
4655a1461953SEduardo Caldas | | `-'1' LiteralToken
4656a1461953SEduardo Caldas | `-')'
4657a1461953SEduardo Caldas `-';'
4658a1461953SEduardo Caldas )txt"}));
4659a1461953SEduardo Caldas }
4660a1461953SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ArrayDeclarator_Simple)4661c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_Simple) {
4662d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
4663d17437d2SEduardo Caldas       R"cpp(
4664d17437d2SEduardo Caldas int a[10];
46654e8dd506SEduardo Caldas )cpp",
46664e8dd506SEduardo Caldas       R"txt(
46675c11c08dSEduardo Caldas TranslationUnit Detached
46684e8dd506SEduardo Caldas `-SimpleDeclaration
46695c11c08dSEduardo Caldas   |-'int'
46705011d431SEduardo Caldas   |-DeclaratorList Declarators
46715011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
46725c11c08dSEduardo Caldas   |   |-'a'
46734e8dd506SEduardo Caldas   |   `-ArraySubscript
46745c11c08dSEduardo Caldas   |     |-'[' OpenParen
4675718e550cSEduardo Caldas   |     |-IntegerLiteralExpression Size
46765c11c08dSEduardo Caldas   |     | `-'10' LiteralToken
46775c11c08dSEduardo Caldas   |     `-']' CloseParen
46785c11c08dSEduardo Caldas   `-';'
46794e8dd506SEduardo Caldas )txt"));
46804e8dd506SEduardo Caldas }
46814e8dd506SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ArrayDeclarator_Multidimensional)4682c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_Multidimensional) {
46834e8dd506SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
46844e8dd506SEduardo Caldas       R"cpp(
4685d17437d2SEduardo Caldas int b[1][2][3];
46864e8dd506SEduardo Caldas )cpp",
46874e8dd506SEduardo Caldas       R"txt(
46885c11c08dSEduardo Caldas TranslationUnit Detached
46894e8dd506SEduardo Caldas `-SimpleDeclaration
46905c11c08dSEduardo Caldas   |-'int'
46915011d431SEduardo Caldas   |-DeclaratorList Declarators
46925011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
46935c11c08dSEduardo Caldas   |   |-'b'
46944e8dd506SEduardo Caldas   |   |-ArraySubscript
46955c11c08dSEduardo Caldas   |   | |-'[' OpenParen
4696718e550cSEduardo Caldas   |   | |-IntegerLiteralExpression Size
46975c11c08dSEduardo Caldas   |   | | `-'1' LiteralToken
46985c11c08dSEduardo Caldas   |   | `-']' CloseParen
46994e8dd506SEduardo Caldas   |   |-ArraySubscript
47005c11c08dSEduardo Caldas   |   | |-'[' OpenParen
4701718e550cSEduardo Caldas   |   | |-IntegerLiteralExpression Size
47025c11c08dSEduardo Caldas   |   | | `-'2' LiteralToken
47035c11c08dSEduardo Caldas   |   | `-']' CloseParen
47044e8dd506SEduardo Caldas   |   `-ArraySubscript
47055c11c08dSEduardo Caldas   |     |-'[' OpenParen
4706718e550cSEduardo Caldas   |     |-IntegerLiteralExpression Size
47075c11c08dSEduardo Caldas   |     | `-'3' LiteralToken
47085c11c08dSEduardo Caldas   |     `-']' CloseParen
47095c11c08dSEduardo Caldas   `-';'
47104e8dd506SEduardo Caldas )txt"));
47114e8dd506SEduardo Caldas }
47124e8dd506SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ArrayDeclarator_UnknownBound)4713c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_UnknownBound) {
47144e8dd506SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
47154e8dd506SEduardo Caldas       R"cpp(
4716d17437d2SEduardo Caldas int c[] = {1,2,3};
4717d17437d2SEduardo Caldas )cpp",
4718d17437d2SEduardo Caldas       R"txt(
47195c11c08dSEduardo Caldas TranslationUnit Detached
4720d17437d2SEduardo Caldas `-SimpleDeclaration
47215c11c08dSEduardo Caldas   |-'int'
47225011d431SEduardo Caldas   |-DeclaratorList Declarators
47235011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
47245c11c08dSEduardo Caldas   |   |-'c'
4725d17437d2SEduardo Caldas   |   |-ArraySubscript
47265c11c08dSEduardo Caldas   |   | |-'[' OpenParen
47275c11c08dSEduardo Caldas   |   | `-']' CloseParen
47285c11c08dSEduardo Caldas   |   |-'='
4729d17437d2SEduardo Caldas   |   `-UnknownExpression
4730d17437d2SEduardo Caldas   |     `-UnknownExpression
47315c11c08dSEduardo Caldas   |       |-'{'
4732d17437d2SEduardo Caldas   |       |-IntegerLiteralExpression
47335c11c08dSEduardo Caldas   |       | `-'1' LiteralToken
47345c11c08dSEduardo Caldas   |       |-','
4735d17437d2SEduardo Caldas   |       |-IntegerLiteralExpression
47365c11c08dSEduardo Caldas   |       | `-'2' LiteralToken
47375c11c08dSEduardo Caldas   |       |-','
4738d17437d2SEduardo Caldas   |       |-IntegerLiteralExpression
47395c11c08dSEduardo Caldas   |       | `-'3' LiteralToken
47405c11c08dSEduardo Caldas   |       `-'}'
47415c11c08dSEduardo Caldas   `-';'
4742d17437d2SEduardo Caldas )txt"));
4743d17437d2SEduardo Caldas }
4744d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ArrayDeclarator_Static)4745c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_Static) {
4746d17437d2SEduardo Caldas   if (!GetParam().isC99OrLater()) {
4747d17437d2SEduardo Caldas     return;
4748d17437d2SEduardo Caldas   }
4749d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
4750d17437d2SEduardo Caldas       R"cpp(
4751d17437d2SEduardo Caldas void f(int xs[static 10]);
4752d17437d2SEduardo Caldas )cpp",
4753d17437d2SEduardo Caldas       R"txt(
47545c11c08dSEduardo Caldas TranslationUnit Detached
4755d17437d2SEduardo Caldas `-SimpleDeclaration
47565c11c08dSEduardo Caldas   |-'void'
47575011d431SEduardo Caldas   |-DeclaratorList Declarators
47585011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
47595c11c08dSEduardo Caldas   |   |-'f'
4760d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
47615c11c08dSEduardo Caldas   |     |-'(' OpenParen
4762718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
4763718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
47645c11c08dSEduardo Caldas   |     |   |-'int'
47655011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
47665011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
47675c11c08dSEduardo Caldas   |     |       |-'xs'
4768d17437d2SEduardo Caldas   |     |       `-ArraySubscript
47695c11c08dSEduardo Caldas   |     |         |-'[' OpenParen
47705c11c08dSEduardo Caldas   |     |         |-'static'
4771718e550cSEduardo Caldas   |     |         |-IntegerLiteralExpression Size
47725c11c08dSEduardo Caldas   |     |         | `-'10' LiteralToken
47735c11c08dSEduardo Caldas   |     |         `-']' CloseParen
47745c11c08dSEduardo Caldas   |     `-')' CloseParen
47755c11c08dSEduardo Caldas   `-';'
4776d17437d2SEduardo Caldas )txt"));
4777d17437d2SEduardo Caldas }
4778d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Empty)4779c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Empty) {
4780d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
4781d17437d2SEduardo Caldas       R"cpp(
47824baa163cSEduardo Caldas int func();
47834baa163cSEduardo Caldas )cpp",
47844baa163cSEduardo Caldas       R"txt(
47855c11c08dSEduardo Caldas TranslationUnit Detached
47864baa163cSEduardo Caldas `-SimpleDeclaration
47875c11c08dSEduardo Caldas   |-'int'
47885011d431SEduardo Caldas   |-DeclaratorList Declarators
47895011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
47905c11c08dSEduardo Caldas   |   |-'func'
47914baa163cSEduardo Caldas   |   `-ParametersAndQualifiers
47925c11c08dSEduardo Caldas   |     |-'(' OpenParen
47935c11c08dSEduardo Caldas   |     `-')' CloseParen
47945c11c08dSEduardo Caldas   `-';'
47954baa163cSEduardo Caldas )txt"));
47964baa163cSEduardo Caldas }
47974baa163cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Named)4798c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Named) {
479935a5e883SHaojian Wu   EXPECT_TRUE(treeDumpEqualOnAnnotations(
48004baa163cSEduardo Caldas       R"cpp(
480135a5e883SHaojian Wu      int func1([[int a]]);
480235a5e883SHaojian Wu      int func2([[int *ap]]);
480335a5e883SHaojian Wu      int func3([[int a, float b]]);
4804e159a3ceSHaojian Wu      int func4([[undef a]]); // error-ok: no crash on invalid type
4805d17437d2SEduardo Caldas    )cpp",
480635a5e883SHaojian Wu       {R"txt(
480735a5e883SHaojian Wu ParameterDeclarationList Parameters
480835a5e883SHaojian Wu `-SimpleDeclaration ListElement
48095c11c08dSEduardo Caldas   |-'int'
481035a5e883SHaojian Wu   `-DeclaratorList Declarators
481135a5e883SHaojian Wu     `-SimpleDeclarator ListElement
481235a5e883SHaojian Wu       `-'a'
481335a5e883SHaojian Wu )txt",
481435a5e883SHaojian Wu        R"txt(
481535a5e883SHaojian Wu ParameterDeclarationList Parameters
481635a5e883SHaojian Wu `-SimpleDeclaration ListElement
481735a5e883SHaojian Wu   |-'int'
481835a5e883SHaojian Wu   `-DeclaratorList Declarators
481935a5e883SHaojian Wu     `-SimpleDeclarator ListElement
482035a5e883SHaojian Wu       |-'*'
482135a5e883SHaojian Wu       `-'ap'
482235a5e883SHaojian Wu )txt",
482335a5e883SHaojian Wu        R"txt(
482435a5e883SHaojian Wu ParameterDeclarationList Parameters
482535a5e883SHaojian Wu |-SimpleDeclaration ListElement
482635a5e883SHaojian Wu | |-'int'
482735a5e883SHaojian Wu | `-DeclaratorList Declarators
48285011d431SEduardo Caldas |   `-SimpleDeclarator ListElement
482935a5e883SHaojian Wu |     `-'a'
483035a5e883SHaojian Wu |-',' ListDelimiter
483135a5e883SHaojian Wu `-SimpleDeclaration ListElement
483235a5e883SHaojian Wu   |-'float'
483335a5e883SHaojian Wu   `-DeclaratorList Declarators
483435a5e883SHaojian Wu     `-SimpleDeclarator ListElement
483535a5e883SHaojian Wu       `-'b'
4836e159a3ceSHaojian Wu )txt",
4837e159a3ceSHaojian Wu        R"txt(
4838e159a3ceSHaojian Wu ParameterDeclarationList Parameters
4839e159a3ceSHaojian Wu `-SimpleDeclaration ListElement
4840e159a3ceSHaojian Wu   |-'undef'
4841e159a3ceSHaojian Wu   `-DeclaratorList Declarators
4842e159a3ceSHaojian Wu     `-SimpleDeclarator ListElement
4843e159a3ceSHaojian Wu       `-'a'
484435a5e883SHaojian Wu )txt"}));
48454baa163cSEduardo Caldas }
48464baa163cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Unnamed)4847c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Unnamed) {
48484baa163cSEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
48494baa163cSEduardo Caldas       R"cpp(
48504baa163cSEduardo Caldas int func1(int);
48514baa163cSEduardo Caldas int func2(int *);
48524baa163cSEduardo Caldas int func3(int, float);
48534baa163cSEduardo Caldas )cpp",
48544baa163cSEduardo Caldas       R"txt(
48555c11c08dSEduardo Caldas TranslationUnit Detached
4856d17437d2SEduardo Caldas |-SimpleDeclaration
48575c11c08dSEduardo Caldas | |-'int'
48585011d431SEduardo Caldas | |-DeclaratorList Declarators
48595011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
48605c11c08dSEduardo Caldas | |   |-'func1'
48614baa163cSEduardo Caldas | |   `-ParametersAndQualifiers
48625c11c08dSEduardo Caldas | |     |-'(' OpenParen
4863718e550cSEduardo Caldas | |     |-ParameterDeclarationList Parameters
4864718e550cSEduardo Caldas | |     | `-SimpleDeclaration ListElement
48655c11c08dSEduardo Caldas | |     |   `-'int'
48665c11c08dSEduardo Caldas | |     `-')' CloseParen
48675c11c08dSEduardo Caldas | `-';'
48684baa163cSEduardo Caldas |-SimpleDeclaration
48695c11c08dSEduardo Caldas | |-'int'
48705011d431SEduardo Caldas | |-DeclaratorList Declarators
48715011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
48725c11c08dSEduardo Caldas | |   |-'func2'
4873d17437d2SEduardo Caldas | |   `-ParametersAndQualifiers
48745c11c08dSEduardo Caldas | |     |-'(' OpenParen
4875718e550cSEduardo Caldas | |     |-ParameterDeclarationList Parameters
4876718e550cSEduardo Caldas | |     | `-SimpleDeclaration ListElement
48775c11c08dSEduardo Caldas | |     |   |-'int'
48785011d431SEduardo Caldas | |     |   `-DeclaratorList Declarators
48795011d431SEduardo Caldas | |     |     `-SimpleDeclarator ListElement
48805c11c08dSEduardo Caldas | |     |       `-'*'
48815c11c08dSEduardo Caldas | |     `-')' CloseParen
48825c11c08dSEduardo Caldas | `-';'
4883d17437d2SEduardo Caldas `-SimpleDeclaration
48845c11c08dSEduardo Caldas   |-'int'
48855011d431SEduardo Caldas   |-DeclaratorList Declarators
48865011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
48875c11c08dSEduardo Caldas   |   |-'func3'
4888d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
48895c11c08dSEduardo Caldas   |     |-'(' OpenParen
4890718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
4891718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
4892dc3d4743SEduardo Caldas   |     | | `-'int'
4893718e550cSEduardo Caldas   |     | |-',' ListDelimiter
4894718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
48955c11c08dSEduardo Caldas   |     |   `-'float'
48965c11c08dSEduardo Caldas   |     `-')' CloseParen
48975c11c08dSEduardo Caldas   `-';'
4898d17437d2SEduardo Caldas )txt"));
4899d17437d2SEduardo Caldas }
4900d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Default_One)4901c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
4902c01d28dcSEduardo Caldas        ParametersAndQualifiers_InFreeFunctions_Default_One) {
4903f5087d5cSEduardo Caldas   if (!GetParam().isCXX()) {
4904f5087d5cSEduardo Caldas     return;
4905f5087d5cSEduardo Caldas   }
4906f5087d5cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4907f5087d5cSEduardo Caldas       R"cpp(
4908f5087d5cSEduardo Caldas int func1([[int a = 1]]);
4909f5087d5cSEduardo Caldas )cpp",
4910f5087d5cSEduardo Caldas       {R"txt(
4911f5087d5cSEduardo Caldas ParameterDeclarationList Parameters
4912f5087d5cSEduardo Caldas `-SimpleDeclaration ListElement
4913f5087d5cSEduardo Caldas   |-'int'
49145011d431SEduardo Caldas   `-DeclaratorList Declarators
49155011d431SEduardo Caldas     `-SimpleDeclarator ListElement
4916f5087d5cSEduardo Caldas       |-'a'
4917f5087d5cSEduardo Caldas       |-'='
4918f5087d5cSEduardo Caldas       `-IntegerLiteralExpression
4919f5087d5cSEduardo Caldas         `-'1' LiteralToken
4920f5087d5cSEduardo Caldas )txt"}));
4921f5087d5cSEduardo Caldas }
4922f5087d5cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Default_Multiple)4923c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
4924f5087d5cSEduardo Caldas        ParametersAndQualifiers_InFreeFunctions_Default_Multiple) {
4925f5087d5cSEduardo Caldas   if (!GetParam().isCXX()) {
4926f5087d5cSEduardo Caldas     return;
4927f5087d5cSEduardo Caldas   }
4928f5087d5cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4929f5087d5cSEduardo Caldas       R"cpp(
4930f5087d5cSEduardo Caldas int func2([[int *ap, int a = 1, char c = '2']]);
4931f5087d5cSEduardo Caldas )cpp",
4932f5087d5cSEduardo Caldas       {R"txt(
4933f5087d5cSEduardo Caldas ParameterDeclarationList Parameters
4934f5087d5cSEduardo Caldas |-SimpleDeclaration ListElement
4935f5087d5cSEduardo Caldas | |-'int'
49365011d431SEduardo Caldas | `-DeclaratorList Declarators
49375011d431SEduardo Caldas |   `-SimpleDeclarator ListElement
4938f5087d5cSEduardo Caldas |     |-'*'
4939f5087d5cSEduardo Caldas |     `-'ap'
4940f5087d5cSEduardo Caldas |-',' ListDelimiter
4941f5087d5cSEduardo Caldas |-SimpleDeclaration ListElement
4942f5087d5cSEduardo Caldas | |-'int'
49435011d431SEduardo Caldas | `-DeclaratorList Declarators
49445011d431SEduardo Caldas |   `-SimpleDeclarator ListElement
4945f5087d5cSEduardo Caldas |     |-'a'
4946f5087d5cSEduardo Caldas |     |-'='
4947f5087d5cSEduardo Caldas |     `-IntegerLiteralExpression
4948f5087d5cSEduardo Caldas |       `-'1' LiteralToken
4949f5087d5cSEduardo Caldas |-',' ListDelimiter
4950f5087d5cSEduardo Caldas `-SimpleDeclaration ListElement
4951f5087d5cSEduardo Caldas   |-'char'
49525011d431SEduardo Caldas   `-DeclaratorList Declarators
49535011d431SEduardo Caldas     `-SimpleDeclarator ListElement
4954f5087d5cSEduardo Caldas       |-'c'
4955f5087d5cSEduardo Caldas       |-'='
4956f5087d5cSEduardo Caldas       `-CharacterLiteralExpression
4957f5087d5cSEduardo Caldas         `-''2'' LiteralToken
4958f5087d5cSEduardo Caldas )txt"}));
4959f5087d5cSEduardo Caldas }
4960f5087d5cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InVariadicFunctionTemplate_ParameterPack)4961c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
4962dc3d4743SEduardo Caldas        ParametersAndQualifiers_InVariadicFunctionTemplate_ParameterPack) {
4963dc3d4743SEduardo Caldas   if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) {
4964dc3d4743SEduardo Caldas     return;
4965dc3d4743SEduardo Caldas   }
4966dc3d4743SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4967dc3d4743SEduardo Caldas       R"cpp(
4968dc3d4743SEduardo Caldas template<typename T, typename... Args>
4969dc3d4743SEduardo Caldas [[void test(T , Args... );]]
4970dc3d4743SEduardo Caldas )cpp",
4971dc3d4743SEduardo Caldas       {R"txt(
4972dc3d4743SEduardo Caldas SimpleDeclaration
4973dc3d4743SEduardo Caldas |-'void'
49745011d431SEduardo Caldas |-DeclaratorList Declarators
49755011d431SEduardo Caldas | `-SimpleDeclarator ListElement
4976dc3d4743SEduardo Caldas |   |-'test'
4977dc3d4743SEduardo Caldas |   `-ParametersAndQualifiers
4978dc3d4743SEduardo Caldas |     |-'(' OpenParen
4979718e550cSEduardo Caldas |     |-ParameterDeclarationList Parameters
4980718e550cSEduardo Caldas |     | |-SimpleDeclaration ListElement
4981dc3d4743SEduardo Caldas |     | | `-'T'
4982718e550cSEduardo Caldas |     | |-',' ListDelimiter
4983718e550cSEduardo Caldas |     | `-SimpleDeclaration ListElement
4984dc3d4743SEduardo Caldas |     |   |-'Args'
4985dc3d4743SEduardo Caldas |     |   `-'...'
4986dc3d4743SEduardo Caldas |     `-')' CloseParen
4987dc3d4743SEduardo Caldas `-';'
4988dc3d4743SEduardo Caldas )txt"}));
4989dc3d4743SEduardo Caldas }
4990dc3d4743SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InVariadicFunctionTemplate_NamedParameterPack)4991c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
4992dc3d4743SEduardo Caldas        ParametersAndQualifiers_InVariadicFunctionTemplate_NamedParameterPack) {
4993dc3d4743SEduardo Caldas   if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) {
4994dc3d4743SEduardo Caldas     return;
4995dc3d4743SEduardo Caldas   }
4996dc3d4743SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
4997dc3d4743SEduardo Caldas       R"cpp(
4998dc3d4743SEduardo Caldas template<typename T, typename... Args>
4999dc3d4743SEduardo Caldas [[void test(T t, Args... args);]]
5000dc3d4743SEduardo Caldas )cpp",
5001dc3d4743SEduardo Caldas       {R"txt(
5002dc3d4743SEduardo Caldas SimpleDeclaration
5003dc3d4743SEduardo Caldas |-'void'
50045011d431SEduardo Caldas |-DeclaratorList Declarators
50055011d431SEduardo Caldas | `-SimpleDeclarator ListElement
5006dc3d4743SEduardo Caldas |   |-'test'
5007dc3d4743SEduardo Caldas |   `-ParametersAndQualifiers
5008dc3d4743SEduardo Caldas |     |-'(' OpenParen
5009718e550cSEduardo Caldas |     |-ParameterDeclarationList Parameters
5010718e550cSEduardo Caldas |     | |-SimpleDeclaration ListElement
5011dc3d4743SEduardo Caldas |     | | |-'T'
50125011d431SEduardo Caldas |     | | `-DeclaratorList Declarators
50135011d431SEduardo Caldas |     | |   `-SimpleDeclarator ListElement
5014dc3d4743SEduardo Caldas |     | |     `-'t'
5015718e550cSEduardo Caldas |     | |-',' ListDelimiter
5016718e550cSEduardo Caldas |     | `-SimpleDeclaration ListElement
5017dc3d4743SEduardo Caldas |     |   |-'Args'
5018dc3d4743SEduardo Caldas |     |   |-'...'
50195011d431SEduardo Caldas |     |   `-DeclaratorList Declarators
50205011d431SEduardo Caldas |     |     `-SimpleDeclarator ListElement
5021dc3d4743SEduardo Caldas |     |       `-'args'
5022dc3d4743SEduardo Caldas |     `-')' CloseParen
5023dc3d4743SEduardo Caldas `-';'
5024dc3d4743SEduardo Caldas )txt"}));
5025dc3d4743SEduardo Caldas }
5026dc3d4743SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_VariadicArguments)5027c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
5028dc3d4743SEduardo Caldas        ParametersAndQualifiers_InFreeFunctions_VariadicArguments) {
5029dc3d4743SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
5030dc3d4743SEduardo Caldas     return;
5031dc3d4743SEduardo Caldas   }
5032dc3d4743SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5033dc3d4743SEduardo Caldas       R"cpp(
5034dc3d4743SEduardo Caldas void test(int , char ...);
5035dc3d4743SEduardo Caldas )cpp",
5036dc3d4743SEduardo Caldas       R"txt(
5037dc3d4743SEduardo Caldas TranslationUnit Detached
5038dc3d4743SEduardo Caldas `-SimpleDeclaration
5039dc3d4743SEduardo Caldas   |-'void'
50405011d431SEduardo Caldas   |-DeclaratorList Declarators
50415011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
5042dc3d4743SEduardo Caldas   |   |-'test'
5043dc3d4743SEduardo Caldas   |   `-ParametersAndQualifiers
5044dc3d4743SEduardo Caldas   |     |-'(' OpenParen
5045718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
5046718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
5047dc3d4743SEduardo Caldas   |     | | `-'int'
5048718e550cSEduardo Caldas   |     | |-',' ListDelimiter
5049718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
5050dc3d4743SEduardo Caldas   |     |   `-'char'
5051dc3d4743SEduardo Caldas   |     |-'...'
5052dc3d4743SEduardo Caldas   |     `-')' CloseParen
5053dc3d4743SEduardo Caldas   `-';'
5054dc3d4743SEduardo Caldas )txt"));
5055dc3d4743SEduardo Caldas }
5056dc3d4743SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Cxx_CvQualifiers)5057c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
50584baa163cSEduardo Caldas        ParametersAndQualifiers_InFreeFunctions_Cxx_CvQualifiers) {
5059d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
5060d17437d2SEduardo Caldas     return;
5061d17437d2SEduardo Caldas   }
5062d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5063d17437d2SEduardo Caldas       R"cpp(
50644baa163cSEduardo Caldas int func(const int a, volatile int b, const volatile int c);
5065d17437d2SEduardo Caldas )cpp",
5066d17437d2SEduardo Caldas       R"txt(
50675c11c08dSEduardo Caldas TranslationUnit Detached
5068d17437d2SEduardo Caldas `-SimpleDeclaration
50695c11c08dSEduardo Caldas   |-'int'
50705011d431SEduardo Caldas   |-DeclaratorList Declarators
50715011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
50725c11c08dSEduardo Caldas   |   |-'func'
50734baa163cSEduardo Caldas   |   `-ParametersAndQualifiers
50745c11c08dSEduardo Caldas   |     |-'(' OpenParen
5075718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
5076718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
5077dc3d4743SEduardo Caldas   |     | | |-'const'
5078dc3d4743SEduardo Caldas   |     | | |-'int'
50795011d431SEduardo Caldas   |     | | `-DeclaratorList Declarators
50805011d431SEduardo Caldas   |     | |   `-SimpleDeclarator ListElement
5081dc3d4743SEduardo Caldas   |     | |     `-'a'
5082718e550cSEduardo Caldas   |     | |-',' ListDelimiter
5083718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
5084dc3d4743SEduardo Caldas   |     | | |-'volatile'
5085dc3d4743SEduardo Caldas   |     | | |-'int'
50865011d431SEduardo Caldas   |     | | `-DeclaratorList Declarators
50875011d431SEduardo Caldas   |     | |   `-SimpleDeclarator ListElement
5088dc3d4743SEduardo Caldas   |     | |     `-'b'
5089718e550cSEduardo Caldas   |     | |-',' ListDelimiter
5090718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
50915c11c08dSEduardo Caldas   |     |   |-'const'
50925c11c08dSEduardo Caldas   |     |   |-'volatile'
50935c11c08dSEduardo Caldas   |     |   |-'int'
50945011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
50955011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
50965c11c08dSEduardo Caldas   |     |       `-'c'
50975c11c08dSEduardo Caldas   |     `-')' CloseParen
50985c11c08dSEduardo Caldas   `-';'
50994baa163cSEduardo Caldas )txt"));
51004baa163cSEduardo Caldas }
51014baa163cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Cxx_Ref)5102c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Cxx_Ref) {
51034baa163cSEduardo Caldas   if (!GetParam().isCXX()) {
51044baa163cSEduardo Caldas     return;
51054baa163cSEduardo Caldas   }
51064baa163cSEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
51074baa163cSEduardo Caldas       R"cpp(
51084baa163cSEduardo Caldas int func(int& a);
51094baa163cSEduardo Caldas )cpp",
51104baa163cSEduardo Caldas       R"txt(
51115c11c08dSEduardo Caldas TranslationUnit Detached
51124baa163cSEduardo Caldas `-SimpleDeclaration
51135c11c08dSEduardo Caldas   |-'int'
51145011d431SEduardo Caldas   |-DeclaratorList Declarators
51155011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
51165c11c08dSEduardo Caldas   |   |-'func'
5117d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
51185c11c08dSEduardo Caldas   |     |-'(' OpenParen
5119718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
5120718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
51215c11c08dSEduardo Caldas   |     |   |-'int'
51225011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
51235011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
51245c11c08dSEduardo Caldas   |     |       |-'&'
51255c11c08dSEduardo Caldas   |     |       `-'a'
51265c11c08dSEduardo Caldas   |     `-')' CloseParen
51275c11c08dSEduardo Caldas   `-';'
5128d17437d2SEduardo Caldas )txt"));
5129d17437d2SEduardo Caldas }
5130d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InFreeFunctions_Cxx11_RefRef)5131c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
5132c01d28dcSEduardo Caldas        ParametersAndQualifiers_InFreeFunctions_Cxx11_RefRef) {
5133d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
5134d17437d2SEduardo Caldas     return;
5135d17437d2SEduardo Caldas   }
5136d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5137d17437d2SEduardo Caldas       R"cpp(
51384baa163cSEduardo Caldas int func(int&& a);
5139d17437d2SEduardo Caldas )cpp",
5140d17437d2SEduardo Caldas       R"txt(
51415c11c08dSEduardo Caldas TranslationUnit Detached
5142d17437d2SEduardo Caldas `-SimpleDeclaration
51435c11c08dSEduardo Caldas   |-'int'
51445011d431SEduardo Caldas   |-DeclaratorList Declarators
51455011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
51465c11c08dSEduardo Caldas   |   |-'func'
5147d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
51485c11c08dSEduardo Caldas   |     |-'(' OpenParen
5149718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
5150718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
51515c11c08dSEduardo Caldas   |     |   |-'int'
51525011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
51535011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
51545c11c08dSEduardo Caldas   |     |       |-'&&'
51555c11c08dSEduardo Caldas   |     |       `-'a'
51565c11c08dSEduardo Caldas   |     `-')' CloseParen
51575c11c08dSEduardo Caldas   `-';'
5158d17437d2SEduardo Caldas )txt"));
5159d17437d2SEduardo Caldas }
5160d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InMemberFunctions_Simple)5161c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InMemberFunctions_Simple) {
5162d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
5163d17437d2SEduardo Caldas     return;
5164d17437d2SEduardo Caldas   }
5165d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5166d17437d2SEduardo Caldas       R"cpp(
5167d17437d2SEduardo Caldas struct Test {
5168d17437d2SEduardo Caldas   int a();
5169d17437d2SEduardo Caldas };
5170d17437d2SEduardo Caldas )cpp",
5171d17437d2SEduardo Caldas       R"txt(
51725c11c08dSEduardo Caldas TranslationUnit Detached
5173d17437d2SEduardo Caldas `-SimpleDeclaration
51745c11c08dSEduardo Caldas   |-'struct'
51755c11c08dSEduardo Caldas   |-'Test'
51765c11c08dSEduardo Caldas   |-'{'
5177d17437d2SEduardo Caldas   |-SimpleDeclaration
51785c11c08dSEduardo Caldas   | |-'int'
51795011d431SEduardo Caldas   | |-DeclaratorList Declarators
51805011d431SEduardo Caldas   | | `-SimpleDeclarator ListElement
51815c11c08dSEduardo Caldas   | |   |-'a'
5182d17437d2SEduardo Caldas   | |   `-ParametersAndQualifiers
51835c11c08dSEduardo Caldas   | |     |-'(' OpenParen
51845c11c08dSEduardo Caldas   | |     `-')' CloseParen
51855c11c08dSEduardo Caldas   | `-';'
51865c11c08dSEduardo Caldas   |-'}'
51875c11c08dSEduardo Caldas   `-';'
5188d17437d2SEduardo Caldas )txt"));
5189d17437d2SEduardo Caldas }
5190d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InMemberFunctions_CvQualifiers)5191c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
5192c01d28dcSEduardo Caldas        ParametersAndQualifiers_InMemberFunctions_CvQualifiers) {
51934baa163cSEduardo Caldas   if (!GetParam().isCXX()) {
51944baa163cSEduardo Caldas     return;
51954baa163cSEduardo Caldas   }
51964baa163cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
51974baa163cSEduardo Caldas       R"cpp(
51984baa163cSEduardo Caldas struct Test {
51994baa163cSEduardo Caldas   [[int b() const;]]
52004baa163cSEduardo Caldas   [[int c() volatile;]]
52014baa163cSEduardo Caldas   [[int d() const volatile;]]
52024baa163cSEduardo Caldas };
52034baa163cSEduardo Caldas )cpp",
52044baa163cSEduardo Caldas       {R"txt(
52054baa163cSEduardo Caldas SimpleDeclaration
52065c11c08dSEduardo Caldas |-'int'
52075011d431SEduardo Caldas |-DeclaratorList Declarators
52085011d431SEduardo Caldas | `-SimpleDeclarator ListElement
52095c11c08dSEduardo Caldas |   |-'b'
52104baa163cSEduardo Caldas |   `-ParametersAndQualifiers
52115c11c08dSEduardo Caldas |     |-'(' OpenParen
52125c11c08dSEduardo Caldas |     |-')' CloseParen
52135c11c08dSEduardo Caldas |     `-'const'
52145c11c08dSEduardo Caldas `-';'
52154baa163cSEduardo Caldas )txt",
52164baa163cSEduardo Caldas        R"txt(
52174baa163cSEduardo Caldas SimpleDeclaration
52185c11c08dSEduardo Caldas |-'int'
52195011d431SEduardo Caldas |-DeclaratorList Declarators
52205011d431SEduardo Caldas | `-SimpleDeclarator ListElement
52215c11c08dSEduardo Caldas |   |-'c'
52224baa163cSEduardo Caldas |   `-ParametersAndQualifiers
52235c11c08dSEduardo Caldas |     |-'(' OpenParen
52245c11c08dSEduardo Caldas |     |-')' CloseParen
52255c11c08dSEduardo Caldas |     `-'volatile'
52265c11c08dSEduardo Caldas `-';'
52274baa163cSEduardo Caldas )txt",
52284baa163cSEduardo Caldas        R"txt(
52294baa163cSEduardo Caldas SimpleDeclaration
52305c11c08dSEduardo Caldas |-'int'
52315011d431SEduardo Caldas |-DeclaratorList Declarators
52325011d431SEduardo Caldas | `-SimpleDeclarator ListElement
52335c11c08dSEduardo Caldas |   |-'d'
52344baa163cSEduardo Caldas |   `-ParametersAndQualifiers
52355c11c08dSEduardo Caldas |     |-'(' OpenParen
52365c11c08dSEduardo Caldas |     |-')' CloseParen
52375c11c08dSEduardo Caldas |     |-'const'
52385c11c08dSEduardo Caldas |     `-'volatile'
52395c11c08dSEduardo Caldas `-';'
52404baa163cSEduardo Caldas )txt"}));
52414baa163cSEduardo Caldas }
52424baa163cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InMemberFunctions_Ref)5243c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InMemberFunctions_Ref) {
52443b75f65eSEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
52454baa163cSEduardo Caldas     return;
52464baa163cSEduardo Caldas   }
52474baa163cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
52484baa163cSEduardo Caldas       R"cpp(
52494baa163cSEduardo Caldas struct Test {
52504baa163cSEduardo Caldas   [[int e() &;]]
52514baa163cSEduardo Caldas };
52524baa163cSEduardo Caldas )cpp",
52534baa163cSEduardo Caldas       {R"txt(
52544baa163cSEduardo Caldas SimpleDeclaration
52555c11c08dSEduardo Caldas |-'int'
52565011d431SEduardo Caldas |-DeclaratorList Declarators
52575011d431SEduardo Caldas | `-SimpleDeclarator ListElement
52585c11c08dSEduardo Caldas |   |-'e'
52594baa163cSEduardo Caldas |   `-ParametersAndQualifiers
52605c11c08dSEduardo Caldas |     |-'(' OpenParen
52615c11c08dSEduardo Caldas |     |-')' CloseParen
52625c11c08dSEduardo Caldas |     `-'&'
52635c11c08dSEduardo Caldas `-';'
52644baa163cSEduardo Caldas )txt"}));
52654baa163cSEduardo Caldas }
52664baa163cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ParametersAndQualifiers_InMemberFunctions_RefRef)5267c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InMemberFunctions_RefRef) {
52684baa163cSEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
52694baa163cSEduardo Caldas     return;
52704baa163cSEduardo Caldas   }
52714baa163cSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
52724baa163cSEduardo Caldas       R"cpp(
52734baa163cSEduardo Caldas struct Test {
52744baa163cSEduardo Caldas   [[int f() &&;]]
52754baa163cSEduardo Caldas };
52764baa163cSEduardo Caldas )cpp",
52774baa163cSEduardo Caldas       {R"txt(
52784baa163cSEduardo Caldas SimpleDeclaration
52795c11c08dSEduardo Caldas |-'int'
52805011d431SEduardo Caldas |-DeclaratorList Declarators
52815011d431SEduardo Caldas | `-SimpleDeclarator ListElement
52825c11c08dSEduardo Caldas |   |-'f'
52834baa163cSEduardo Caldas |   `-ParametersAndQualifiers
52845c11c08dSEduardo Caldas |     |-'(' OpenParen
52855c11c08dSEduardo Caldas |     |-')' CloseParen
52865c11c08dSEduardo Caldas |     `-'&&'
52875c11c08dSEduardo Caldas `-';'
52884baa163cSEduardo Caldas )txt"}));
52894baa163cSEduardo Caldas }
52904baa163cSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,TrailingReturn)5291c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, TrailingReturn) {
5292d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
5293d17437d2SEduardo Caldas     return;
5294d17437d2SEduardo Caldas   }
5295d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5296d17437d2SEduardo Caldas       R"cpp(
5297d17437d2SEduardo Caldas auto foo() -> int;
5298d17437d2SEduardo Caldas )cpp",
5299d17437d2SEduardo Caldas       R"txt(
53005c11c08dSEduardo Caldas TranslationUnit Detached
5301d17437d2SEduardo Caldas `-SimpleDeclaration
53025c11c08dSEduardo Caldas   |-'auto'
53035011d431SEduardo Caldas   |-DeclaratorList Declarators
53045011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
53055c11c08dSEduardo Caldas   |   |-'foo'
5306d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
53075c11c08dSEduardo Caldas   |     |-'(' OpenParen
53085c11c08dSEduardo Caldas   |     |-')' CloseParen
5309718e550cSEduardo Caldas   |     `-TrailingReturnType TrailingReturn
53105c11c08dSEduardo Caldas   |       |-'->' ArrowToken
53115c11c08dSEduardo Caldas   |       `-'int'
53125c11c08dSEduardo Caldas   `-';'
5313d17437d2SEduardo Caldas )txt"));
5314d17437d2SEduardo Caldas }
5315d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,DynamicExceptionSpecification)5316c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, DynamicExceptionSpecification) {
5317d17437d2SEduardo Caldas   if (!GetParam().supportsCXXDynamicExceptionSpecification()) {
5318d17437d2SEduardo Caldas     return;
5319d17437d2SEduardo Caldas   }
5320235f9f7fSEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
5321d17437d2SEduardo Caldas       R"cpp(
5322d17437d2SEduardo Caldas struct MyException1 {};
5323d17437d2SEduardo Caldas struct MyException2 {};
5324235f9f7fSEduardo Caldas [[int a() throw();]]
5325235f9f7fSEduardo Caldas [[int b() throw(...);]]
5326235f9f7fSEduardo Caldas [[int c() throw(MyException1);]]
5327235f9f7fSEduardo Caldas [[int d() throw(MyException1, MyException2);]]
5328d17437d2SEduardo Caldas )cpp",
5329235f9f7fSEduardo Caldas       {R"txt(
5330235f9f7fSEduardo Caldas SimpleDeclaration
53315c11c08dSEduardo Caldas |-'int'
53325011d431SEduardo Caldas |-DeclaratorList Declarators
53335011d431SEduardo Caldas | `-SimpleDeclarator ListElement
53345c11c08dSEduardo Caldas |   |-'a'
5335235f9f7fSEduardo Caldas |   `-ParametersAndQualifiers
53365c11c08dSEduardo Caldas |     |-'(' OpenParen
53375c11c08dSEduardo Caldas |     |-')' CloseParen
53385c11c08dSEduardo Caldas |     |-'throw'
53395c11c08dSEduardo Caldas |     |-'('
53405c11c08dSEduardo Caldas |     `-')'
53415c11c08dSEduardo Caldas `-';'
5342235f9f7fSEduardo Caldas )txt",
5343d17437d2SEduardo Caldas        R"txt(
5344235f9f7fSEduardo Caldas SimpleDeclaration
53455c11c08dSEduardo Caldas |-'int'
53465011d431SEduardo Caldas |-DeclaratorList Declarators
53475011d431SEduardo Caldas | `-SimpleDeclarator ListElement
53485c11c08dSEduardo Caldas |   |-'b'
5349235f9f7fSEduardo Caldas |   `-ParametersAndQualifiers
53505c11c08dSEduardo Caldas |     |-'(' OpenParen
53515c11c08dSEduardo Caldas |     |-')' CloseParen
53525c11c08dSEduardo Caldas |     |-'throw'
53535c11c08dSEduardo Caldas |     |-'('
53545c11c08dSEduardo Caldas |     |-'...'
53555c11c08dSEduardo Caldas |     `-')'
53565c11c08dSEduardo Caldas `-';'
5357235f9f7fSEduardo Caldas )txt",
5358235f9f7fSEduardo Caldas        R"txt(
5359235f9f7fSEduardo Caldas SimpleDeclaration
53605c11c08dSEduardo Caldas |-'int'
53615011d431SEduardo Caldas |-DeclaratorList Declarators
53625011d431SEduardo Caldas | `-SimpleDeclarator ListElement
53635c11c08dSEduardo Caldas |   |-'c'
5364235f9f7fSEduardo Caldas |   `-ParametersAndQualifiers
53655c11c08dSEduardo Caldas |     |-'(' OpenParen
53665c11c08dSEduardo Caldas |     |-')' CloseParen
53675c11c08dSEduardo Caldas |     |-'throw'
53685c11c08dSEduardo Caldas |     |-'('
53695c11c08dSEduardo Caldas |     |-'MyException1'
53705c11c08dSEduardo Caldas |     `-')'
53715c11c08dSEduardo Caldas `-';'
5372235f9f7fSEduardo Caldas )txt",
5373235f9f7fSEduardo Caldas        R"txt(
5374235f9f7fSEduardo Caldas SimpleDeclaration
53755c11c08dSEduardo Caldas |-'int'
53765011d431SEduardo Caldas |-DeclaratorList Declarators
53775011d431SEduardo Caldas | `-SimpleDeclarator ListElement
53785c11c08dSEduardo Caldas |   |-'d'
5379d17437d2SEduardo Caldas |   `-ParametersAndQualifiers
53805c11c08dSEduardo Caldas |     |-'(' OpenParen
53815c11c08dSEduardo Caldas |     |-')' CloseParen
53825c11c08dSEduardo Caldas |     |-'throw'
53835c11c08dSEduardo Caldas |     |-'('
53845c11c08dSEduardo Caldas |     |-'MyException1'
53855c11c08dSEduardo Caldas |     |-','
53865c11c08dSEduardo Caldas |     |-'MyException2'
53875c11c08dSEduardo Caldas |     `-')'
53885c11c08dSEduardo Caldas `-';'
5389235f9f7fSEduardo Caldas )txt"}));
5390d17437d2SEduardo Caldas }
5391d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,NoexceptExceptionSpecification)5392c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, NoexceptExceptionSpecification) {
5393d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
5394d17437d2SEduardo Caldas     return;
5395d17437d2SEduardo Caldas   }
5396d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5397d17437d2SEduardo Caldas       R"cpp(
5398d17437d2SEduardo Caldas int a() noexcept;
5399d17437d2SEduardo Caldas int b() noexcept(true);
5400d17437d2SEduardo Caldas )cpp",
5401d17437d2SEduardo Caldas       R"txt(
54025c11c08dSEduardo Caldas TranslationUnit Detached
5403d17437d2SEduardo Caldas |-SimpleDeclaration
54045c11c08dSEduardo Caldas | |-'int'
54055011d431SEduardo Caldas | |-DeclaratorList Declarators
54065011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
54075c11c08dSEduardo Caldas | |   |-'a'
5408d17437d2SEduardo Caldas | |   `-ParametersAndQualifiers
54095c11c08dSEduardo Caldas | |     |-'(' OpenParen
54105c11c08dSEduardo Caldas | |     |-')' CloseParen
54115c11c08dSEduardo Caldas | |     `-'noexcept'
54125c11c08dSEduardo Caldas | `-';'
5413d17437d2SEduardo Caldas `-SimpleDeclaration
54145c11c08dSEduardo Caldas   |-'int'
54155011d431SEduardo Caldas   |-DeclaratorList Declarators
54165011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
54175c11c08dSEduardo Caldas   |   |-'b'
5418d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
54195c11c08dSEduardo Caldas   |     |-'(' OpenParen
54205c11c08dSEduardo Caldas   |     |-')' CloseParen
54215c11c08dSEduardo Caldas   |     |-'noexcept'
54225c11c08dSEduardo Caldas   |     |-'('
5423d17437d2SEduardo Caldas   |     |-BoolLiteralExpression
54245c11c08dSEduardo Caldas   |     | `-'true' LiteralToken
54255c11c08dSEduardo Caldas   |     `-')'
54265c11c08dSEduardo Caldas   `-';'
5427d17437d2SEduardo Caldas )txt"));
5428d17437d2SEduardo Caldas }
5429d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,DeclaratorsInParentheses)5430c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, DeclaratorsInParentheses) {
5431d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5432d17437d2SEduardo Caldas       R"cpp(
5433d17437d2SEduardo Caldas int (a);
5434d17437d2SEduardo Caldas int *(b);
5435d17437d2SEduardo Caldas int (*c)(int);
5436d17437d2SEduardo Caldas int *(d)(int);
5437d17437d2SEduardo Caldas )cpp",
5438d17437d2SEduardo Caldas       R"txt(
54395c11c08dSEduardo Caldas TranslationUnit Detached
5440d17437d2SEduardo Caldas |-SimpleDeclaration
54415c11c08dSEduardo Caldas | |-'int'
54425011d431SEduardo Caldas | |-DeclaratorList Declarators
54435011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
5444d17437d2SEduardo Caldas | |   `-ParenDeclarator
54455c11c08dSEduardo Caldas | |     |-'(' OpenParen
54465c11c08dSEduardo Caldas | |     |-'a'
54475c11c08dSEduardo Caldas | |     `-')' CloseParen
54485c11c08dSEduardo Caldas | `-';'
5449d17437d2SEduardo Caldas |-SimpleDeclaration
54505c11c08dSEduardo Caldas | |-'int'
54515011d431SEduardo Caldas | |-DeclaratorList Declarators
54525011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
54535c11c08dSEduardo Caldas | |   |-'*'
5454d17437d2SEduardo Caldas | |   `-ParenDeclarator
54555c11c08dSEduardo Caldas | |     |-'(' OpenParen
54565c11c08dSEduardo Caldas | |     |-'b'
54575c11c08dSEduardo Caldas | |     `-')' CloseParen
54585c11c08dSEduardo Caldas | `-';'
5459d17437d2SEduardo Caldas |-SimpleDeclaration
54605c11c08dSEduardo Caldas | |-'int'
54615011d431SEduardo Caldas | |-DeclaratorList Declarators
54625011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
5463d17437d2SEduardo Caldas | |   |-ParenDeclarator
54645c11c08dSEduardo Caldas | |   | |-'(' OpenParen
54655c11c08dSEduardo Caldas | |   | |-'*'
54665c11c08dSEduardo Caldas | |   | |-'c'
54675c11c08dSEduardo Caldas | |   | `-')' CloseParen
5468d17437d2SEduardo Caldas | |   `-ParametersAndQualifiers
54695c11c08dSEduardo Caldas | |     |-'(' OpenParen
5470718e550cSEduardo Caldas | |     |-ParameterDeclarationList Parameters
5471718e550cSEduardo Caldas | |     | `-SimpleDeclaration ListElement
54725c11c08dSEduardo Caldas | |     |   `-'int'
54735c11c08dSEduardo Caldas | |     `-')' CloseParen
54745c11c08dSEduardo Caldas | `-';'
5475d17437d2SEduardo Caldas `-SimpleDeclaration
54765c11c08dSEduardo Caldas   |-'int'
54775011d431SEduardo Caldas   |-DeclaratorList Declarators
54785011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
54795c11c08dSEduardo Caldas   |   |-'*'
5480d17437d2SEduardo Caldas   |   |-ParenDeclarator
54815c11c08dSEduardo Caldas   |   | |-'(' OpenParen
54825c11c08dSEduardo Caldas   |   | |-'d'
54835c11c08dSEduardo Caldas   |   | `-')' CloseParen
5484d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
54855c11c08dSEduardo Caldas   |     |-'(' OpenParen
5486718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
5487718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
54885c11c08dSEduardo Caldas   |     |   `-'int'
54895c11c08dSEduardo Caldas   |     `-')' CloseParen
54905c11c08dSEduardo Caldas   `-';'
5491d17437d2SEduardo Caldas )txt"));
5492d17437d2SEduardo Caldas }
5493d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Declaration_ConstVolatileQualifiers_SimpleConst)5494c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Declaration_ConstVolatileQualifiers_SimpleConst) {
5495d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5496d17437d2SEduardo Caldas       R"cpp(
5497d17437d2SEduardo Caldas const int west = -1;
5498d17437d2SEduardo Caldas int const east = 1;
5499d17437d2SEduardo Caldas )cpp",
5500d17437d2SEduardo Caldas       R"txt(
55015c11c08dSEduardo Caldas TranslationUnit Detached
5502d17437d2SEduardo Caldas |-SimpleDeclaration
55035c11c08dSEduardo Caldas | |-'const'
55045c11c08dSEduardo Caldas | |-'int'
55055011d431SEduardo Caldas | |-DeclaratorList Declarators
55065011d431SEduardo Caldas | | `-SimpleDeclarator ListElement
55075c11c08dSEduardo Caldas | |   |-'west'
55085c11c08dSEduardo Caldas | |   |-'='
5509d17437d2SEduardo Caldas | |   `-PrefixUnaryOperatorExpression
5510718e550cSEduardo Caldas | |     |-'-' OperatorToken
5511718e550cSEduardo Caldas | |     `-IntegerLiteralExpression Operand
55125c11c08dSEduardo Caldas | |       `-'1' LiteralToken
55135c11c08dSEduardo Caldas | `-';'
5514b493e4cbSEduardo Caldas `-SimpleDeclaration
55155c11c08dSEduardo Caldas   |-'int'
55165c11c08dSEduardo Caldas   |-'const'
55175011d431SEduardo Caldas   |-DeclaratorList Declarators
55185011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
55195c11c08dSEduardo Caldas   |   |-'east'
55205c11c08dSEduardo Caldas   |   |-'='
5521b493e4cbSEduardo Caldas   |   `-IntegerLiteralExpression
55225c11c08dSEduardo Caldas   |     `-'1' LiteralToken
55235c11c08dSEduardo Caldas   `-';'
5524b493e4cbSEduardo Caldas )txt"));
5525b493e4cbSEduardo Caldas }
5526b493e4cbSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Declaration_ConstVolatileQualifiers_MultipleConst)5527c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, Declaration_ConstVolatileQualifiers_MultipleConst) {
5528b493e4cbSEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5529b493e4cbSEduardo Caldas       R"cpp(
5530b493e4cbSEduardo Caldas const int const universal = 0;
5531b493e4cbSEduardo Caldas )cpp",
5532b493e4cbSEduardo Caldas       R"txt(
55335c11c08dSEduardo Caldas TranslationUnit Detached
5534b493e4cbSEduardo Caldas `-SimpleDeclaration
55355c11c08dSEduardo Caldas   |-'const'
55365c11c08dSEduardo Caldas   |-'int'
55375c11c08dSEduardo Caldas   |-'const'
55385011d431SEduardo Caldas   |-DeclaratorList Declarators
55395011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
55405c11c08dSEduardo Caldas   |   |-'universal'
55415c11c08dSEduardo Caldas   |   |-'='
5542b493e4cbSEduardo Caldas   |   `-IntegerLiteralExpression
55435c11c08dSEduardo Caldas   |     `-'0' LiteralToken
55445c11c08dSEduardo Caldas   `-';'
5545b493e4cbSEduardo Caldas )txt"));
5546b493e4cbSEduardo Caldas }
5547b493e4cbSEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,Declaration_ConstVolatileQualifiers_ConstAndVolatile)5548c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest,
5549c01d28dcSEduardo Caldas        Declaration_ConstVolatileQualifiers_ConstAndVolatile) {
5550b493e4cbSEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5551b493e4cbSEduardo Caldas       R"cpp(
5552b493e4cbSEduardo Caldas const int const *const *volatile b;
5553b493e4cbSEduardo Caldas )cpp",
5554b493e4cbSEduardo Caldas       R"txt(
55555c11c08dSEduardo Caldas TranslationUnit Detached
5556d17437d2SEduardo Caldas `-SimpleDeclaration
55575c11c08dSEduardo Caldas   |-'const'
55585c11c08dSEduardo Caldas   |-'int'
55595c11c08dSEduardo Caldas   |-'const'
55605011d431SEduardo Caldas   |-DeclaratorList Declarators
55615011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
55625c11c08dSEduardo Caldas   |   |-'*'
55635c11c08dSEduardo Caldas   |   |-'const'
55645c11c08dSEduardo Caldas   |   |-'*'
55655c11c08dSEduardo Caldas   |   |-'volatile'
55665c11c08dSEduardo Caldas   |   `-'b'
55675c11c08dSEduardo Caldas   `-';'
5568d17437d2SEduardo Caldas )txt"));
5569d17437d2SEduardo Caldas }
5570d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,RangesOfDeclaratorsWithTrailingReturnTypes)5571c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, RangesOfDeclaratorsWithTrailingReturnTypes) {
5572d17437d2SEduardo Caldas   if (!GetParam().isCXX11OrLater()) {
5573d17437d2SEduardo Caldas     return;
5574d17437d2SEduardo Caldas   }
5575d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5576d17437d2SEduardo Caldas       R"cpp(
5577d17437d2SEduardo Caldas auto foo() -> auto(*)(int) -> double*;
5578d17437d2SEduardo Caldas )cpp",
5579d17437d2SEduardo Caldas       R"txt(
55805c11c08dSEduardo Caldas TranslationUnit Detached
5581d17437d2SEduardo Caldas `-SimpleDeclaration
55825c11c08dSEduardo Caldas   |-'auto'
55835011d431SEduardo Caldas   |-DeclaratorList Declarators
55845011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
55855c11c08dSEduardo Caldas   |   |-'foo'
5586d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
55875c11c08dSEduardo Caldas   |     |-'(' OpenParen
55885c11c08dSEduardo Caldas   |     |-')' CloseParen
5589718e550cSEduardo Caldas   |     `-TrailingReturnType TrailingReturn
55905c11c08dSEduardo Caldas   |       |-'->' ArrowToken
55915c11c08dSEduardo Caldas   |       |-'auto'
5592718e550cSEduardo Caldas   |       `-SimpleDeclarator Declarator
5593d17437d2SEduardo Caldas   |         |-ParenDeclarator
55945c11c08dSEduardo Caldas   |         | |-'(' OpenParen
55955c11c08dSEduardo Caldas   |         | |-'*'
55965c11c08dSEduardo Caldas   |         | `-')' CloseParen
5597d17437d2SEduardo Caldas   |         `-ParametersAndQualifiers
55985c11c08dSEduardo Caldas   |           |-'(' OpenParen
5599718e550cSEduardo Caldas   |           |-ParameterDeclarationList Parameters
5600718e550cSEduardo Caldas   |           | `-SimpleDeclaration ListElement
56015c11c08dSEduardo Caldas   |           |   `-'int'
56025c11c08dSEduardo Caldas   |           |-')' CloseParen
5603718e550cSEduardo Caldas   |           `-TrailingReturnType TrailingReturn
56045c11c08dSEduardo Caldas   |             |-'->' ArrowToken
56055c11c08dSEduardo Caldas   |             |-'double'
5606718e550cSEduardo Caldas   |             `-SimpleDeclarator Declarator
56075c11c08dSEduardo Caldas   |               `-'*'
56085c11c08dSEduardo Caldas   `-';'
5609d17437d2SEduardo Caldas )txt"));
5610d17437d2SEduardo Caldas }
5611d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberPointers)5612c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberPointers) {
5613d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
5614d17437d2SEduardo Caldas     return;
5615d17437d2SEduardo Caldas   }
561661273f29SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
5617d17437d2SEduardo Caldas       R"cpp(
5618d17437d2SEduardo Caldas struct X {};
561961273f29SEduardo Caldas [[int X::* a;]]
562061273f29SEduardo Caldas [[const int X::* b;]]
5621d17437d2SEduardo Caldas )cpp",
562261273f29SEduardo Caldas       {R"txt(
562361273f29SEduardo Caldas SimpleDeclaration
56245c11c08dSEduardo Caldas |-'int'
56255011d431SEduardo Caldas |-DeclaratorList Declarators
56265011d431SEduardo Caldas | `-SimpleDeclarator ListElement
562761273f29SEduardo Caldas |   |-MemberPointer
56285c11c08dSEduardo Caldas |   | |-'X'
56295c11c08dSEduardo Caldas |   | |-'::'
56305c11c08dSEduardo Caldas |   | `-'*'
56315c11c08dSEduardo Caldas |   `-'a'
56325c11c08dSEduardo Caldas `-';'
563361273f29SEduardo Caldas )txt",
5634d17437d2SEduardo Caldas        R"txt(
563561273f29SEduardo Caldas SimpleDeclaration
56365c11c08dSEduardo Caldas |-'const'
56375c11c08dSEduardo Caldas |-'int'
56385011d431SEduardo Caldas |-DeclaratorList Declarators
56395011d431SEduardo Caldas | `-SimpleDeclarator ListElement
5640d17437d2SEduardo Caldas |   |-MemberPointer
56415c11c08dSEduardo Caldas |   | |-'X'
56425c11c08dSEduardo Caldas |   | |-'::'
56435c11c08dSEduardo Caldas |   | `-'*'
56445c11c08dSEduardo Caldas |   `-'b'
56455c11c08dSEduardo Caldas `-';'
564661273f29SEduardo Caldas )txt"}));
5647d17437d2SEduardo Caldas }
5648d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,MemberFunctionPointer)5649c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, MemberFunctionPointer) {
5650d17437d2SEduardo Caldas   if (!GetParam().isCXX()) {
5651d17437d2SEduardo Caldas     return;
5652d17437d2SEduardo Caldas   }
565361273f29SEduardo Caldas   EXPECT_TRUE(treeDumpEqualOnAnnotations(
5654d17437d2SEduardo Caldas       R"cpp(
5655d17437d2SEduardo Caldas struct X {
5656d17437d2SEduardo Caldas   struct Y {};
5657d17437d2SEduardo Caldas };
565861273f29SEduardo Caldas [[void (X::*xp)();]]
565961273f29SEduardo Caldas [[void (X::**xpp)(const int*);]]
5660d17437d2SEduardo Caldas // FIXME: Generate the right syntax tree for this type,
5661d17437d2SEduardo Caldas // i.e. create a syntax node for the outer member pointer
566261273f29SEduardo Caldas [[void (X::Y::*xyp)(const int*, char);]]
5663d17437d2SEduardo Caldas )cpp",
566461273f29SEduardo Caldas       {R"txt(
566561273f29SEduardo Caldas SimpleDeclaration
56665c11c08dSEduardo Caldas |-'void'
56675011d431SEduardo Caldas |-DeclaratorList Declarators
56685011d431SEduardo Caldas | `-SimpleDeclarator ListElement
566961273f29SEduardo Caldas |   |-ParenDeclarator
56705c11c08dSEduardo Caldas |   | |-'(' OpenParen
567161273f29SEduardo Caldas |   | |-MemberPointer
56725c11c08dSEduardo Caldas |   | | |-'X'
56735c11c08dSEduardo Caldas |   | | |-'::'
56745c11c08dSEduardo Caldas |   | | `-'*'
56755c11c08dSEduardo Caldas |   | |-'xp'
56765c11c08dSEduardo Caldas |   | `-')' CloseParen
567761273f29SEduardo Caldas |   `-ParametersAndQualifiers
56785c11c08dSEduardo Caldas |     |-'(' OpenParen
56795c11c08dSEduardo Caldas |     `-')' CloseParen
56805c11c08dSEduardo Caldas `-';'
568161273f29SEduardo Caldas )txt",
568261273f29SEduardo Caldas        R"txt(
568361273f29SEduardo Caldas SimpleDeclaration
56845c11c08dSEduardo Caldas |-'void'
56855011d431SEduardo Caldas |-DeclaratorList Declarators
56865011d431SEduardo Caldas | `-SimpleDeclarator ListElement
568761273f29SEduardo Caldas |   |-ParenDeclarator
56885c11c08dSEduardo Caldas |   | |-'(' OpenParen
568961273f29SEduardo Caldas |   | |-MemberPointer
56905c11c08dSEduardo Caldas |   | | |-'X'
56915c11c08dSEduardo Caldas |   | | |-'::'
56925c11c08dSEduardo Caldas |   | | `-'*'
56935c11c08dSEduardo Caldas |   | |-'*'
56945c11c08dSEduardo Caldas |   | |-'xpp'
56955c11c08dSEduardo Caldas |   | `-')' CloseParen
569661273f29SEduardo Caldas |   `-ParametersAndQualifiers
56975c11c08dSEduardo Caldas |     |-'(' OpenParen
5698718e550cSEduardo Caldas |     |-ParameterDeclarationList Parameters
5699718e550cSEduardo Caldas |     | `-SimpleDeclaration ListElement
57005c11c08dSEduardo Caldas |     |   |-'const'
57015c11c08dSEduardo Caldas |     |   |-'int'
57025011d431SEduardo Caldas |     |   `-DeclaratorList Declarators
57035011d431SEduardo Caldas |     |     `-SimpleDeclarator ListElement
57045c11c08dSEduardo Caldas |     |       `-'*'
57055c11c08dSEduardo Caldas |     `-')' CloseParen
57065c11c08dSEduardo Caldas `-';'
570761273f29SEduardo Caldas )txt",
570861273f29SEduardo Caldas        R"txt(
570961273f29SEduardo Caldas SimpleDeclaration
57105c11c08dSEduardo Caldas |-'void'
57115011d431SEduardo Caldas |-DeclaratorList Declarators
57125011d431SEduardo Caldas | `-SimpleDeclarator ListElement
5713d17437d2SEduardo Caldas |   |-ParenDeclarator
57145c11c08dSEduardo Caldas |   | |-'(' OpenParen
57155c11c08dSEduardo Caldas |   | |-'X'
57165c11c08dSEduardo Caldas |   | |-'::'
5717d17437d2SEduardo Caldas |   | |-MemberPointer
57185c11c08dSEduardo Caldas |   | | |-'Y'
57195c11c08dSEduardo Caldas |   | | |-'::'
57205c11c08dSEduardo Caldas |   | | `-'*'
57215c11c08dSEduardo Caldas |   | |-'xyp'
57225c11c08dSEduardo Caldas |   | `-')' CloseParen
5723d17437d2SEduardo Caldas |   `-ParametersAndQualifiers
57245c11c08dSEduardo Caldas |     |-'(' OpenParen
5725718e550cSEduardo Caldas |     |-ParameterDeclarationList Parameters
5726718e550cSEduardo Caldas |     | |-SimpleDeclaration ListElement
5727dc3d4743SEduardo Caldas |     | | |-'const'
5728dc3d4743SEduardo Caldas |     | | |-'int'
57295011d431SEduardo Caldas |     | | `-DeclaratorList Declarators
57305011d431SEduardo Caldas |     | |   `-SimpleDeclarator ListElement
5731dc3d4743SEduardo Caldas |     | |     `-'*'
5732718e550cSEduardo Caldas |     | |-',' ListDelimiter
5733718e550cSEduardo Caldas |     | `-SimpleDeclaration ListElement
57345c11c08dSEduardo Caldas |     |   `-'char'
57355c11c08dSEduardo Caldas |     `-')' CloseParen
57365c11c08dSEduardo Caldas `-';'
573761273f29SEduardo Caldas )txt"}));
5738d17437d2SEduardo Caldas }
5739d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ComplexDeclarator)5740c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ComplexDeclarator) {
5741d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5742d17437d2SEduardo Caldas       R"cpp(
5743d17437d2SEduardo Caldas void x(char a, short (*b)(int));
5744d17437d2SEduardo Caldas )cpp",
5745d17437d2SEduardo Caldas       R"txt(
57465c11c08dSEduardo Caldas TranslationUnit Detached
5747d17437d2SEduardo Caldas `-SimpleDeclaration
57485c11c08dSEduardo Caldas   |-'void'
57495011d431SEduardo Caldas   |-DeclaratorList Declarators
57505011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
57515c11c08dSEduardo Caldas   |   |-'x'
5752d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
57535c11c08dSEduardo Caldas   |     |-'(' OpenParen
5754718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
5755718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
5756dc3d4743SEduardo Caldas   |     | | |-'char'
57575011d431SEduardo Caldas   |     | | `-DeclaratorList Declarators
57585011d431SEduardo Caldas   |     | |   `-SimpleDeclarator ListElement
5759dc3d4743SEduardo Caldas   |     | |     `-'a'
5760718e550cSEduardo Caldas   |     | |-',' ListDelimiter
5761718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
57625c11c08dSEduardo Caldas   |     |   |-'short'
57635011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
57645011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
5765d17437d2SEduardo Caldas   |     |       |-ParenDeclarator
57665c11c08dSEduardo Caldas   |     |       | |-'(' OpenParen
57675c11c08dSEduardo Caldas   |     |       | |-'*'
57685c11c08dSEduardo Caldas   |     |       | |-'b'
57695c11c08dSEduardo Caldas   |     |       | `-')' CloseParen
5770d17437d2SEduardo Caldas   |     |       `-ParametersAndQualifiers
57715c11c08dSEduardo Caldas   |     |         |-'(' OpenParen
5772718e550cSEduardo Caldas   |     |         |-ParameterDeclarationList Parameters
5773718e550cSEduardo Caldas   |     |         | `-SimpleDeclaration ListElement
57745c11c08dSEduardo Caldas   |     |         |   `-'int'
57755c11c08dSEduardo Caldas   |     |         `-')' CloseParen
57765c11c08dSEduardo Caldas   |     `-')' CloseParen
57775c11c08dSEduardo Caldas   `-';'
5778d17437d2SEduardo Caldas )txt"));
5779d17437d2SEduardo Caldas }
5780d17437d2SEduardo Caldas 
TEST_P(BuildSyntaxTreeTest,ComplexDeclarator2)5781c01d28dcSEduardo Caldas TEST_P(BuildSyntaxTreeTest, ComplexDeclarator2) {
5782d17437d2SEduardo Caldas   EXPECT_TRUE(treeDumpEqual(
5783d17437d2SEduardo Caldas       R"cpp(
5784d17437d2SEduardo Caldas void x(char a, short (*b)(int), long (**c)(long long));
5785d17437d2SEduardo Caldas )cpp",
5786d17437d2SEduardo Caldas       R"txt(
57875c11c08dSEduardo Caldas TranslationUnit Detached
5788d17437d2SEduardo Caldas `-SimpleDeclaration
57895c11c08dSEduardo Caldas   |-'void'
57905011d431SEduardo Caldas   |-DeclaratorList Declarators
57915011d431SEduardo Caldas   | `-SimpleDeclarator ListElement
57925c11c08dSEduardo Caldas   |   |-'x'
5793d17437d2SEduardo Caldas   |   `-ParametersAndQualifiers
57945c11c08dSEduardo Caldas   |     |-'(' OpenParen
5795718e550cSEduardo Caldas   |     |-ParameterDeclarationList Parameters
5796718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
5797dc3d4743SEduardo Caldas   |     | | |-'char'
57985011d431SEduardo Caldas   |     | | `-DeclaratorList Declarators
57995011d431SEduardo Caldas   |     | |   `-SimpleDeclarator ListElement
5800dc3d4743SEduardo Caldas   |     | |     `-'a'
5801718e550cSEduardo Caldas   |     | |-',' ListDelimiter
5802718e550cSEduardo Caldas   |     | |-SimpleDeclaration ListElement
5803dc3d4743SEduardo Caldas   |     | | |-'short'
58045011d431SEduardo Caldas   |     | | `-DeclaratorList Declarators
58055011d431SEduardo Caldas   |     | |   `-SimpleDeclarator ListElement
5806dc3d4743SEduardo Caldas   |     | |     |-ParenDeclarator
5807dc3d4743SEduardo Caldas   |     | |     | |-'(' OpenParen
5808dc3d4743SEduardo Caldas   |     | |     | |-'*'
5809dc3d4743SEduardo Caldas   |     | |     | |-'b'
5810dc3d4743SEduardo Caldas   |     | |     | `-')' CloseParen
5811dc3d4743SEduardo Caldas   |     | |     `-ParametersAndQualifiers
58125c11c08dSEduardo Caldas   |     | |       |-'(' OpenParen
5813718e550cSEduardo Caldas   |     | |       |-ParameterDeclarationList Parameters
5814718e550cSEduardo Caldas   |     | |       | `-SimpleDeclaration ListElement
5815dc3d4743SEduardo Caldas   |     | |       |   `-'int'
58165c11c08dSEduardo Caldas   |     | |       `-')' CloseParen
5817718e550cSEduardo Caldas   |     | |-',' ListDelimiter
5818718e550cSEduardo Caldas   |     | `-SimpleDeclaration ListElement
58195c11c08dSEduardo Caldas   |     |   |-'long'
58205011d431SEduardo Caldas   |     |   `-DeclaratorList Declarators
58215011d431SEduardo Caldas   |     |     `-SimpleDeclarator ListElement
5822d17437d2SEduardo Caldas   |     |       |-ParenDeclarator
58235c11c08dSEduardo Caldas   |     |       | |-'(' OpenParen
58245c11c08dSEduardo Caldas   |     |       | |-'*'
58255c11c08dSEduardo Caldas   |     |       | |-'*'
58265c11c08dSEduardo Caldas   |     |       | |-'c'
58275c11c08dSEduardo Caldas   |     |       | `-')' CloseParen
5828d17437d2SEduardo Caldas   |     |       `-ParametersAndQualifiers
58295c11c08dSEduardo Caldas   |     |         |-'(' OpenParen
5830718e550cSEduardo Caldas   |     |         |-ParameterDeclarationList Parameters
5831718e550cSEduardo Caldas   |     |         | `-SimpleDeclaration ListElement
58325c11c08dSEduardo Caldas   |     |         |   |-'long'
58335c11c08dSEduardo Caldas   |     |         |   `-'long'
58345c11c08dSEduardo Caldas   |     |         `-')' CloseParen
58355c11c08dSEduardo Caldas   |     `-')' CloseParen
58365c11c08dSEduardo Caldas   `-';'
5837d17437d2SEduardo Caldas )txt"));
5838d17437d2SEduardo Caldas }
5839d17437d2SEduardo Caldas 
5840d17437d2SEduardo Caldas } // namespace
5841