brintos

brintos / llvm-project-archived public Read only

0
0
Text · 117.5 KiB · d58e190 Raw
5841 lines · cpp
1//===- BuildTreeTest.cpp --------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file tests the syntax tree generation from the ClangAST.10//11//===----------------------------------------------------------------------===//12 13#include "TreeTestBase.h"14 15using namespace clang;16using namespace clang::syntax;17 18namespace {19 20class BuildSyntaxTreeTest : public SyntaxTreeTest {21protected:22  ::testing::AssertionResult treeDumpEqual(StringRef Code, StringRef Tree) {23    SCOPED_TRACE(llvm::join(GetParam().getCommandLineArgs(), " "));24 25    auto *Root = buildTree(Code, GetParam());26    auto ErrorOK = errorOK(Code);27    if (!ErrorOK)28      return ErrorOK;29    auto Actual = StringRef(Root->dump(*TM)).trim().str();30    // EXPECT_EQ shows the diff between the two strings if they are different.31    EXPECT_EQ(Tree.trim().str(), Actual);32    if (Actual != Tree.trim().str()) {33      return ::testing::AssertionFailure();34    }35    return ::testing::AssertionSuccess();36  }37 38  ::testing::AssertionResult39  treeDumpEqualOnAnnotations(StringRef CodeWithAnnotations,40                             ArrayRef<StringRef> TreeDumps) {41    SCOPED_TRACE(llvm::join(GetParam().getCommandLineArgs(), " "));42 43    auto AnnotatedCode = llvm::Annotations(CodeWithAnnotations);44    auto *Root = buildTree(AnnotatedCode.code(), GetParam());45 46    auto ErrorOK = errorOK(AnnotatedCode.code());47    if (!ErrorOK)48      return ErrorOK;49 50    auto AnnotatedRanges = AnnotatedCode.ranges();51    if (AnnotatedRanges.size() != TreeDumps.size()) {52      return ::testing::AssertionFailure()53             << "The number of annotated ranges in the source code is "54                "different "55                "to the number of their corresponding tree dumps.";56    }57    bool Failed = false;58    for (unsigned i = 0; i < AnnotatedRanges.size(); i++) {59      auto *AnnotatedNode = nodeByRange(AnnotatedRanges[i], Root);60      assert(AnnotatedNode);61      auto AnnotatedNodeDump =62          StringRef(AnnotatedNode->dump(*TM))63              .trim()64              .str();65      // EXPECT_EQ shows the diff between the two strings if they are different.66      EXPECT_EQ(TreeDumps[i].trim().str(), AnnotatedNodeDump)67          << "Dumps diverged for the code:\n"68          << AnnotatedCode.code().slice(AnnotatedRanges[i].Begin,69                                        AnnotatedRanges[i].End);70      if (AnnotatedNodeDump != TreeDumps[i].trim().str())71        Failed = true;72    }73    return Failed ? ::testing::AssertionFailure()74                  : ::testing::AssertionSuccess();75  }76 77private:78  ::testing::AssertionResult errorOK(StringRef RawCode) {79    if (!RawCode.contains("error-ok")) {80      if (Diags->getClient()->getNumErrors() != 0) {81        return ::testing::AssertionFailure()82               << "Source file has syntax errors (suppress with /*error-ok*/), "83                  "they were printed to the "84                  "test log";85      }86    }87    return ::testing::AssertionSuccess();88  }89};90 91INSTANTIATE_TEST_SUITE_P(92    SyntaxTreeTests, BuildSyntaxTreeTest,93    testing::ValuesIn(allTestClangConfigs()),94    [](const testing::TestParamInfo<TestClangConfig> &Info) {95      return Info.param.toShortString();96    });97 98TEST_P(BuildSyntaxTreeTest, Simple) {99  EXPECT_TRUE(treeDumpEqual(100      R"cpp(101int main() {}102void foo() {}103)cpp",104      R"txt(105TranslationUnit Detached106|-SimpleDeclaration107| |-'int'108| |-DeclaratorList Declarators109| | `-SimpleDeclarator ListElement110| |   |-'main'111| |   `-ParametersAndQualifiers112| |     |-'(' OpenParen113| |     `-')' CloseParen114| `-CompoundStatement115|   |-'{' OpenParen116|   `-'}' CloseParen117`-SimpleDeclaration118  |-'void'119  |-DeclaratorList Declarators120  | `-SimpleDeclarator ListElement121  |   |-'foo'122  |   `-ParametersAndQualifiers123  |     |-'(' OpenParen124  |     `-')' CloseParen125  `-CompoundStatement126    |-'{' OpenParen127    `-'}' CloseParen128)txt"));129}130 131TEST_P(BuildSyntaxTreeTest, SimpleVariable) {132  EXPECT_TRUE(treeDumpEqual(133      R"cpp(134int a;135int b = 42;136)cpp",137      R"txt(138TranslationUnit Detached139|-SimpleDeclaration140| |-'int'141| |-DeclaratorList Declarators142| | `-SimpleDeclarator ListElement143| |   `-'a'144| `-';'145`-SimpleDeclaration146  |-'int'147  |-DeclaratorList Declarators148  | `-SimpleDeclarator ListElement149  |   |-'b'150  |   |-'='151  |   `-IntegerLiteralExpression152  |     `-'42' LiteralToken153  `-';'154)txt"));155}156 157TEST_P(BuildSyntaxTreeTest, SimpleFunction) {158  EXPECT_TRUE(treeDumpEqual(159      R"cpp(160void foo(int a, int b) {}161)cpp",162      R"txt(163TranslationUnit Detached164`-SimpleDeclaration165  |-'void'166  |-DeclaratorList Declarators167  | `-SimpleDeclarator ListElement168  |   |-'foo'169  |   `-ParametersAndQualifiers170  |     |-'(' OpenParen171  |     |-ParameterDeclarationList Parameters172  |     | |-SimpleDeclaration ListElement173  |     | | |-'int'174  |     | | `-DeclaratorList Declarators175  |     | |   `-SimpleDeclarator ListElement176  |     | |     `-'a'177  |     | |-',' ListDelimiter178  |     | `-SimpleDeclaration ListElement179  |     |   |-'int'180  |     |   `-DeclaratorList Declarators181  |     |     `-SimpleDeclarator ListElement182  |     |       `-'b'183  |     `-')' CloseParen184  `-CompoundStatement185    |-'{' OpenParen186    `-'}' CloseParen187)txt"));188}189 190TEST_P(BuildSyntaxTreeTest, Simple_BackslashInsideToken) {191  EXPECT_TRUE(treeDumpEqual(192      R"cpp(193in\194t a;195)cpp",196      R"txt(197TranslationUnit Detached198`-SimpleDeclaration199  |-'in\200t'201  |-DeclaratorList Declarators202  | `-SimpleDeclarator ListElement203  |   `-'a'204  `-';'205)txt"));206}207 208TEST_P(BuildSyntaxTreeTest, If) {209  EXPECT_TRUE(treeDumpEqualOnAnnotations(210      R"cpp(211void test() {212  [[if (1) {}]]213  [[if (1) {} else if (0) {}]]214}215)cpp",216      {R"txt(217IfStatement Statement218|-'if' IntroducerKeyword219|-'('220|-ExpressionStatement Condition221| `-IntegerLiteralExpression Expression222|   `-'1' LiteralToken223|-')'224`-CompoundStatement ThenStatement225  |-'{' OpenParen226  `-'}' CloseParen227  )txt",228       R"txt(229IfStatement Statement230|-'if' IntroducerKeyword231|-'('232|-ExpressionStatement Condition233| `-IntegerLiteralExpression Expression234|   `-'1' LiteralToken235|-')'236|-CompoundStatement ThenStatement237| |-'{' OpenParen238| `-'}' CloseParen239|-'else' ElseKeyword240`-IfStatement ElseStatement241  |-'if' IntroducerKeyword242  |-'('243  |-ExpressionStatement Condition244  | `-IntegerLiteralExpression Expression245  |   `-'0' LiteralToken246  |-')'247  `-CompoundStatement ThenStatement248    |-'{' OpenParen249    `-'}' CloseParen250)txt"}));251}252 253TEST_P(BuildSyntaxTreeTest, IfDecl) {254  if (!GetParam().isCXX17OrLater()) {255    return;256  }257  EXPECT_TRUE(treeDumpEqualOnAnnotations(258      R"cpp(259void test() {260  [[if (int a = 5) {}]]261  [[if (int a; a == 5) {}]]262}263)cpp",264      {R"txt(265IfStatement Statement266|-'if' IntroducerKeyword267|-'('268|-DeclarationStatement Condition269| `-SimpleDeclaration270|   |-'int'271|   `-DeclaratorList Declarators272|     `-SimpleDeclarator ListElement273|       |-'a'274|       |-'='275|       `-IntegerLiteralExpression276|         `-'5' LiteralToken277|-')'278`-CompoundStatement ThenStatement279  |-'{' OpenParen280  `-'}' CloseParen281      )txt",282       R"txt(283IfStatement Statement284|-'if' IntroducerKeyword285|-'('286|-DeclarationStatement287| |-SimpleDeclaration288| | |-'int'289| | `-DeclaratorList Declarators290| |   `-SimpleDeclarator ListElement291| |     `-'a'292| `-';'293|-ExpressionStatement Condition294| `-BinaryOperatorExpression Expression295|   |-IdExpression LeftHandSide296|   | `-UnqualifiedId UnqualifiedId297|   |   `-'a'298|   |-'==' OperatorToken299|   `-IntegerLiteralExpression RightHandSide300|     `-'5' LiteralToken301|-')'302`-CompoundStatement ThenStatement303  |-'{' OpenParen304  `-'}' CloseParen305)txt"}));306}307 308TEST_P(BuildSyntaxTreeTest, For) {309  EXPECT_TRUE(treeDumpEqualOnAnnotations(310      R"cpp(311void test() {312  [[for (;;)  {}]]313}314)cpp",315      {R"txt(316ForStatement Statement317|-'for' IntroducerKeyword318|-'('319|-';'320|-';'321|-')'322`-CompoundStatement BodyStatement323  |-'{' OpenParen324  `-'}' CloseParen325)txt"}));326}327 328TEST_P(BuildSyntaxTreeTest, RangeBasedFor) {329  if (!GetParam().isCXX11OrLater()) {330    return;331  }332  EXPECT_TRUE(treeDumpEqualOnAnnotations(333      R"cpp(334void test() {335  int a[3];336  [[for (int x : a)337    ;]]338}339)cpp",340      {R"txt(341RangeBasedForStatement Statement342|-'for' IntroducerKeyword343|-'('344|-SimpleDeclaration345| |-'int'346| |-DeclaratorList Declarators347| | `-SimpleDeclarator ListElement348| |   `-'x'349| `-':'350|-IdExpression351| `-UnqualifiedId UnqualifiedId352|   `-'a'353|-')'354`-EmptyStatement BodyStatement355  `-';'356)txt"}));357}358 359TEST_P(BuildSyntaxTreeTest, DeclarationStatement) {360  EXPECT_TRUE(treeDumpEqualOnAnnotations(361      R"cpp(362void test() {363  [[int a = 10;]]364}365)cpp",366      {R"txt(367DeclarationStatement Statement368|-SimpleDeclaration369| |-'int'370| `-DeclaratorList Declarators371|   `-SimpleDeclarator ListElement372|     |-'a'373|     |-'='374|     `-IntegerLiteralExpression375|       `-'10' LiteralToken376`-';'377)txt"}));378}379 380TEST_P(BuildSyntaxTreeTest, Switch) {381  EXPECT_TRUE(treeDumpEqualOnAnnotations(382      R"cpp(383void test() {384  [[switch (1) {385    case 0:386    default:;387  }]]388}389)cpp",390      {R"txt(391SwitchStatement Statement392|-'switch' IntroducerKeyword393|-'('394|-IntegerLiteralExpression395| `-'1' LiteralToken396|-')'397`-CompoundStatement BodyStatement398  |-'{' OpenParen399  |-CaseStatement Statement400  | |-'case' IntroducerKeyword401  | |-IntegerLiteralExpression CaseValue402  | | `-'0' LiteralToken403  | |-':'404  | `-DefaultStatement BodyStatement405  |   |-'default' IntroducerKeyword406  |   |-':'407  |   `-EmptyStatement BodyStatement408  |     `-';'409  `-'}' CloseParen410)txt"}));411}412 413TEST_P(BuildSyntaxTreeTest, While) {414  EXPECT_TRUE(treeDumpEqualOnAnnotations(415      R"cpp(416void test() {417  [[while (1) { continue; break; }]]418}419)cpp",420      {R"txt(421WhileStatement Statement422|-'while' IntroducerKeyword423|-'('424|-IntegerLiteralExpression425| `-'1' LiteralToken426|-')'427`-CompoundStatement BodyStatement428  |-'{' OpenParen429  |-ContinueStatement Statement430  | |-'continue' IntroducerKeyword431  | `-';'432  |-BreakStatement Statement433  | |-'break' IntroducerKeyword434  | `-';'435  `-'}' CloseParen436)txt"}));437}438 439TEST_P(BuildSyntaxTreeTest, UnhandledStatement) {440  // Unhandled statements should end up as 'unknown statement'.441  // This example uses a 'label statement', which does not yet have a syntax442  // counterpart.443  EXPECT_TRUE(treeDumpEqualOnAnnotations(444      R"cpp(445int test() {446  [[foo: return 100;]]447}448)cpp",449      {R"txt(450UnknownStatement Statement451|-'foo'452|-':'453`-ReturnStatement454  |-'return' IntroducerKeyword455  |-IntegerLiteralExpression ReturnValue456  | `-'100' LiteralToken457  `-';'458)txt"}));459}460 461TEST_P(BuildSyntaxTreeTest, Expressions) {462  // expressions should be wrapped in 'ExpressionStatement' when they appear463  // in a statement position.464  EXPECT_TRUE(treeDumpEqual(465      R"cpp(466void test() {467  test();468  if (1) test(); else test();469}470)cpp",471      R"txt(472TranslationUnit Detached473`-SimpleDeclaration474  |-'void'475  |-DeclaratorList Declarators476  | `-SimpleDeclarator ListElement477  |   |-'test'478  |   `-ParametersAndQualifiers479  |     |-'(' OpenParen480  |     `-')' CloseParen481  `-CompoundStatement482    |-'{' OpenParen483    |-ExpressionStatement Statement484    | |-CallExpression Expression485    | | |-IdExpression Callee486    | | | `-UnqualifiedId UnqualifiedId487    | | |   `-'test'488    | | |-'(' OpenParen489    | | `-')' CloseParen490    | `-';'491    |-IfStatement Statement492    | |-'if' IntroducerKeyword493    | |-'('494    | |-ExpressionStatement Condition495    | | `-IntegerLiteralExpression Expression496    | |   `-'1' LiteralToken497    | |-')'498    | |-ExpressionStatement ThenStatement499    | | |-CallExpression Expression500    | | | |-IdExpression Callee501    | | | | `-UnqualifiedId UnqualifiedId502    | | | |   `-'test'503    | | | |-'(' OpenParen504    | | | `-')' CloseParen505    | | `-';'506    | |-'else' ElseKeyword507    | `-ExpressionStatement ElseStatement508    |   |-CallExpression Expression509    |   | |-IdExpression Callee510    |   | | `-UnqualifiedId UnqualifiedId511    |   | |   `-'test'512    |   | |-'(' OpenParen513    |   | `-')' CloseParen514    |   `-';'515    `-'}' CloseParen516)txt"));517}518 519TEST_P(BuildSyntaxTreeTest, ConditionalOperator) {520  // FIXME: conditional expression is not modeled yet.521  EXPECT_TRUE(treeDumpEqualOnAnnotations(522      R"cpp(523void test() {524  [[1?:2]];525}526)cpp",527      {R"txt(528UnknownExpression Expression529|-IntegerLiteralExpression530| `-'1' LiteralToken531|-'?'532|-':'533`-IntegerLiteralExpression534  `-'2' LiteralToken535)txt"}));536}537 538TEST_P(BuildSyntaxTreeTest, UnqualifiedId_Identifier) {539  EXPECT_TRUE(treeDumpEqualOnAnnotations(540      R"cpp(541void test(int a) {542  [[a]];543}544)cpp",545      {R"txt(546IdExpression Expression547`-UnqualifiedId UnqualifiedId548  `-'a'549)txt"}));550}551 552TEST_P(BuildSyntaxTreeTest, UnqualifiedId_OperatorFunctionId) {553  if (!GetParam().isCXX()) {554    return;555  }556  EXPECT_TRUE(treeDumpEqualOnAnnotations(557      R"cpp(558struct X {559  friend X operator+(const X&, const X&);560};561void test(X x) {562  [[operator+(x, x)]];563}564)cpp",565      {R"txt(566CallExpression Expression567|-IdExpression Callee568| `-UnqualifiedId UnqualifiedId569|   |-'operator'570|   `-'+'571|-'(' OpenParen572|-CallArguments Arguments573| |-IdExpression ListElement574| | `-UnqualifiedId UnqualifiedId575| |   `-'x'576| |-',' ListDelimiter577| `-IdExpression ListElement578|   `-UnqualifiedId UnqualifiedId579|     `-'x'580`-')' CloseParen581)txt"}));582}583 584TEST_P(BuildSyntaxTreeTest, UnqualifiedId_ConversionFunctionId) {585  if (!GetParam().isCXX()) {586    return;587  }588  EXPECT_TRUE(treeDumpEqualOnAnnotations(589      R"cpp(590struct X {591  operator int();592};593void test(X x) {594  [[x.operator int()]];595}596)cpp",597      {R"txt(598CallExpression Expression599|-MemberExpression Callee600| |-IdExpression Object601| | `-UnqualifiedId UnqualifiedId602| |   `-'x'603| |-'.' AccessToken604| `-IdExpression Member605|   `-UnqualifiedId UnqualifiedId606|     |-'operator'607|     `-'int'608|-'(' OpenParen609`-')' CloseParen610)txt"}));611}612 613TEST_P(BuildSyntaxTreeTest, UnqualifiedId_LiteralOperatorId) {614  if (!GetParam().isCXX11OrLater()) {615    return;616  }617  EXPECT_TRUE(treeDumpEqualOnAnnotations(618      R"cpp(619unsigned operator "" _w(char);620void test() {621  [[operator "" _w('1')]];622}623)cpp",624      {R"txt(625CallExpression Expression626|-IdExpression Callee627| `-UnqualifiedId UnqualifiedId628|   |-'operator'629|   |-'""'630|   `-'_w'631|-'(' OpenParen632|-CallArguments Arguments633| `-CharacterLiteralExpression ListElement634|   `-''1'' LiteralToken635`-')' CloseParen636)txt"}));637}638 639TEST_P(BuildSyntaxTreeTest, UnqualifiedId_Destructor) {640  if (!GetParam().isCXX()) {641    return;642  }643  EXPECT_TRUE(treeDumpEqualOnAnnotations(644      R"cpp(645struct X { };646void test(X x) {647  [[x.~X()]];648}649)cpp",650      {R"txt(651CallExpression Expression652|-MemberExpression Callee653| |-IdExpression Object654| | `-UnqualifiedId UnqualifiedId655| |   `-'x'656| |-'.' AccessToken657| `-IdExpression Member658|   `-UnqualifiedId UnqualifiedId659|     |-'~'660|     `-'X'661|-'(' OpenParen662`-')' CloseParen663)txt"}));664}665 666TEST_P(BuildSyntaxTreeTest, UnqualifiedId_DecltypeDestructor) {667  if (!GetParam().isCXX11OrLater()) {668    return;669  }670  EXPECT_TRUE(treeDumpEqualOnAnnotations(671      R"cpp(672struct X { };673void test(X x) {674  // FIXME: Make `decltype(x)` a child of `MemberExpression`. It is currently675  // not because `Expr::getSourceRange()` returns the range of `x.~` for the676  // `MemberExpr` instead of the expected `x.~decltype(x)`, this is a bug in677  // clang.678  [[x.~decltype(x)()]];679}680)cpp",681      {R"txt(682CallExpression Expression683|-MemberExpression Callee684| |-IdExpression Object685| | `-UnqualifiedId UnqualifiedId686| |   `-'x'687| |-'.' AccessToken688| `-IdExpression Member689|   `-UnqualifiedId UnqualifiedId690|     `-'~'691|-'decltype'692|-'('693|-'x'694|-')'695|-'('696`-')' CloseParen697)txt"}));698}699 700TEST_P(BuildSyntaxTreeTest, UnqualifiedId_TemplateId) {701  if (!GetParam().isCXX()) {702    return;703  }704  EXPECT_TRUE(treeDumpEqualOnAnnotations(705      R"cpp(706template<typename T>707T f();708void test() {709  [[f<int>()]];710}711)cpp",712      {R"txt(713CallExpression Expression714|-IdExpression Callee715| `-UnqualifiedId UnqualifiedId716|   |-'f'717|   |-'<'718|   |-'int'719|   `-'>'720|-'(' OpenParen721`-')' CloseParen722)txt"}));723}724 725TEST_P(BuildSyntaxTreeTest, QualifiedId_NamespaceSpecifier) {726  if (!GetParam().isCXX()) {727    return;728  }729  EXPECT_TRUE(treeDumpEqualOnAnnotations(730      R"cpp(731namespace n {732  struct S { };733}734void test() {735  [[::n::S s1]];736  [[n::S s2]];737}738)cpp",739      {R"txt(740SimpleDeclaration741|-NestedNameSpecifier742| |-'::' ListDelimiter743| |-IdentifierNameSpecifier ListElement744| | `-'n'745| `-'::' ListDelimiter746|-'S'747`-DeclaratorList Declarators748  `-SimpleDeclarator ListElement749    `-'s1'750)txt",751       R"txt(752SimpleDeclaration753|-NestedNameSpecifier754| |-IdentifierNameSpecifier ListElement755| | `-'n'756| `-'::' ListDelimiter757|-'S'758`-DeclaratorList Declarators759  `-SimpleDeclarator ListElement760    `-'s2'761)txt"}));762}763 764TEST_P(BuildSyntaxTreeTest, QualifiedId_TemplateSpecifier) {765  if (!GetParam().isCXX()) {766    return;767  }768  EXPECT_TRUE(treeDumpEqualOnAnnotations(769      R"cpp(770template<typename T>771struct ST {772  struct S { };773};774void test() {775  [[::template ST<int>::S s1]];776  [[::ST<int>::S s2]];777}778)cpp",779      {R"txt(780SimpleDeclaration781|-NestedNameSpecifier782| |-'::' ListDelimiter783| |-SimpleTemplateNameSpecifier ListElement784| | |-'template'785| | |-'ST'786| | |-'<'787| | |-'int'788| | `-'>'789| `-'::' ListDelimiter790|-'S'791`-DeclaratorList Declarators792  `-SimpleDeclarator ListElement793    `-'s1'794)txt",795       R"txt(796SimpleDeclaration797|-NestedNameSpecifier798| |-'::' ListDelimiter799| |-SimpleTemplateNameSpecifier ListElement800| | |-'ST'801| | |-'<'802| | |-'int'803| | `-'>'804| `-'::' ListDelimiter805|-'S'806`-DeclaratorList Declarators807  `-SimpleDeclarator ListElement808    `-'s2'809)txt"}));810}811 812TEST_P(BuildSyntaxTreeTest, QualifiedId_DecltypeSpecifier) {813  if (!GetParam().isCXX11OrLater()) {814    return;815  }816  EXPECT_TRUE(treeDumpEqualOnAnnotations(817      R"cpp(818struct S {819  static void f(){}820};821void test(S s) {822  [[decltype(s)::f()]];823}824)cpp",825      {R"txt(826CallExpression Expression827|-IdExpression Callee828| |-NestedNameSpecifier Qualifier829| | |-DecltypeNameSpecifier ListElement830| | | |-'decltype'831| | | |-'('832| | | |-IdExpression833| | | | `-UnqualifiedId UnqualifiedId834| | | |   `-'s'835| | | `-')'836| | `-'::' ListDelimiter837| `-UnqualifiedId UnqualifiedId838|   `-'f'839|-'(' OpenParen840`-')' CloseParen841)txt"}));842}843 844TEST_P(BuildSyntaxTreeTest, QualifiedId_OptionalTemplateKw) {845  if (!GetParam().isCXX()) {846    return;847  }848  EXPECT_TRUE(treeDumpEqualOnAnnotations(849      R"cpp(850struct S {851  template<typename U>852  static U f();853};854void test() {855  [[S::f<int>()]];856  [[S::template f<int>()]];857}858)cpp",859      {R"txt(860CallExpression Expression861|-IdExpression Callee862| |-NestedNameSpecifier Qualifier863| | |-IdentifierNameSpecifier ListElement864| | | `-'S'865| | `-'::' ListDelimiter866| `-UnqualifiedId UnqualifiedId867|   |-'f'868|   |-'<'869|   |-'int'870|   `-'>'871|-'(' OpenParen872`-')' CloseParen873)txt",874       R"txt(875CallExpression Expression876|-IdExpression Callee877| |-NestedNameSpecifier Qualifier878| | |-IdentifierNameSpecifier ListElement879| | | `-'S'880| | `-'::' ListDelimiter881| |-'template' TemplateKeyword882| `-UnqualifiedId UnqualifiedId883|   |-'f'884|   |-'<'885|   |-'int'886|   `-'>'887|-'(' OpenParen888`-')' CloseParen889)txt"}));890}891 892TEST_P(BuildSyntaxTreeTest, QualifiedId_Complex) {893  if (!GetParam().isCXX()) {894    return;895  }896  EXPECT_TRUE(treeDumpEqualOnAnnotations(897      R"cpp(898namespace n {899  template<typename T>900  struct ST {901    template<typename U>902    static U f();903  };904}905void test() {906  [[::n::template ST<int>::template f<int>()]];907}908)cpp",909      {R"txt(910CallExpression Expression911|-IdExpression Callee912| |-NestedNameSpecifier Qualifier913| | |-'::' ListDelimiter914| | |-IdentifierNameSpecifier ListElement915| | | `-'n'916| | |-'::' ListDelimiter917| | |-SimpleTemplateNameSpecifier ListElement918| | | |-'template'919| | | |-'ST'920| | | |-'<'921| | | |-'int'922| | | `-'>'923| | `-'::' ListDelimiter924| |-'template' TemplateKeyword925| `-UnqualifiedId UnqualifiedId926|   |-'f'927|   |-'<'928|   |-'int'929|   `-'>'930|-'(' OpenParen931`-')' CloseParen932)txt"}));933}934 935TEST_P(BuildSyntaxTreeTest, QualifiedId_DependentType) {936  if (!GetParam().isCXX()) {937    return;938  }939  if (GetParam().hasDelayedTemplateParsing()) {940    // FIXME: Make this test work on Windows by generating the expected syntax941    // tree when `-fdelayed-template-parsing` is active.942    return;943  }944  EXPECT_TRUE(treeDumpEqualOnAnnotations(945      R"cpp(946template <typename T>947void test() {948  [[T::template U<int>::f()]];949  [[T::U::f()]];950  [[T::template f<0>()]];951}952)cpp",953      {R"txt(954CallExpression Expression955|-IdExpression Callee956| |-NestedNameSpecifier Qualifier957| | |-IdentifierNameSpecifier ListElement958| | | `-'T'959| | |-'::' ListDelimiter960| | |-SimpleTemplateNameSpecifier ListElement961| | | |-'template'962| | | |-'U'963| | | |-'<'964| | | |-'int'965| | | `-'>'966| | `-'::' ListDelimiter967| `-UnqualifiedId UnqualifiedId968|   `-'f'969|-'(' OpenParen970`-')' CloseParen971)txt",972       R"txt(973CallExpression Expression974|-IdExpression Callee975| |-NestedNameSpecifier Qualifier976| | |-IdentifierNameSpecifier ListElement977| | | `-'T'978| | |-'::' ListDelimiter979| | |-IdentifierNameSpecifier ListElement980| | | `-'U'981| | `-'::' ListDelimiter982| `-UnqualifiedId UnqualifiedId983|   `-'f'984|-'(' OpenParen985`-')' CloseParen986)txt",987       R"txt(988CallExpression Expression989|-IdExpression Callee990| |-NestedNameSpecifier Qualifier991| | |-IdentifierNameSpecifier ListElement992| | | `-'T'993| | `-'::' ListDelimiter994| |-'template' TemplateKeyword995| `-UnqualifiedId UnqualifiedId996|   |-'f'997|   |-'<'998|   |-IntegerLiteralExpression999|   | `-'0' LiteralToken1000|   `-'>'1001|-'(' OpenParen1002`-')' CloseParen1003)txt"}));1004}1005 1006TEST_P(BuildSyntaxTreeTest, This_Simple) {1007  if (!GetParam().isCXX()) {1008    return;1009  }1010  EXPECT_TRUE(treeDumpEqualOnAnnotations(1011      R"cpp(1012struct S {1013  S* test(){1014    return [[this]];1015  }1016};1017)cpp",1018      {R"txt(1019ThisExpression ReturnValue1020`-'this' IntroducerKeyword1021)txt"}));1022}1023 1024TEST_P(BuildSyntaxTreeTest, This_ExplicitMemberAccess) {1025  if (!GetParam().isCXX()) {1026    return;1027  }1028  EXPECT_TRUE(treeDumpEqualOnAnnotations(1029      R"cpp(1030struct S {1031  int a;1032  void test(){1033    [[this->a]];1034  }1035};1036)cpp",1037      {R"txt(1038MemberExpression Expression1039|-ThisExpression Object1040| `-'this' IntroducerKeyword1041|-'->' AccessToken1042`-IdExpression Member1043  `-UnqualifiedId UnqualifiedId1044    `-'a'1045)txt"}));1046}1047 1048TEST_P(BuildSyntaxTreeTest, This_ImplicitMemberAccess) {1049  if (!GetParam().isCXX()) {1050    return;1051  }1052  EXPECT_TRUE(treeDumpEqualOnAnnotations(1053      R"cpp(1054struct S {1055  int a;1056  void test(){1057    [[a]];1058  }1059};1060)cpp",1061      {R"txt(1062IdExpression Expression1063`-UnqualifiedId UnqualifiedId1064  `-'a'1065)txt"}));1066}1067 1068TEST_P(BuildSyntaxTreeTest, ParenExpr) {1069  EXPECT_TRUE(treeDumpEqualOnAnnotations(1070      R"cpp(1071void test() {1072  [[(1)]];1073  [[((1))]];1074  [[(1 + (2))]];1075}1076)cpp",1077      {R"txt(1078ParenExpression Expression1079|-'(' OpenParen1080|-IntegerLiteralExpression SubExpression1081| `-'1' LiteralToken1082`-')' CloseParen1083)txt",1084       R"txt(1085ParenExpression Expression1086|-'(' OpenParen1087|-ParenExpression SubExpression1088| |-'(' OpenParen1089| |-IntegerLiteralExpression SubExpression1090| | `-'1' LiteralToken1091| `-')' CloseParen1092`-')' CloseParen1093)txt",1094       R"txt(1095ParenExpression Expression1096|-'(' OpenParen1097|-BinaryOperatorExpression SubExpression1098| |-IntegerLiteralExpression LeftHandSide1099| | `-'1' LiteralToken1100| |-'+' OperatorToken1101| `-ParenExpression RightHandSide1102|   |-'(' OpenParen1103|   |-IntegerLiteralExpression SubExpression1104|   | `-'2' LiteralToken1105|   `-')' CloseParen1106`-')' CloseParen1107)txt"}));1108}1109 1110TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_Char) {1111  if (!GetParam().isCXX11OrLater()) {1112    return;1113  }1114  EXPECT_TRUE(treeDumpEqualOnAnnotations(1115      R"cpp(1116unsigned operator "" _c(char);1117void test() {1118  [['2'_c]];1119}1120    )cpp",1121      {R"txt(1122CharUserDefinedLiteralExpression Expression1123`-''2'_c' LiteralToken1124)txt"}));1125}1126 1127TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_String) {1128  if (!GetParam().isCXX11OrLater()) {1129    return;1130  }1131  EXPECT_TRUE(treeDumpEqualOnAnnotations(1132      R"cpp(1133typedef decltype(sizeof(void *)) size_t;1134 1135unsigned operator "" _s(const char*, size_t);1136 1137void test() {1138  [["12"_s]];1139}1140    )cpp",1141      {R"txt(1142StringUserDefinedLiteralExpression Expression1143`-'"12"_s' LiteralToken1144)txt"}));1145}1146 1147TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_Integer) {1148  if (!GetParam().isCXX11OrLater()) {1149    return;1150  }1151  EXPECT_TRUE(treeDumpEqualOnAnnotations(1152      R"cpp(1153unsigned operator "" _i(unsigned long long);1154unsigned operator "" _r(const char*);1155template <char...>1156unsigned operator "" _t();1157 1158void test() {1159  [[12_i]];1160  [[12_r]];1161  [[12_t]];1162}1163    )cpp",1164      {R"txt(1165IntegerUserDefinedLiteralExpression Expression1166`-'12_i' LiteralToken1167)txt",1168       R"txt(1169IntegerUserDefinedLiteralExpression Expression1170`-'12_r' LiteralToken1171)txt",1172       R"txt(1173IntegerUserDefinedLiteralExpression Expression1174`-'12_t' LiteralToken1175)txt"}));1176}1177 1178TEST_P(BuildSyntaxTreeTest, UserDefinedLiteral_Float) {1179  if (!GetParam().isCXX11OrLater()) {1180    return;1181  }1182  EXPECT_TRUE(treeDumpEqualOnAnnotations(1183      R"cpp(1184unsigned operator "" _f(long double);1185unsigned operator "" _r(const char*);1186template <char...>1187unsigned operator "" _t();1188 1189void test() {1190  [[1.2_f]];1191  [[1.2_r]];1192  [[1.2_t]];1193}1194    )cpp",1195      {R"txt(1196FloatUserDefinedLiteralExpression Expression1197`-'1.2_f' LiteralToken1198)txt",1199       R"txt(1200FloatUserDefinedLiteralExpression Expression1201`-'1.2_r' LiteralToken1202)txt",1203       R"txt(1204FloatUserDefinedLiteralExpression Expression1205`-'1.2_t' LiteralToken1206)txt"}));1207}1208 1209TEST_P(BuildSyntaxTreeTest, IntegerLiteral_LongLong) {1210  if (!GetParam().isCXX11OrLater()) {1211    return;1212  }1213  EXPECT_TRUE(treeDumpEqualOnAnnotations(1214      R"cpp(1215void test() {1216  [[12ll]];1217  [[12ull]];1218}1219)cpp",1220      {R"txt(1221IntegerLiteralExpression Expression1222`-'12ll' LiteralToken1223)txt",1224       R"txt(1225IntegerLiteralExpression Expression1226`-'12ull' LiteralToken1227)txt"}));1228}1229 1230TEST_P(BuildSyntaxTreeTest, IntegerLiteral_Binary) {1231  if (!GetParam().isCXX14OrLater()) {1232    return;1233  }1234  EXPECT_TRUE(treeDumpEqualOnAnnotations(1235      R"cpp(1236void test() {1237  [[0b1100]];1238}1239)cpp",1240      {R"txt(1241IntegerLiteralExpression Expression1242`-'0b1100' LiteralToken1243)txt"}));1244}1245 1246TEST_P(BuildSyntaxTreeTest, IntegerLiteral_WithDigitSeparators) {1247  if (!GetParam().isCXX14OrLater()) {1248    return;1249  }1250  EXPECT_TRUE(treeDumpEqualOnAnnotations(1251      R"cpp(1252void test() {1253  [[1'2'0ull]];1254}1255)cpp",1256      {R"txt(1257IntegerLiteralExpression Expression1258`-'1'2'0ull' LiteralToken1259)txt"}));1260}1261 1262TEST_P(BuildSyntaxTreeTest, CharacterLiteral) {1263  EXPECT_TRUE(treeDumpEqualOnAnnotations(1264      R"cpp(1265void test() {1266  [['a']];1267  [['\n']];1268  [['\x20']];1269  [['\0']];1270  [[L'a']];1271  [[L'α']];1272}1273)cpp",1274      {R"txt(1275CharacterLiteralExpression Expression1276`-''a'' LiteralToken1277)txt",1278       R"txt(1279CharacterLiteralExpression Expression1280`-''\n'' LiteralToken1281)txt",1282       R"txt(1283CharacterLiteralExpression Expression1284`-''\x20'' LiteralToken1285)txt",1286       R"txt(1287CharacterLiteralExpression Expression1288`-''\0'' LiteralToken1289)txt",1290       R"txt(1291CharacterLiteralExpression Expression1292`-'L'a'' LiteralToken1293)txt",1294       R"txt(1295CharacterLiteralExpression Expression1296`-'L'α'' LiteralToken1297)txt"}));1298}1299 1300TEST_P(BuildSyntaxTreeTest, CharacterLiteral_Utf) {1301  if (!GetParam().isCXX11OrLater()) {1302    return;1303  }1304  EXPECT_TRUE(treeDumpEqualOnAnnotations(1305      R"cpp(1306void test() {1307  [[u'a']];1308  [[u'構']];1309  [[U'a']];1310  [[U'🌲']];1311}1312)cpp",1313      {R"txt(1314CharacterLiteralExpression Expression1315`-'u'a'' LiteralToken1316)txt",1317       R"txt(1318CharacterLiteralExpression Expression1319`-'u'構'' LiteralToken1320)txt",1321       R"txt(1322CharacterLiteralExpression Expression1323`-'U'a'' LiteralToken1324)txt",1325       R"txt(1326CharacterLiteralExpression Expression1327`-'U'🌲'' LiteralToken1328)txt"}));1329}1330 1331TEST_P(BuildSyntaxTreeTest, CharacterLiteral_Utf8) {1332  if (!GetParam().isCXX17OrLater()) {1333    return;1334  }1335  EXPECT_TRUE(treeDumpEqualOnAnnotations(1336      R"cpp(1337void test() {1338  [[u8'a']];1339  [[u8'\x7f']];1340}1341)cpp",1342      {R"txt(1343CharacterLiteralExpression Expression1344`-'u8'a'' LiteralToken1345)txt",1346       R"txt(1347CharacterLiteralExpression Expression1348`-'u8'\x7f'' LiteralToken1349)txt"}));1350}1351 1352TEST_P(BuildSyntaxTreeTest, FloatingLiteral) {1353  EXPECT_TRUE(treeDumpEqualOnAnnotations(1354      R"cpp(1355void test() {1356  [[1e-2]];1357  [[2.]];1358  [[.2]];1359  [[2.f]];1360}1361)cpp",1362      {R"txt(1363FloatingLiteralExpression Expression1364`-'1e-2' LiteralToken1365)txt",1366       R"txt(1367FloatingLiteralExpression Expression1368`-'2.' LiteralToken1369)txt",1370       R"txt(1371FloatingLiteralExpression Expression1372`-'.2' LiteralToken1373)txt",1374       R"txt(1375FloatingLiteralExpression Expression1376`-'2.f' LiteralToken1377)txt"}));1378}1379 1380TEST_P(BuildSyntaxTreeTest, FloatingLiteral_Hexadecimal) {1381  if (!GetParam().isCXX17OrLater()) {1382    return;1383  }1384  EXPECT_TRUE(treeDumpEqualOnAnnotations(1385      R"cpp(1386void test() {1387  [[0xfp1]];1388  [[0xf.p1]];1389  [[0x.fp1]];1390  [[0xf.fp1f]];1391}1392)cpp",1393      {R"txt(1394FloatingLiteralExpression Expression1395`-'0xfp1' LiteralToken1396)txt",1397       R"txt(1398FloatingLiteralExpression Expression1399`-'0xf.p1' LiteralToken1400)txt",1401       R"txt(1402FloatingLiteralExpression Expression1403`-'0x.fp1' LiteralToken1404)txt",1405       R"txt(1406FloatingLiteralExpression Expression1407`-'0xf.fp1f' LiteralToken1408)txt"}));1409}1410 1411TEST_P(BuildSyntaxTreeTest, StringLiteral) {1412  EXPECT_TRUE(treeDumpEqualOnAnnotations(1413      R"cpp(1414void test() {1415  [["a\n\0\x20"]];1416  [[L"αβ"]];1417}1418)cpp",1419      {R"txt(1420StringLiteralExpression Expression1421`-'"a\n\0\x20"' LiteralToken1422)txt",1423       R"txt(1424StringLiteralExpression Expression1425`-'L"αβ"' LiteralToken1426)txt"}));1427}1428 1429TEST_P(BuildSyntaxTreeTest, StringLiteral_Utf) {1430  if (!GetParam().isCXX11OrLater()) {1431    return;1432  }1433  EXPECT_TRUE(treeDumpEqualOnAnnotations(1434      R"cpp(1435void test() {1436  [[u8"a\x1f\x05"]];1437  [[u"C++抽象構文木"]];1438  [[U"📖🌲\n"]];1439}1440)cpp",1441      {R"txt(1442StringLiteralExpression Expression1443`-'u8"a\x1f\x05"' LiteralToken1444)txt",1445       R"txt(1446StringLiteralExpression Expression1447`-'u"C++抽象構文木"' LiteralToken1448)txt",1449       R"txt(1450StringLiteralExpression Expression1451`-'U"📖🌲\n"' LiteralToken1452)txt"}));1453}1454 1455TEST_P(BuildSyntaxTreeTest, StringLiteral_Raw) {1456  if (!GetParam().isCXX11OrLater()) {1457    return;1458  }1459  // This test uses regular string literals instead of raw string literals to1460  // hold source code and expected output because of a bug in MSVC up to MSVC1461  // 2019 16.2:1462  // https://developercommunity.visualstudio.com/content/problem/67300/stringifying-raw-string-literal.html1463  EXPECT_TRUE(treeDumpEqual( //1464      "void test() {\n"1465      "  R\"SyntaxTree(\n"1466      "  Hello \"Syntax\" \\\"\n"1467      "  )SyntaxTree\";\n"1468      "}\n",1469      "TranslationUnit Detached\n"1470      "`-SimpleDeclaration\n"1471      "  |-'void'\n"1472      "  |-DeclaratorList Declarators\n"1473      "  | `-SimpleDeclarator ListElement\n"1474      "  |   |-'test'\n"1475      "  |   `-ParametersAndQualifiers\n"1476      "  |     |-'(' OpenParen\n"1477      "  |     `-')' CloseParen\n"1478      "  `-CompoundStatement\n"1479      "    |-'{' OpenParen\n"1480      "    |-ExpressionStatement Statement\n"1481      "    | |-StringLiteralExpression Expression\n"1482      "    | | `-'R\"SyntaxTree(\n"1483      "  Hello \"Syntax\" \\\"\n"1484      "  )SyntaxTree\"' LiteralToken\n"1485      "    | `-';'\n"1486      "    `-'}' CloseParen\n"));1487}1488 1489TEST_P(BuildSyntaxTreeTest, BoolLiteral) {1490  if (GetParam().isC()) {1491    return;1492  }1493  EXPECT_TRUE(treeDumpEqualOnAnnotations(1494      R"cpp(1495void test() {1496  [[true]];1497  [[false]];1498}1499)cpp",1500      {R"txt(1501BoolLiteralExpression Expression1502`-'true' LiteralToken1503)txt",1504       R"txt(1505BoolLiteralExpression Expression1506`-'false' LiteralToken1507)txt"}));1508}1509 1510TEST_P(BuildSyntaxTreeTest, CxxNullPtrLiteral) {1511  if (!GetParam().isCXX11OrLater()) {1512    return;1513  }1514  EXPECT_TRUE(treeDumpEqualOnAnnotations(1515      R"cpp(1516void test() {1517  [[nullptr]];1518}1519)cpp",1520      {R"txt(1521CxxNullPtrExpression Expression1522`-'nullptr' LiteralToken1523)txt"}));1524}1525 1526TEST_P(BuildSyntaxTreeTest, PostfixUnaryOperator) {1527  EXPECT_TRUE(treeDumpEqualOnAnnotations(1528      R"cpp(1529void test(int a) {1530  [[a++]];1531  [[a--]];1532}1533)cpp",1534      {R"txt(1535PostfixUnaryOperatorExpression Expression1536|-IdExpression Operand1537| `-UnqualifiedId UnqualifiedId1538|   `-'a'1539`-'++' OperatorToken1540)txt",1541       R"txt(1542PostfixUnaryOperatorExpression Expression1543|-IdExpression Operand1544| `-UnqualifiedId UnqualifiedId1545|   `-'a'1546`-'--' OperatorToken1547)txt"}));1548}1549 1550TEST_P(BuildSyntaxTreeTest, PrefixUnaryOperator) {1551  EXPECT_TRUE(treeDumpEqualOnAnnotations(1552      R"cpp(1553void test(int a, int *ap) {1554  [[--a]]; [[++a]];1555  [[~a]];1556  [[-a]];1557  [[+a]];1558  [[&a]];1559  [[*ap]];1560  [[!a]];1561  [[__real a]]; [[__imag a]];1562}1563)cpp",1564      {R"txt(1565PrefixUnaryOperatorExpression Expression1566|-'--' OperatorToken1567`-IdExpression Operand1568  `-UnqualifiedId UnqualifiedId1569    `-'a'1570)txt",1571       R"txt(1572PrefixUnaryOperatorExpression Expression1573|-'++' OperatorToken1574`-IdExpression Operand1575  `-UnqualifiedId UnqualifiedId1576    `-'a'1577)txt",1578       R"txt(1579PrefixUnaryOperatorExpression Expression1580|-'~' OperatorToken1581`-IdExpression Operand1582  `-UnqualifiedId UnqualifiedId1583    `-'a'1584)txt",1585       R"txt(1586PrefixUnaryOperatorExpression Expression1587|-'-' OperatorToken1588`-IdExpression Operand1589  `-UnqualifiedId UnqualifiedId1590    `-'a'1591)txt",1592       R"txt(1593PrefixUnaryOperatorExpression Expression1594|-'+' OperatorToken1595`-IdExpression Operand1596  `-UnqualifiedId UnqualifiedId1597    `-'a'1598)txt",1599       R"txt(1600PrefixUnaryOperatorExpression Expression1601|-'&' OperatorToken1602`-IdExpression Operand1603  `-UnqualifiedId UnqualifiedId1604    `-'a'1605)txt",1606       R"txt(1607PrefixUnaryOperatorExpression Expression1608|-'*' OperatorToken1609`-IdExpression Operand1610  `-UnqualifiedId UnqualifiedId1611    `-'ap'1612)txt",1613       R"txt(1614PrefixUnaryOperatorExpression Expression1615|-'!' OperatorToken1616`-IdExpression Operand1617  `-UnqualifiedId UnqualifiedId1618    `-'a'1619)txt",1620       R"txt(1621PrefixUnaryOperatorExpression Expression1622|-'__real' OperatorToken1623`-IdExpression Operand1624  `-UnqualifiedId UnqualifiedId1625    `-'a'1626)txt",1627       R"txt(1628PrefixUnaryOperatorExpression Expression1629|-'__imag' OperatorToken1630`-IdExpression Operand1631  `-UnqualifiedId UnqualifiedId1632    `-'a'1633)txt"}));1634}1635 1636TEST_P(BuildSyntaxTreeTest, PrefixUnaryOperatorCxx) {1637  if (!GetParam().isCXX()) {1638    return;1639  }1640  EXPECT_TRUE(treeDumpEqualOnAnnotations(1641      R"cpp(1642void test(int a, bool b) {1643  [[compl a]];1644  [[not b]];1645}1646)cpp",1647      {R"txt(1648PrefixUnaryOperatorExpression Expression1649|-'compl' OperatorToken1650`-IdExpression Operand1651  `-UnqualifiedId UnqualifiedId1652    `-'a'1653)txt",1654       R"txt(1655PrefixUnaryOperatorExpression Expression1656|-'not' OperatorToken1657`-IdExpression Operand1658  `-UnqualifiedId UnqualifiedId1659    `-'b'1660)txt"}));1661}1662 1663TEST_P(BuildSyntaxTreeTest, BinaryOperator) {1664  EXPECT_TRUE(treeDumpEqualOnAnnotations(1665      R"cpp(1666void test(int a) {1667  [[1 - 2]];1668  [[1 == 2]];1669  [[a = 1]];1670  [[a <<= 1]];1671  [[1 || 0]];1672  [[1 & 2]];1673  [[a != 3]];1674}1675)cpp",1676      {R"txt(1677BinaryOperatorExpression Expression1678|-IntegerLiteralExpression LeftHandSide1679| `-'1' LiteralToken1680|-'-' OperatorToken1681`-IntegerLiteralExpression RightHandSide1682  `-'2' LiteralToken1683)txt",1684       R"txt(1685BinaryOperatorExpression Expression1686|-IntegerLiteralExpression LeftHandSide1687| `-'1' LiteralToken1688|-'==' OperatorToken1689`-IntegerLiteralExpression RightHandSide1690  `-'2' LiteralToken1691)txt",1692       R"txt(1693BinaryOperatorExpression Expression1694|-IdExpression LeftHandSide1695| `-UnqualifiedId UnqualifiedId1696|   `-'a'1697|-'=' OperatorToken1698`-IntegerLiteralExpression RightHandSide1699  `-'1' LiteralToken1700)txt",1701       R"txt(1702BinaryOperatorExpression Expression1703|-IdExpression LeftHandSide1704| `-UnqualifiedId UnqualifiedId1705|   `-'a'1706|-'<<=' OperatorToken1707`-IntegerLiteralExpression RightHandSide1708  `-'1' LiteralToken1709)txt",1710       R"txt(1711BinaryOperatorExpression Expression1712|-IntegerLiteralExpression LeftHandSide1713| `-'1' LiteralToken1714|-'||' OperatorToken1715`-IntegerLiteralExpression RightHandSide1716  `-'0' LiteralToken1717)txt",1718       R"txt(1719BinaryOperatorExpression Expression1720|-IntegerLiteralExpression LeftHandSide1721| `-'1' LiteralToken1722|-'&' OperatorToken1723`-IntegerLiteralExpression RightHandSide1724  `-'2' LiteralToken1725)txt",1726       R"txt(1727BinaryOperatorExpression Expression1728|-IdExpression LeftHandSide1729| `-UnqualifiedId UnqualifiedId1730|   `-'a'1731|-'!=' OperatorToken1732`-IntegerLiteralExpression RightHandSide1733  `-'3' LiteralToken1734)txt"}));1735}1736 1737TEST_P(BuildSyntaxTreeTest, BinaryOperatorCxx) {1738  if (!GetParam().isCXX()) {1739    return;1740  }1741  EXPECT_TRUE(treeDumpEqualOnAnnotations(1742      R"cpp(1743void test(int a) {1744  [[true || false]];1745  [[true or false]];1746  [[1 bitand 2]];1747  [[a xor_eq 3]];1748}1749)cpp",1750      {R"txt(1751BinaryOperatorExpression Expression1752|-BoolLiteralExpression LeftHandSide1753| `-'true' LiteralToken1754|-'||' OperatorToken1755`-BoolLiteralExpression RightHandSide1756  `-'false' LiteralToken1757)txt",1758       R"txt(1759BinaryOperatorExpression Expression1760|-BoolLiteralExpression LeftHandSide1761| `-'true' LiteralToken1762|-'or' OperatorToken1763`-BoolLiteralExpression RightHandSide1764  `-'false' LiteralToken1765)txt",1766       R"txt(1767BinaryOperatorExpression Expression1768|-IntegerLiteralExpression LeftHandSide1769| `-'1' LiteralToken1770|-'bitand' OperatorToken1771`-IntegerLiteralExpression RightHandSide1772  `-'2' LiteralToken1773)txt",1774       R"txt(1775BinaryOperatorExpression Expression1776|-IdExpression LeftHandSide1777| `-UnqualifiedId UnqualifiedId1778|   `-'a'1779|-'xor_eq' OperatorToken1780`-IntegerLiteralExpression RightHandSide1781  `-'3' LiteralToken1782)txt"}));1783}1784 1785TEST_P(BuildSyntaxTreeTest, BinaryOperator_NestedWithParenthesis) {1786  EXPECT_TRUE(treeDumpEqualOnAnnotations(1787      R"cpp(1788void test() {1789  [[(1 + 2) * (4 / 2)]];1790}1791)cpp",1792      {R"txt(1793BinaryOperatorExpression Expression1794|-ParenExpression LeftHandSide1795| |-'(' OpenParen1796| |-BinaryOperatorExpression SubExpression1797| | |-IntegerLiteralExpression LeftHandSide1798| | | `-'1' LiteralToken1799| | |-'+' OperatorToken1800| | `-IntegerLiteralExpression RightHandSide1801| |   `-'2' LiteralToken1802| `-')' CloseParen1803|-'*' OperatorToken1804`-ParenExpression RightHandSide1805  |-'(' OpenParen1806  |-BinaryOperatorExpression SubExpression1807  | |-IntegerLiteralExpression LeftHandSide1808  | | `-'4' LiteralToken1809  | |-'/' OperatorToken1810  | `-IntegerLiteralExpression RightHandSide1811  |   `-'2' LiteralToken1812  `-')' CloseParen1813)txt"}));1814}1815 1816TEST_P(BuildSyntaxTreeTest, BinaryOperator_Associativity) {1817  EXPECT_TRUE(treeDumpEqualOnAnnotations(1818      R"cpp(1819void test(int a, int b) {1820  [[a + b + 42]];1821  [[a = b = 42]];1822}1823)cpp",1824      {R"txt(1825BinaryOperatorExpression Expression1826|-BinaryOperatorExpression LeftHandSide1827| |-IdExpression LeftHandSide1828| | `-UnqualifiedId UnqualifiedId1829| |   `-'a'1830| |-'+' OperatorToken1831| `-IdExpression RightHandSide1832|   `-UnqualifiedId UnqualifiedId1833|     `-'b'1834|-'+' OperatorToken1835`-IntegerLiteralExpression RightHandSide1836  `-'42' LiteralToken1837)txt",1838       R"txt(1839BinaryOperatorExpression Expression1840|-IdExpression LeftHandSide1841| `-UnqualifiedId UnqualifiedId1842|   `-'a'1843|-'=' OperatorToken1844`-BinaryOperatorExpression RightHandSide1845  |-IdExpression LeftHandSide1846  | `-UnqualifiedId UnqualifiedId1847  |   `-'b'1848  |-'=' OperatorToken1849  `-IntegerLiteralExpression RightHandSide1850    `-'42' LiteralToken1851)txt"}));1852}1853 1854TEST_P(BuildSyntaxTreeTest, BinaryOperator_Precedence) {1855  EXPECT_TRUE(treeDumpEqualOnAnnotations(1856      R"cpp(1857void test() {1858  [[1 + 2 * 3 + 4]];1859  [[1 % 2 + 3 * 4]];1860}1861)cpp",1862      {R"txt(1863BinaryOperatorExpression Expression1864|-BinaryOperatorExpression LeftHandSide1865| |-IntegerLiteralExpression LeftHandSide1866| | `-'1' LiteralToken1867| |-'+' OperatorToken1868| `-BinaryOperatorExpression RightHandSide1869|   |-IntegerLiteralExpression LeftHandSide1870|   | `-'2' LiteralToken1871|   |-'*' OperatorToken1872|   `-IntegerLiteralExpression RightHandSide1873|     `-'3' LiteralToken1874|-'+' OperatorToken1875`-IntegerLiteralExpression RightHandSide1876  `-'4' LiteralToken1877)txt",1878       R"txt(1879BinaryOperatorExpression Expression1880|-BinaryOperatorExpression LeftHandSide1881| |-IntegerLiteralExpression LeftHandSide1882| | `-'1' LiteralToken1883| |-'%' OperatorToken1884| `-IntegerLiteralExpression RightHandSide1885|   `-'2' LiteralToken1886|-'+' OperatorToken1887`-BinaryOperatorExpression RightHandSide1888  |-IntegerLiteralExpression LeftHandSide1889  | `-'3' LiteralToken1890  |-'*' OperatorToken1891  `-IntegerLiteralExpression RightHandSide1892    `-'4' LiteralToken1893)txt"}));1894}1895 1896TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Assignment) {1897  if (!GetParam().isCXX()) {1898    return;1899  }1900  EXPECT_TRUE(treeDumpEqualOnAnnotations(1901      R"cpp(1902struct X {1903  X& operator=(const X&);1904};1905void test(X x, X y) {1906  [[x = y]];1907}1908)cpp",1909      {R"txt(1910BinaryOperatorExpression Expression1911|-IdExpression LeftHandSide1912| `-UnqualifiedId UnqualifiedId1913|   `-'x'1914|-'=' OperatorToken1915`-IdExpression RightHandSide1916  `-UnqualifiedId UnqualifiedId1917    `-'y'1918)txt"}));1919}1920 1921TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Plus) {1922  if (!GetParam().isCXX()) {1923    return;1924  }1925  EXPECT_TRUE(treeDumpEqualOnAnnotations(1926      R"cpp(1927struct X {1928  friend X operator+(X, const X&);1929};1930void test(X x, X y) {1931  [[x + y]];1932}1933)cpp",1934      {R"txt(1935BinaryOperatorExpression Expression1936|-IdExpression LeftHandSide1937| `-UnqualifiedId UnqualifiedId1938|   `-'x'1939|-'+' OperatorToken1940`-IdExpression RightHandSide1941  `-UnqualifiedId UnqualifiedId1942    `-'y'1943)txt"}));1944}1945 1946TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Less) {1947  if (!GetParam().isCXX()) {1948    return;1949  }1950  EXPECT_TRUE(treeDumpEqualOnAnnotations(1951      R"cpp(1952struct X {1953  friend bool operator<(const X&, const X&);1954};1955void test(X x, X y) {1956  [[x < y]];1957}1958)cpp",1959      {R"txt(1960BinaryOperatorExpression Expression1961|-IdExpression LeftHandSide1962| `-UnqualifiedId UnqualifiedId1963|   `-'x'1964|-'<' OperatorToken1965`-IdExpression RightHandSide1966  `-UnqualifiedId UnqualifiedId1967    `-'y'1968)txt"}));1969}1970 1971TEST_P(BuildSyntaxTreeTest, OverloadedOperator_LeftShift) {1972  if (!GetParam().isCXX()) {1973    return;1974  }1975  EXPECT_TRUE(treeDumpEqualOnAnnotations(1976      R"cpp(1977struct X {1978  friend X operator<<(X&, const X&);1979};1980void test(X x, X y) {1981  [[x << y]];1982}1983)cpp",1984      {R"txt(1985BinaryOperatorExpression Expression1986|-IdExpression LeftHandSide1987| `-UnqualifiedId UnqualifiedId1988|   `-'x'1989|-'<<' OperatorToken1990`-IdExpression RightHandSide1991  `-UnqualifiedId UnqualifiedId1992    `-'y'1993)txt"}));1994}1995 1996TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Comma) {1997  if (!GetParam().isCXX()) {1998    return;1999  }2000  EXPECT_TRUE(treeDumpEqualOnAnnotations(2001      R"cpp(2002struct X {2003  X operator,(X&);2004};2005void test(X x, X y) {2006  [[x, y]];2007}2008)cpp",2009      {R"txt(2010BinaryOperatorExpression Expression2011|-IdExpression LeftHandSide2012| `-UnqualifiedId UnqualifiedId2013|   `-'x'2014|-',' OperatorToken2015`-IdExpression RightHandSide2016  `-UnqualifiedId UnqualifiedId2017    `-'y'2018)txt"}));2019}2020 2021TEST_P(BuildSyntaxTreeTest, OverloadedOperator_PointerToMember) {2022  if (!GetParam().isCXX()) {2023    return;2024  }2025  EXPECT_TRUE(treeDumpEqualOnAnnotations(2026      R"cpp(2027struct X {2028  X operator->*(int);2029};2030void test(X* xp, int X::* pmi) {2031  [[xp->*pmi]];2032}2033)cpp",2034      {R"txt(2035BinaryOperatorExpression Expression2036|-IdExpression LeftHandSide2037| `-UnqualifiedId UnqualifiedId2038|   `-'xp'2039|-'->*' OperatorToken2040`-IdExpression RightHandSide2041  `-UnqualifiedId UnqualifiedId2042    `-'pmi'2043)txt"}));2044}2045 2046TEST_P(BuildSyntaxTreeTest, OverloadedOperator_Negation) {2047  if (!GetParam().isCXX()) {2048    return;2049  }2050  EXPECT_TRUE(treeDumpEqualOnAnnotations(2051      R"cpp(2052struct X {2053  bool operator!();2054};2055void test(X x) {2056  [[!x]];2057}2058)cpp",2059      {R"txt(2060PrefixUnaryOperatorExpression Expression2061|-'!' OperatorToken2062`-IdExpression Operand2063  `-UnqualifiedId UnqualifiedId2064    `-'x'2065)txt"}));2066}2067 2068TEST_P(BuildSyntaxTreeTest, OverloadedOperator_AddressOf) {2069  if (!GetParam().isCXX()) {2070    return;2071  }2072  EXPECT_TRUE(treeDumpEqualOnAnnotations(2073      R"cpp(2074struct X {2075  X* operator&();2076};2077void test(X x) {2078  [[&x]];2079}2080)cpp",2081      {R"txt(2082PrefixUnaryOperatorExpression Expression2083|-'&' OperatorToken2084`-IdExpression Operand2085  `-UnqualifiedId UnqualifiedId2086    `-'x'2087)txt"}));2088}2089 2090TEST_P(BuildSyntaxTreeTest, OverloadedOperator_PrefixIncrement) {2091  if (!GetParam().isCXX()) {2092    return;2093  }2094  EXPECT_TRUE(treeDumpEqualOnAnnotations(2095      R"cpp(2096struct X {2097  X operator++();2098};2099void test(X x) {2100  [[++x]];2101}2102)cpp",2103      {R"txt(2104PrefixUnaryOperatorExpression Expression2105|-'++' OperatorToken2106`-IdExpression Operand2107  `-UnqualifiedId UnqualifiedId2108    `-'x'2109)txt"}));2110}2111 2112TEST_P(BuildSyntaxTreeTest, OverloadedOperator_PostfixIncrement) {2113  if (!GetParam().isCXX()) {2114    return;2115  }2116  EXPECT_TRUE(treeDumpEqualOnAnnotations(2117      R"cpp(2118struct X {2119  X operator++(int);2120};2121void test(X x) {2122  [[x++]];2123}2124)cpp",2125      {R"txt(2126PostfixUnaryOperatorExpression Expression2127|-IdExpression Operand2128| `-UnqualifiedId UnqualifiedId2129|   `-'x'2130`-'++' OperatorToken2131)txt"}));2132}2133 2134TEST_P(BuildSyntaxTreeTest, MemberExpression_SimpleWithDot) {2135  EXPECT_TRUE(treeDumpEqualOnAnnotations(2136      R"cpp(2137struct S {2138  int a;2139};2140void test(struct S s) {2141  [[s.a]];2142}2143)cpp",2144      {R"txt(2145MemberExpression Expression2146|-IdExpression Object2147| `-UnqualifiedId UnqualifiedId2148|   `-'s'2149|-'.' AccessToken2150`-IdExpression Member2151  `-UnqualifiedId UnqualifiedId2152    `-'a'2153)txt"}));2154}2155 2156TEST_P(BuildSyntaxTreeTest, MemberExpression_StaticDataMember) {2157  if (!GetParam().isCXX()) {2158    return;2159  }2160  EXPECT_TRUE(treeDumpEqualOnAnnotations(2161      R"cpp(2162struct S {2163  static int a;2164};2165void test(S s) {2166  [[s.a]];2167}2168)cpp",2169      {R"txt(2170MemberExpression Expression2171|-IdExpression Object2172| `-UnqualifiedId UnqualifiedId2173|   `-'s'2174|-'.' AccessToken2175`-IdExpression Member2176  `-UnqualifiedId UnqualifiedId2177    `-'a'2178)txt"}));2179}2180 2181TEST_P(BuildSyntaxTreeTest, MemberExpression_SimpleWithArrow) {2182  EXPECT_TRUE(treeDumpEqualOnAnnotations(2183      R"cpp(2184struct S {2185  int a;2186};2187void test(struct S* sp) {2188  [[sp->a]];2189}2190)cpp",2191      {R"txt(2192MemberExpression Expression2193|-IdExpression Object2194| `-UnqualifiedId UnqualifiedId2195|   `-'sp'2196|-'->' AccessToken2197`-IdExpression Member2198  `-UnqualifiedId UnqualifiedId2199    `-'a'2200)txt"}));2201}2202 2203TEST_P(BuildSyntaxTreeTest, MemberExpression_Chaining) {2204  EXPECT_TRUE(treeDumpEqualOnAnnotations(2205      R"cpp(2206struct S {2207  struct S* next;2208};2209void test(struct S s){2210  [[s.next->next]];2211}2212)cpp",2213      {R"txt(2214MemberExpression Expression2215|-MemberExpression Object2216| |-IdExpression Object2217| | `-UnqualifiedId UnqualifiedId2218| |   `-'s'2219| |-'.' AccessToken2220| `-IdExpression Member2221|   `-UnqualifiedId UnqualifiedId2222|     `-'next'2223|-'->' AccessToken2224`-IdExpression Member2225  `-UnqualifiedId UnqualifiedId2226    `-'next'2227)txt"}));2228}2229 2230TEST_P(BuildSyntaxTreeTest, MemberExpression_OperatorFunction) {2231  if (!GetParam().isCXX()) {2232    return;2233  }2234  EXPECT_TRUE(treeDumpEqualOnAnnotations(2235      R"cpp(2236struct S {2237  bool operator!();2238};2239void test(S s) {2240  [[s.operator!()]];2241}2242)cpp",2243      {R"txt(2244CallExpression Expression2245|-MemberExpression Callee2246| |-IdExpression Object2247| | `-UnqualifiedId UnqualifiedId2248| |   `-'s'2249| |-'.' AccessToken2250| `-IdExpression Member2251|   `-UnqualifiedId UnqualifiedId2252|     |-'operator'2253|     `-'!'2254|-'(' OpenParen2255`-')' CloseParen2256)txt"}));2257}2258 2259TEST_P(BuildSyntaxTreeTest, MemberExpression_VariableTemplate) {2260  if (!GetParam().isCXX14OrLater()) {2261    return;2262  }2263  EXPECT_TRUE(treeDumpEqualOnAnnotations(2264      R"cpp(2265struct S {2266  template<typename T>2267  static constexpr T x = 42;2268};2269void test(S s) [[{2270  s.x<int>;2271}]]2272)cpp",2273      {R"txt(2274CompoundStatement2275|-'{' OpenParen2276|-ExpressionStatement Statement2277| |-MemberExpression Expression2278| | |-IdExpression Object2279| | | `-UnqualifiedId UnqualifiedId2280| | |   `-'s'2281| | |-'.' AccessToken2282| | `-IdExpression Member2283| |   `-UnqualifiedId UnqualifiedId2284| |     |-'x'2285| |     |-'<'2286| |     |-'int'2287| |     `-'>'2288| `-';'2289`-'}' CloseParen2290)txt"}));2291}2292 2293TEST_P(BuildSyntaxTreeTest, MemberExpression_FunctionTemplate) {2294  if (!GetParam().isCXX()) {2295    return;2296  }2297  EXPECT_TRUE(treeDumpEqualOnAnnotations(2298      R"cpp(2299struct S {2300  template<typename T>2301  T f();2302};2303void test(S* sp){2304  [[sp->f<int>()]];2305}2306)cpp",2307      {R"txt(2308CallExpression Expression2309|-MemberExpression Callee2310| |-IdExpression Object2311| | `-UnqualifiedId UnqualifiedId2312| |   `-'sp'2313| |-'->' AccessToken2314| `-IdExpression Member2315|   `-UnqualifiedId UnqualifiedId2316|     |-'f'2317|     |-'<'2318|     |-'int'2319|     `-'>'2320|-'(' OpenParen2321`-')' CloseParen2322)txt"}));2323}2324 2325TEST_P(BuildSyntaxTreeTest,2326       MemberExpression_FunctionTemplateWithTemplateKeyword) {2327  if (!GetParam().isCXX()) {2328    return;2329  }2330  EXPECT_TRUE(treeDumpEqualOnAnnotations(2331      R"cpp(2332struct S {2333  template<typename T>2334  T f();2335};2336void test(S s){2337  [[s.template f<int>()]];2338}2339)cpp",2340      {R"txt(2341CallExpression Expression2342|-MemberExpression Callee2343| |-IdExpression Object2344| | `-UnqualifiedId UnqualifiedId2345| |   `-'s'2346| |-'.' AccessToken2347| |-'template'2348| `-IdExpression Member2349|   `-UnqualifiedId UnqualifiedId2350|     |-'f'2351|     |-'<'2352|     |-'int'2353|     `-'>'2354|-'(' OpenParen2355`-')' CloseParen2356)txt"}));2357}2358 2359TEST_P(BuildSyntaxTreeTest, MemberExpression_WithQualifier) {2360  if (!GetParam().isCXX()) {2361    return;2362  }2363  EXPECT_TRUE(treeDumpEqualOnAnnotations(2364      R"cpp(2365struct Base {2366  void f();2367};2368struct S : public Base {};2369void test(S s){2370  [[s.Base::f()]];2371  [[s.::S::~S()]];2372}2373)cpp",2374      {R"txt(2375CallExpression Expression2376|-MemberExpression Callee2377| |-IdExpression Object2378| | `-UnqualifiedId UnqualifiedId2379| |   `-'s'2380| |-'.' AccessToken2381| `-IdExpression Member2382|   |-NestedNameSpecifier Qualifier2383|   | |-IdentifierNameSpecifier ListElement2384|   | | `-'Base'2385|   | `-'::' ListDelimiter2386|   `-UnqualifiedId UnqualifiedId2387|     `-'f'2388|-'(' OpenParen2389`-')' CloseParen2390      )txt",2391       R"txt(2392CallExpression Expression2393|-MemberExpression Callee2394| |-IdExpression Object2395| | `-UnqualifiedId UnqualifiedId2396| |   `-'s'2397| |-'.' AccessToken2398| `-IdExpression Member2399|   |-NestedNameSpecifier Qualifier2400|   | |-'::' ListDelimiter2401|   | |-IdentifierNameSpecifier ListElement2402|   | | `-'S'2403|   | `-'::' ListDelimiter2404|   `-UnqualifiedId UnqualifiedId2405|     |-'~'2406|     `-'S'2407|-'(' OpenParen2408`-')' CloseParen2409)txt"}));2410}2411 2412TEST_P(BuildSyntaxTreeTest, MemberExpression_Complex) {2413  if (!GetParam().isCXX()) {2414    return;2415  }2416  EXPECT_TRUE(treeDumpEqualOnAnnotations(2417      R"cpp(2418template<typename T>2419struct U {2420  template<typename U>2421  U f();2422};2423struct S {2424  U<int> getU();2425};2426void test(S* sp) {2427  // FIXME: The first 'template' keyword is a child of `NestedNameSpecifier`,2428  // but it should be a child of `MemberExpression` according to the grammar.2429  // However one might argue that the 'template' keyword fits better inside2430  // `NestedNameSpecifier` because if we change `U<int>` to `UI` we would like2431  // equally to change the `NameSpecifier` `template U<int>` to just `UI`.2432  [[sp->getU().template U<int>::template f<int>()]];2433}2434)cpp",2435      {R"txt(2436CallExpression Expression2437|-MemberExpression Callee2438| |-CallExpression Object2439| | |-MemberExpression Callee2440| | | |-IdExpression Object2441| | | | `-UnqualifiedId UnqualifiedId2442| | | |   `-'sp'2443| | | |-'->' AccessToken2444| | | `-IdExpression Member2445| | |   `-UnqualifiedId UnqualifiedId2446| | |     `-'getU'2447| | |-'(' OpenParen2448| | `-')' CloseParen2449| |-'.' AccessToken2450| `-IdExpression Member2451|   |-NestedNameSpecifier Qualifier2452|   | |-SimpleTemplateNameSpecifier ListElement2453|   | | |-'template'2454|   | | |-'U'2455|   | | |-'<'2456|   | | |-'int'2457|   | | `-'>'2458|   | `-'::' ListDelimiter2459|   |-'template' TemplateKeyword2460|   `-UnqualifiedId UnqualifiedId2461|     |-'f'2462|     |-'<'2463|     |-'int'2464|     `-'>'2465|-'(' OpenParen2466`-')' CloseParen2467)txt"}));2468}2469 2470TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_Member) {2471  if (!GetParam().isCXX()) {2472    return;2473  }2474  EXPECT_TRUE(treeDumpEqualOnAnnotations(2475      R"cpp(2476struct S{2477  void f();2478};2479void test(S s) {2480  [[s.f()]];2481}2482)cpp",2483      {R"txt(2484CallExpression Expression2485|-MemberExpression Callee2486| |-IdExpression Object2487| | `-UnqualifiedId UnqualifiedId2488| |   `-'s'2489| |-'.' AccessToken2490| `-IdExpression Member2491|   `-UnqualifiedId UnqualifiedId2492|     `-'f'2493|-'(' OpenParen2494`-')' CloseParen2495)txt"}));2496}2497 2498TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_OperatorParens) {2499  if (!GetParam().isCXX()) {2500    return;2501  }2502  EXPECT_TRUE(treeDumpEqualOnAnnotations(2503      R"cpp(2504struct S {2505  void operator()();2506};2507void test(S s) {2508  [[s()]];2509}2510)cpp",2511      {R"txt(2512CallExpression Expression2513|-IdExpression Callee2514| `-UnqualifiedId UnqualifiedId2515|   `-'s'2516|-'(' OpenParen2517`-')' CloseParen2518)txt"}));2519}2520 2521TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_OperatorParensChaining) {2522  if (!GetParam().isCXX()) {2523    return;2524  }2525  EXPECT_TRUE(treeDumpEqualOnAnnotations(2526      R"cpp(2527struct S {2528  S operator()();2529};2530void test(S s) {2531  [[s()()]];2532}2533)cpp",2534      {R"txt(2535CallExpression Expression2536|-CallExpression Callee2537| |-IdExpression Callee2538| | `-UnqualifiedId UnqualifiedId2539| |   `-'s'2540| |-'(' OpenParen2541| `-')' CloseParen2542|-'(' OpenParen2543`-')' CloseParen2544)txt"}));2545}2546 2547TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_MemberWithThis) {2548  if (!GetParam().isCXX()) {2549    return;2550  }2551  EXPECT_TRUE(treeDumpEqualOnAnnotations(2552      R"cpp(2553struct Base {2554  void f();2555};2556struct S: public Base {2557  void f();2558  void test() {2559    [[this->f()]];2560    [[f()]];2561    [[this->Base::f()]];2562  }2563};2564)cpp",2565      {R"txt(2566CallExpression Expression2567|-MemberExpression Callee2568| |-ThisExpression Object2569| | `-'this' IntroducerKeyword2570| |-'->' AccessToken2571| `-IdExpression Member2572|   `-UnqualifiedId UnqualifiedId2573|     `-'f'2574|-'(' OpenParen2575`-')' CloseParen2576      )txt",2577       R"txt(2578CallExpression Expression2579|-IdExpression Callee2580| `-UnqualifiedId UnqualifiedId2581|   `-'f'2582|-'(' OpenParen2583`-')' CloseParen2584      )txt",2585       R"txt(2586CallExpression Expression2587|-MemberExpression Callee2588| |-ThisExpression Object2589| | `-'this' IntroducerKeyword2590| |-'->' AccessToken2591| `-IdExpression Member2592|   |-NestedNameSpecifier Qualifier2593|   | |-IdentifierNameSpecifier ListElement2594|   | | `-'Base'2595|   | `-'::' ListDelimiter2596|   `-UnqualifiedId UnqualifiedId2597|     `-'f'2598|-'(' OpenParen2599`-')' CloseParen2600)txt"}));2601}2602 2603TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_FunctionPointer) {2604  if (!GetParam().isCXX()) {2605    return;2606  }2607  EXPECT_TRUE(treeDumpEqualOnAnnotations(2608      R"cpp(2609void (*pf)();2610void test() {2611  [[pf()]];2612  [[(*pf)()]];2613}2614)cpp",2615      {R"txt(2616CallExpression Expression2617|-IdExpression Callee2618| `-UnqualifiedId UnqualifiedId2619|   `-'pf'2620|-'(' OpenParen2621`-')' CloseParen2622)txt",2623       R"txt(2624CallExpression Expression2625|-ParenExpression Callee2626| |-'(' OpenParen2627| |-PrefixUnaryOperatorExpression SubExpression2628| | |-'*' OperatorToken2629| | `-IdExpression Operand2630| |   `-UnqualifiedId UnqualifiedId2631| |     `-'pf'2632| `-')' CloseParen2633|-'(' OpenParen2634`-')' CloseParen2635)txt"}));2636}2637 2638TEST_P(BuildSyntaxTreeTest, CallExpression_Callee_MemberFunctionPointer) {2639  if (!GetParam().isCXX()) {2640    return;2641  }2642  EXPECT_TRUE(treeDumpEqualOnAnnotations(2643      R"cpp(2644struct S {2645  void f();2646};2647void test(S s) {2648  void (S::*pmf)();2649  pmf = &S::f;2650  [[(s.*pmf)()]];2651}2652)cpp",2653      {R"txt(2654CallExpression Expression2655|-ParenExpression Callee2656| |-'(' OpenParen2657| |-BinaryOperatorExpression SubExpression2658| | |-IdExpression LeftHandSide2659| | | `-UnqualifiedId UnqualifiedId2660| | |   `-'s'2661| | |-'.*' OperatorToken2662| | `-IdExpression RightHandSide2663| |   `-UnqualifiedId UnqualifiedId2664| |     `-'pmf'2665| `-')' CloseParen2666|-'(' OpenParen2667`-')' CloseParen2668)txt"}));2669}2670 2671TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_Zero) {2672  if (!GetParam().isCXX()) {2673    return;2674  }2675  EXPECT_TRUE(treeDumpEqualOnAnnotations(2676      R"cpp(2677void f();2678void test() {2679  [[f();]]2680}2681)cpp",2682      {R"txt(2683ExpressionStatement Statement2684|-CallExpression Expression2685| |-IdExpression Callee2686| | `-UnqualifiedId UnqualifiedId2687| |   `-'f'2688| |-'(' OpenParen2689| `-')' CloseParen2690`-';'2691)txt"}));2692}2693 2694TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_One) {2695  if (!GetParam().isCXX()) {2696    return;2697  }2698  EXPECT_TRUE(treeDumpEqualOnAnnotations(2699      R"cpp(2700void f(int);2701void test() {2702  [[f(1);]]2703}2704)cpp",2705      {R"txt(2706ExpressionStatement Statement2707|-CallExpression Expression2708| |-IdExpression Callee2709| | `-UnqualifiedId UnqualifiedId2710| |   `-'f'2711| |-'(' OpenParen2712| |-CallArguments Arguments2713| | `-IntegerLiteralExpression ListElement2714| |   `-'1' LiteralToken2715| `-')' CloseParen2716`-';'2717)txt"}));2718}2719 2720TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_Multiple) {2721  if (!GetParam().isCXX()) {2722    return;2723  }2724  EXPECT_TRUE(treeDumpEqualOnAnnotations(2725      R"cpp(2726void f(int, char, float);2727void test() {2728  [[f(1, '2', 3.);]]2729}2730)cpp",2731      {R"txt(2732ExpressionStatement Statement2733|-CallExpression Expression2734| |-IdExpression Callee2735| | `-UnqualifiedId UnqualifiedId2736| |   `-'f'2737| |-'(' OpenParen2738| |-CallArguments Arguments2739| | |-IntegerLiteralExpression ListElement2740| | | `-'1' LiteralToken2741| | |-',' ListDelimiter2742| | |-CharacterLiteralExpression ListElement2743| | | `-''2'' LiteralToken2744| | |-',' ListDelimiter2745| | `-FloatingLiteralExpression ListElement2746| |   `-'3.' LiteralToken2747| `-')' CloseParen2748`-';'2749)txt"}));2750}2751 2752TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_Assignment) {2753  if (!GetParam().isCXX()) {2754    return;2755  }2756  EXPECT_TRUE(treeDumpEqualOnAnnotations(2757      R"cpp(2758void f(int);2759void test(int a) {2760  [[f(a = 1);]]2761}2762)cpp",2763      {R"txt(2764ExpressionStatement Statement2765|-CallExpression Expression2766| |-IdExpression Callee2767| | `-UnqualifiedId UnqualifiedId2768| |   `-'f'2769| |-'(' OpenParen2770| |-CallArguments Arguments2771| | `-BinaryOperatorExpression ListElement2772| |   |-IdExpression LeftHandSide2773| |   | `-UnqualifiedId UnqualifiedId2774| |   |   `-'a'2775| |   |-'=' OperatorToken2776| |   `-IntegerLiteralExpression RightHandSide2777| |     `-'1' LiteralToken2778| `-')' CloseParen2779`-';'2780)txt"}));2781}2782 2783TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_BracedInitList_Empty) {2784  if (!GetParam().isCXX11OrLater()) {2785    return;2786  }2787  EXPECT_TRUE(treeDumpEqualOnAnnotations(2788      R"cpp(2789void f(int[]);2790void test() {2791  [[f({});]]2792}2793)cpp",2794      {R"txt(2795ExpressionStatement Statement2796|-CallExpression Expression2797| |-IdExpression Callee2798| | `-UnqualifiedId UnqualifiedId2799| |   `-'f'2800| |-'(' OpenParen2801| |-CallArguments Arguments2802| | `-UnknownExpression ListElement2803| |   `-UnknownExpression2804| |     |-'{'2805| |     `-'}'2806| `-')' CloseParen2807`-';'2808)txt"}));2809}2810 2811TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_BracedInitList_Simple) {2812  if (!GetParam().isCXX11OrLater()) {2813    return;2814  }2815  EXPECT_TRUE(treeDumpEqualOnAnnotations(2816      R"cpp(2817struct TT {};2818struct T{2819  int a;2820  TT b;2821};2822void f(T);2823void test() {2824  [[f({1, {}});]]2825}2826)cpp",2827      {R"txt(2828ExpressionStatement Statement2829|-CallExpression Expression2830| |-IdExpression Callee2831| | `-UnqualifiedId UnqualifiedId2832| |   `-'f'2833| |-'(' OpenParen2834| |-CallArguments Arguments2835| | `-UnknownExpression ListElement2836| |   `-UnknownExpression2837| |     |-'{'2838| |     |-IntegerLiteralExpression2839| |     | `-'1' LiteralToken2840| |     |-','2841| |     |-UnknownExpression2842| |     | `-UnknownExpression2843| |     |   |-'{'2844| |     |   `-'}'2845| |     `-'}'2846| `-')' CloseParen2847`-';'2848)txt"}));2849}2850 2851TEST_P(BuildSyntaxTreeTest,2852       CallExpression_Arguments_BracedInitList_Designated) {2853  if (!GetParam().isCXX11OrLater()) {2854    return;2855  }2856  EXPECT_TRUE(treeDumpEqualOnAnnotations(2857      R"cpp(2858struct TT {};2859struct T{2860  int a;2861  TT b;2862};2863void f(T);2864void test() {2865  [[f({.a = 1, .b {}});]]2866}2867)cpp",2868      {R"txt(2869ExpressionStatement Statement2870|-CallExpression Expression2871| |-IdExpression Callee2872| | `-UnqualifiedId UnqualifiedId2873| |   `-'f'2874| |-'(' OpenParen2875| |-CallArguments Arguments2876| | `-UnknownExpression ListElement2877| |   `-UnknownExpression2878| |     |-'{'2879| |     |-UnknownExpression2880| |     | |-'.'2881| |     | |-'a'2882| |     | |-'='2883| |     | `-IntegerLiteralExpression2884| |     |   `-'1' LiteralToken2885| |     |-','2886| |     |-UnknownExpression2887| |     | |-'.'2888| |     | |-'b'2889| |     | `-UnknownExpression2890| |     |   `-UnknownExpression2891| |     |     |-'{'2892| |     |     `-'}'2893| |     `-'}'2894| `-')' CloseParen2895`-';'2896)txt"}));2897}2898 2899TEST_P(BuildSyntaxTreeTest, CallExpression_Arguments_ParameterPack) {2900  if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) {2901    return;2902  }2903  EXPECT_TRUE(treeDumpEqualOnAnnotations(2904      R"cpp(2905template<typename T, typename... Args>2906void test(T t, Args... args) {2907  [[test(args...)]];2908}2909)cpp",2910      {R"txt(2911CallExpression Expression2912|-UnknownExpression Callee2913| `-'test'2914|-'(' OpenParen2915|-CallArguments Arguments2916| `-UnknownExpression ListElement2917|   |-IdExpression2918|   | `-UnqualifiedId UnqualifiedId2919|   |   `-'args'2920|   `-'...'2921`-')' CloseParen2922)txt"}));2923}2924 2925TEST_P(BuildSyntaxTreeTest, CallExpression_DefaultArguments) {2926  if (!GetParam().isCXX11OrLater()) {2927    return;2928  }2929  EXPECT_TRUE(treeDumpEqualOnAnnotations(2930      R"cpp(2931void f(int i = 1, char c = '2');2932void test() {2933  [[f()]];2934  [[f(1)]];2935  [[f(1, '2')]];2936}2937)cpp",2938      {R"txt(2939CallExpression Expression2940|-IdExpression Callee2941| `-UnqualifiedId UnqualifiedId2942|   `-'f'2943|-'(' OpenParen2944`-')' CloseParen2945      )txt",2946       R"txt(2947CallExpression Expression2948|-IdExpression Callee2949| `-UnqualifiedId UnqualifiedId2950|   `-'f'2951|-'(' OpenParen2952|-CallArguments Arguments2953| `-IntegerLiteralExpression ListElement2954|   `-'1' LiteralToken2955`-')' CloseParen2956      )txt",2957       R"txt(2958CallExpression Expression2959|-IdExpression Callee2960| `-UnqualifiedId UnqualifiedId2961|   `-'f'2962|-'(' OpenParen2963|-CallArguments Arguments2964| |-IntegerLiteralExpression ListElement2965| | `-'1' LiteralToken2966| |-',' ListDelimiter2967| `-CharacterLiteralExpression ListElement2968|   `-''2'' LiteralToken2969`-')' CloseParen2970)txt"}));2971}2972 2973TEST_P(BuildSyntaxTreeTest, MultipleDeclaratorsGrouping) {2974  EXPECT_TRUE(treeDumpEqual(2975      R"cpp(2976int *a, b;2977int *c, d;2978)cpp",2979      R"txt(2980TranslationUnit Detached2981|-SimpleDeclaration2982| |-'int'2983| |-DeclaratorList Declarators2984| | |-SimpleDeclarator ListElement2985| | | |-'*'2986| | | `-'a'2987| | |-',' ListDelimiter2988| | `-SimpleDeclarator ListElement2989| |   `-'b'2990| `-';'2991`-SimpleDeclaration2992  |-'int'2993  |-DeclaratorList Declarators2994  | |-SimpleDeclarator ListElement2995  | | |-'*'2996  | | `-'c'2997  | |-',' ListDelimiter2998  | `-SimpleDeclarator ListElement2999  |   `-'d'3000  `-';'3001)txt"));3002}3003 3004TEST_P(BuildSyntaxTreeTest, MultipleDeclaratorsGroupingTypedef) {3005  EXPECT_TRUE(treeDumpEqual(3006      R"cpp(3007typedef int *a, b;3008)cpp",3009      R"txt(3010TranslationUnit Detached3011`-SimpleDeclaration3012  |-'typedef'3013  |-'int'3014  |-DeclaratorList Declarators3015  | |-SimpleDeclarator ListElement3016  | | |-'*'3017  | | `-'a'3018  | |-',' ListDelimiter3019  | `-SimpleDeclarator ListElement3020  |   `-'b'3021  `-';'3022)txt"));3023}3024 3025TEST_P(BuildSyntaxTreeTest, MultipleDeclaratorsInsideStatement) {3026  EXPECT_TRUE(treeDumpEqual(3027      R"cpp(3028void foo() {3029  int *a, b;3030  typedef int *ta, tb;3031}3032)cpp",3033      R"txt(3034TranslationUnit Detached3035`-SimpleDeclaration3036  |-'void'3037  |-DeclaratorList Declarators3038  | `-SimpleDeclarator ListElement3039  |   |-'foo'3040  |   `-ParametersAndQualifiers3041  |     |-'(' OpenParen3042  |     `-')' CloseParen3043  `-CompoundStatement3044    |-'{' OpenParen3045    |-DeclarationStatement Statement3046    | |-SimpleDeclaration3047    | | |-'int'3048    | | `-DeclaratorList Declarators3049    | |   |-SimpleDeclarator ListElement3050    | |   | |-'*'3051    | |   | `-'a'3052    | |   |-',' ListDelimiter3053    | |   `-SimpleDeclarator ListElement3054    | |     `-'b'3055    | `-';'3056    |-DeclarationStatement Statement3057    | |-SimpleDeclaration3058    | | |-'typedef'3059    | | |-'int'3060    | | `-DeclaratorList Declarators3061    | |   |-SimpleDeclarator ListElement3062    | |   | |-'*'3063    | |   | `-'ta'3064    | |   |-',' ListDelimiter3065    | |   `-SimpleDeclarator ListElement3066    | |     `-'tb'3067    | `-';'3068    `-'}' CloseParen3069)txt"));3070}3071 3072TEST_P(BuildSyntaxTreeTest, SizeTTypedef) {3073  if (!GetParam().isCXX11OrLater()) {3074    return;3075  }3076  EXPECT_TRUE(treeDumpEqual(3077      R"cpp(3078typedef decltype(sizeof(void *)) size_t;3079    )cpp",3080      R"txt(3081TranslationUnit Detached3082`-SimpleDeclaration3083  |-'typedef'3084  |-'decltype'3085  |-'('3086  |-UnknownExpression3087  | |-'sizeof'3088  | |-'('3089  | |-'void'3090  | |-'*'3091  | `-')'3092  |-')'3093  |-DeclaratorList Declarators3094  | `-SimpleDeclarator ListElement3095  |   `-'size_t'3096  `-';'3097)txt"));3098}3099 3100TEST_P(BuildSyntaxTreeTest, Namespace_Nested) {3101  if (!GetParam().isCXX()) {3102    return;3103  }3104  EXPECT_TRUE(treeDumpEqual(3105      R"cpp(3106namespace a { namespace b {} }3107)cpp",3108      R"txt(3109TranslationUnit Detached3110`-NamespaceDefinition3111  |-'namespace'3112  |-'a'3113  |-'{'3114  |-NamespaceDefinition3115  | |-'namespace'3116  | |-'b'3117  | |-'{'3118  | `-'}'3119  `-'}'3120)txt"));3121}3122 3123TEST_P(BuildSyntaxTreeTest, Namespace_NestedDefinition) {3124  if (!GetParam().isCXX17OrLater()) {3125    return;3126  }3127  EXPECT_TRUE(treeDumpEqual(3128      R"cpp(3129namespace a::b {}3130)cpp",3131      R"txt(3132TranslationUnit Detached3133`-NamespaceDefinition3134  |-'namespace'3135  |-'a'3136  |-'::'3137  |-'b'3138  |-'{'3139  `-'}'3140)txt"));3141}3142 3143TEST_P(BuildSyntaxTreeTest, Namespace_Unnamed) {3144  if (!GetParam().isCXX()) {3145    return;3146  }3147  EXPECT_TRUE(treeDumpEqual(3148      R"cpp(3149namespace {}3150)cpp",3151      R"txt(3152TranslationUnit Detached3153`-NamespaceDefinition3154  |-'namespace'3155  |-'{'3156  `-'}'3157)txt"));3158}3159 3160TEST_P(BuildSyntaxTreeTest, Namespace_Alias) {3161  if (!GetParam().isCXX()) {3162    return;3163  }3164  EXPECT_TRUE(treeDumpEqualOnAnnotations(3165      R"cpp(3166namespace a {}3167[[namespace foo = a;]]3168)cpp",3169      {R"txt(3170NamespaceAliasDefinition3171|-'namespace'3172|-'foo'3173|-'='3174|-'a'3175`-';'3176)txt"}));3177}3178 3179TEST_P(BuildSyntaxTreeTest, UsingDirective) {3180  if (!GetParam().isCXX()) {3181    return;3182  }3183  EXPECT_TRUE(treeDumpEqualOnAnnotations(3184      R"cpp(3185namespace ns {}3186[[using namespace ::ns;]]3187)cpp",3188      {R"txt(3189UsingNamespaceDirective3190|-'using'3191|-'namespace'3192|-NestedNameSpecifier3193| `-'::' ListDelimiter3194|-'ns'3195`-';'3196)txt"}));3197}3198 3199TEST_P(BuildSyntaxTreeTest, UsingDeclaration_Namespace) {3200  if (!GetParam().isCXX()) {3201    return;3202  }3203  EXPECT_TRUE(treeDumpEqualOnAnnotations(3204      R"cpp(3205namespace ns { int a; }3206[[using ns::a;]]3207)cpp",3208      {R"txt(3209UsingDeclaration3210|-'using'3211|-NestedNameSpecifier3212| |-IdentifierNameSpecifier ListElement3213| | `-'ns'3214| `-'::' ListDelimiter3215|-'a'3216`-';'3217)txt"}));3218}3219 3220TEST_P(BuildSyntaxTreeTest, UsingDeclaration_ClassMember) {3221  if (!GetParam().isCXX()) {3222    return;3223  }3224  EXPECT_TRUE(treeDumpEqualOnAnnotations(3225      R"cpp(3226template <class T> struct X {3227  [[using T::foo;]]3228  [[using typename T::bar;]]3229};3230)cpp",3231      {R"txt(3232UsingDeclaration3233|-'using'3234|-NestedNameSpecifier3235| |-IdentifierNameSpecifier ListElement3236| | `-'T'3237| `-'::' ListDelimiter3238|-'foo'3239`-';'3240)txt",3241       R"txt(3242UsingDeclaration3243|-'using'3244|-'typename'3245|-NestedNameSpecifier3246| |-IdentifierNameSpecifier ListElement3247| | `-'T'3248| `-'::' ListDelimiter3249|-'bar'3250`-';'3251)txt"}));3252}3253 3254TEST_P(BuildSyntaxTreeTest, UsingTypeAlias) {3255  if (!GetParam().isCXX11OrLater()) {3256    return;3257  }3258  EXPECT_TRUE(treeDumpEqual(3259      R"cpp(3260using type = int;3261)cpp",3262      R"txt(3263TranslationUnit Detached3264`-TypeAliasDeclaration3265  |-'using'3266  |-'type'3267  |-'='3268  |-'int'3269  `-';'3270)txt"));3271}3272 3273TEST_P(BuildSyntaxTreeTest, FreeStandingClass_ForwardDeclaration) {3274  EXPECT_TRUE(treeDumpEqualOnAnnotations(3275      R"cpp(3276[[struct X;]]3277[[struct Y *y1;]]3278)cpp",3279      {R"txt(3280SimpleDeclaration3281|-'struct'3282|-'X'3283`-';'3284)txt",3285       R"txt(3286SimpleDeclaration3287|-'struct'3288|-'Y'3289|-DeclaratorList Declarators3290| `-SimpleDeclarator ListElement3291|   |-'*'3292|   `-'y1'3293`-';'3294)txt"}));3295}3296 3297TEST_P(BuildSyntaxTreeTest, FreeStandingClasses_Definition) {3298  EXPECT_TRUE(treeDumpEqualOnAnnotations(3299      R"cpp(3300[[struct X {};]]3301[[struct Y {} *y2;]]3302[[struct {} *a1;]]3303)cpp",3304      {R"txt(3305SimpleDeclaration3306|-'struct'3307|-'X'3308|-'{'3309|-'}'3310`-';'3311)txt",3312       R"txt(3313SimpleDeclaration3314|-'struct'3315|-'Y'3316|-'{'3317|-'}'3318|-DeclaratorList Declarators3319| `-SimpleDeclarator ListElement3320|   |-'*'3321|   `-'y2'3322`-';'3323)txt",3324       R"txt(3325SimpleDeclaration3326|-'struct'3327|-'{'3328|-'}'3329|-DeclaratorList Declarators3330| `-SimpleDeclarator ListElement3331|   |-'*'3332|   `-'a1'3333`-';'3334)txt"}));3335}3336 3337TEST_P(BuildSyntaxTreeTest, StaticMemberFunction) {3338  if (!GetParam().isCXX11OrLater()) {3339    return;3340  }3341  EXPECT_TRUE(treeDumpEqualOnAnnotations(3342      R"cpp(3343struct S {3344  [[static void f(){}]]3345};3346)cpp",3347      {R"txt(3348SimpleDeclaration3349|-'static'3350|-'void'3351|-DeclaratorList Declarators3352| `-SimpleDeclarator ListElement3353|   |-'f'3354|   `-ParametersAndQualifiers3355|     |-'(' OpenParen3356|     `-')' CloseParen3357`-CompoundStatement3358  |-'{' OpenParen3359  `-'}' CloseParen3360)txt"}));3361}3362 3363TEST_P(BuildSyntaxTreeTest, OutOfLineMemberFunctionDefinition) {3364  if (!GetParam().isCXX11OrLater()) {3365    return;3366  }3367  EXPECT_TRUE(treeDumpEqualOnAnnotations(3368      R"cpp(3369struct S {3370  void f();3371};3372[[void S::f(){}]]3373)cpp",3374      {R"txt(3375SimpleDeclaration3376|-'void'3377|-DeclaratorList Declarators3378| `-SimpleDeclarator ListElement3379|   |-NestedNameSpecifier3380|   | |-IdentifierNameSpecifier ListElement3381|   | | `-'S'3382|   | `-'::' ListDelimiter3383|   |-'f'3384|   `-ParametersAndQualifiers3385|     |-'(' OpenParen3386|     `-')' CloseParen3387`-CompoundStatement3388  |-'{' OpenParen3389  `-'}' CloseParen3390)txt"}));3391}3392 3393TEST_P(BuildSyntaxTreeTest, ConversionMemberFunction) {3394  if (!GetParam().isCXX()) {3395    return;3396  }3397  EXPECT_TRUE(treeDumpEqualOnAnnotations(3398      R"cpp(3399struct X {3400  [[operator int();]]3401};3402)cpp",3403      {R"txt(3404SimpleDeclaration3405|-DeclaratorList Declarators3406| `-SimpleDeclarator ListElement3407|   |-'operator'3408|   |-'int'3409|   `-ParametersAndQualifiers3410|     |-'(' OpenParen3411|     `-')' CloseParen3412`-';'3413)txt"}));3414}3415 3416TEST_P(BuildSyntaxTreeTest, LiteralOperatorDeclaration) {3417  if (!GetParam().isCXX11OrLater()) {3418    return;3419  }3420  EXPECT_TRUE(treeDumpEqual(3421      R"cpp(3422unsigned operator "" _c(char);3423    )cpp",3424      R"txt(3425TranslationUnit Detached3426`-SimpleDeclaration3427  |-'unsigned'3428  |-DeclaratorList Declarators3429  | `-SimpleDeclarator ListElement3430  |   |-'operator'3431  |   |-'""'3432  |   |-'_c'3433  |   `-ParametersAndQualifiers3434  |     |-'(' OpenParen3435  |     |-ParameterDeclarationList Parameters3436  |     | `-SimpleDeclaration ListElement3437  |     |   `-'char'3438  |     `-')' CloseParen3439  `-';'3440)txt"));3441}3442 3443TEST_P(BuildSyntaxTreeTest, NumericLiteralOperatorTemplateDeclaration) {3444  if (!GetParam().isCXX11OrLater()) {3445    return;3446  }3447  EXPECT_TRUE(treeDumpEqual(3448      R"cpp(3449template <char...>3450unsigned operator "" _t();3451    )cpp",3452      R"txt(3453TranslationUnit Detached3454`-TemplateDeclaration Declaration3455  |-'template' IntroducerKeyword3456  |-'<'3457  |-SimpleDeclaration3458  | `-'char'3459  |-'...'3460  |-'>'3461  `-SimpleDeclaration3462    |-'unsigned'3463    |-DeclaratorList Declarators3464    | `-SimpleDeclarator ListElement3465    |   |-'operator'3466    |   |-'""'3467    |   |-'_t'3468    |   `-ParametersAndQualifiers3469    |     |-'(' OpenParen3470    |     `-')' CloseParen3471    `-';'3472)txt"));3473}3474 3475TEST_P(BuildSyntaxTreeTest, OverloadedOperatorDeclaration) {3476  if (!GetParam().isCXX()) {3477    return;3478  }3479  EXPECT_TRUE(treeDumpEqualOnAnnotations(3480      R"cpp(3481struct X {3482  [[X& operator=(const X&);]]3483};3484)cpp",3485      {R"txt(3486SimpleDeclaration3487|-'X'3488|-DeclaratorList Declarators3489| `-SimpleDeclarator ListElement3490|   |-'&'3491|   |-'operator'3492|   |-'='3493|   `-ParametersAndQualifiers3494|     |-'(' OpenParen3495|     |-ParameterDeclarationList Parameters3496|     | `-SimpleDeclaration ListElement3497|     |   |-'const'3498|     |   |-'X'3499|     |   `-DeclaratorList Declarators3500|     |     `-SimpleDeclarator ListElement3501|     |       `-'&'3502|     `-')' CloseParen3503`-';'3504)txt"}));3505}3506 3507TEST_P(BuildSyntaxTreeTest, OverloadedOperatorFriendDeclaration) {3508  if (!GetParam().isCXX()) {3509    return;3510  }3511  EXPECT_TRUE(treeDumpEqualOnAnnotations(3512      R"cpp(3513struct X {3514  [[friend X operator+(X, const X&);]]3515};3516)cpp",3517      {R"txt(3518UnknownDeclaration3519`-SimpleDeclaration3520  |-'friend'3521  |-'X'3522  |-DeclaratorList Declarators3523  | `-SimpleDeclarator ListElement3524  |   |-'operator'3525  |   |-'+'3526  |   `-ParametersAndQualifiers3527  |     |-'(' OpenParen3528  |     |-ParameterDeclarationList Parameters3529  |     | |-SimpleDeclaration ListElement3530  |     | | `-'X'3531  |     | |-',' ListDelimiter3532  |     | `-SimpleDeclaration ListElement3533  |     |   |-'const'3534  |     |   |-'X'3535  |     |   `-DeclaratorList Declarators3536  |     |     `-SimpleDeclarator ListElement3537  |     |       `-'&'3538  |     `-')' CloseParen3539  `-';'3540)txt"}));3541}3542 3543TEST_P(BuildSyntaxTreeTest, ClassTemplateDeclaration) {3544  if (!GetParam().isCXX()) {3545    return;3546  }3547  EXPECT_TRUE(treeDumpEqual(3548      R"cpp(3549template<typename T>3550struct ST {};3551)cpp",3552      R"txt(3553TranslationUnit Detached3554`-TemplateDeclaration Declaration3555  |-'template' IntroducerKeyword3556  |-'<'3557  |-UnknownDeclaration3558  | |-'typename'3559  | `-'T'3560  |-'>'3561  `-SimpleDeclaration3562    |-'struct'3563    |-'ST'3564    |-'{'3565    |-'}'3566    `-';'3567)txt"));3568}3569 3570TEST_P(BuildSyntaxTreeTest, FunctionTemplateDeclaration) {3571  if (!GetParam().isCXX()) {3572    return;3573  }3574  EXPECT_TRUE(treeDumpEqual(3575      R"cpp(3576template<typename T>3577T f();3578)cpp",3579      R"txt(3580TranslationUnit Detached3581`-TemplateDeclaration Declaration3582  |-'template' IntroducerKeyword3583  |-'<'3584  |-UnknownDeclaration3585  | |-'typename'3586  | `-'T'3587  |-'>'3588  `-SimpleDeclaration3589    |-'T'3590    |-DeclaratorList Declarators3591    | `-SimpleDeclarator ListElement3592    |   |-'f'3593    |   `-ParametersAndQualifiers3594    |     |-'(' OpenParen3595    |     `-')' CloseParen3596    `-';'3597)txt"));3598}3599 3600TEST_P(BuildSyntaxTreeTest, VariableTemplateDeclaration) {3601  if (!GetParam().isCXX14OrLater()) {3602    return;3603  }3604  EXPECT_TRUE(treeDumpEqual(3605      R"cpp(3606template <class T> T var = 10;3607)cpp",3608      R"txt(3609TranslationUnit Detached3610`-TemplateDeclaration Declaration3611  |-'template' IntroducerKeyword3612  |-'<'3613  |-UnknownDeclaration3614  | |-'class'3615  | `-'T'3616  |-'>'3617  `-SimpleDeclaration3618    |-'T'3619    |-DeclaratorList Declarators3620    | `-SimpleDeclarator ListElement3621    |   |-'var'3622    |   |-'='3623    |   `-IntegerLiteralExpression3624    |     `-'10' LiteralToken3625    `-';'3626)txt"));3627}3628 3629TEST_P(BuildSyntaxTreeTest, StaticMemberFunctionTemplate) {3630  if (!GetParam().isCXX()) {3631    return;3632  }3633  EXPECT_TRUE(treeDumpEqualOnAnnotations(3634      R"cpp(3635struct S {3636  [[template<typename U>3637  static U f();]]3638};3639)cpp",3640      {R"txt(3641TemplateDeclaration Declaration3642|-'template' IntroducerKeyword3643|-'<'3644|-UnknownDeclaration3645| |-'typename'3646| `-'U'3647|-'>'3648`-SimpleDeclaration3649  |-'static'3650  |-'U'3651  |-DeclaratorList Declarators3652  | `-SimpleDeclarator ListElement3653  |   |-'f'3654  |   `-ParametersAndQualifiers3655  |     |-'(' OpenParen3656  |     `-')' CloseParen3657  `-';'3658)txt"}));3659}3660 3661TEST_P(BuildSyntaxTreeTest, NestedTemplates) {3662  if (!GetParam().isCXX()) {3663    return;3664  }3665  EXPECT_TRUE(treeDumpEqual(3666      R"cpp(3667template <class T>3668struct X {3669  template <class U>3670  U foo();3671};3672)cpp",3673      R"txt(3674TranslationUnit Detached3675`-TemplateDeclaration Declaration3676  |-'template' IntroducerKeyword3677  |-'<'3678  |-UnknownDeclaration3679  | |-'class'3680  | `-'T'3681  |-'>'3682  `-SimpleDeclaration3683    |-'struct'3684    |-'X'3685    |-'{'3686    |-TemplateDeclaration Declaration3687    | |-'template' IntroducerKeyword3688    | |-'<'3689    | |-UnknownDeclaration3690    | | |-'class'3691    | | `-'U'3692    | |-'>'3693    | `-SimpleDeclaration3694    |   |-'U'3695    |   |-DeclaratorList Declarators3696    |   | `-SimpleDeclarator ListElement3697    |   |   |-'foo'3698    |   |   `-ParametersAndQualifiers3699    |   |     |-'(' OpenParen3700    |   |     `-')' CloseParen3701    |   `-';'3702    |-'}'3703    `-';'3704)txt"));3705}3706 3707TEST_P(BuildSyntaxTreeTest, NestedTemplatesInNamespace) {3708  if (!GetParam().isCXX()) {3709    return;3710  }3711  EXPECT_TRUE(treeDumpEqual(3712      R"cpp(3713namespace n {3714  template<typename T>3715  struct ST {3716    template<typename U>3717    static U f();3718  };3719}3720)cpp",3721      R"txt(3722TranslationUnit Detached3723`-NamespaceDefinition3724  |-'namespace'3725  |-'n'3726  |-'{'3727  |-TemplateDeclaration Declaration3728  | |-'template' IntroducerKeyword3729  | |-'<'3730  | |-UnknownDeclaration3731  | | |-'typename'3732  | | `-'T'3733  | |-'>'3734  | `-SimpleDeclaration3735  |   |-'struct'3736  |   |-'ST'3737  |   |-'{'3738  |   |-TemplateDeclaration Declaration3739  |   | |-'template' IntroducerKeyword3740  |   | |-'<'3741  |   | |-UnknownDeclaration3742  |   | | |-'typename'3743  |   | | `-'U'3744  |   | |-'>'3745  |   | `-SimpleDeclaration3746  |   |   |-'static'3747  |   |   |-'U'3748  |   |   |-DeclaratorList Declarators3749  |   |   | `-SimpleDeclarator ListElement3750  |   |   |   |-'f'3751  |   |   |   `-ParametersAndQualifiers3752  |   |   |     |-'(' OpenParen3753  |   |   |     `-')' CloseParen3754  |   |   `-';'3755  |   |-'}'3756  |   `-';'3757  `-'}'3758)txt"));3759}3760 3761TEST_P(BuildSyntaxTreeTest, ClassTemplate_MemberClassDefinition) {3762  if (!GetParam().isCXX()) {3763    return;3764  }3765  EXPECT_TRUE(treeDumpEqualOnAnnotations(3766      R"cpp(3767template <class T> struct X { struct Y; };3768[[template <class T> struct X<T>::Y {};]]3769)cpp",3770      {R"txt(3771TemplateDeclaration Declaration3772|-'template' IntroducerKeyword3773|-'<'3774|-UnknownDeclaration3775| |-'class'3776| `-'T'3777|-'>'3778`-SimpleDeclaration3779  |-'struct'3780  |-NestedNameSpecifier3781  | |-SimpleTemplateNameSpecifier ListElement3782  | | |-'X'3783  | | |-'<'3784  | | |-'T'3785  | | `-'>'3786  | `-'::' ListDelimiter3787  |-'Y'3788  |-'{'3789  |-'}'3790  `-';'3791)txt"}));3792}3793 3794TEST_P(BuildSyntaxTreeTest, ExplicitClassTemplateInstantiation_Definition) {3795  if (!GetParam().isCXX()) {3796    return;3797  }3798  EXPECT_TRUE(treeDumpEqualOnAnnotations(3799      R"cpp(3800template <class T> struct X {};3801[[template struct X<double>;]]3802)cpp",3803      {R"txt(3804ExplicitTemplateInstantiation3805|-'template' IntroducerKeyword3806`-SimpleDeclaration Declaration3807  |-'struct'3808  |-'X'3809  |-'<'3810  |-'double'3811  |-'>'3812  `-';'3813)txt"}));3814}3815 3816TEST_P(BuildSyntaxTreeTest, ExplicitClassTemplateInstantiation_Declaration) {3817  if (!GetParam().isCXX()) {3818    return;3819  }3820  EXPECT_TRUE(treeDumpEqualOnAnnotations(3821      R"cpp(3822template <class T> struct X {};3823[[extern template struct X<float>;]]3824)cpp",3825      {R"txt(3826ExplicitTemplateInstantiation3827|-'extern' ExternKeyword3828|-'template' IntroducerKeyword3829`-SimpleDeclaration Declaration3830  |-'struct'3831  |-'X'3832  |-'<'3833  |-'float'3834  |-'>'3835  `-';'3836)txt"}));3837}3838 3839TEST_P(BuildSyntaxTreeTest, ClassTemplateSpecialization_Partial) {3840  if (!GetParam().isCXX()) {3841    return;3842  }3843  EXPECT_TRUE(treeDumpEqualOnAnnotations(3844      R"cpp(3845template <class T> struct X {};3846[[template <class T> struct X<T*> {};]]3847)cpp",3848      {R"txt(3849TemplateDeclaration Declaration3850|-'template' IntroducerKeyword3851|-'<'3852|-UnknownDeclaration3853| |-'class'3854| `-'T'3855|-'>'3856`-SimpleDeclaration3857  |-'struct'3858  |-'X'3859  |-'<'3860  |-'T'3861  |-'*'3862  |-'>'3863  |-'{'3864  |-'}'3865  `-';'3866)txt"}));3867}3868 3869TEST_P(BuildSyntaxTreeTest, ClassTemplateSpecialization_Full) {3870  if (!GetParam().isCXX()) {3871    return;3872  }3873  EXPECT_TRUE(treeDumpEqualOnAnnotations(3874      R"cpp(3875template <class T> struct X {};3876[[template <> struct X<int> {};]]3877)cpp",3878      {R"txt(3879TemplateDeclaration Declaration3880|-'template' IntroducerKeyword3881|-'<'3882|-'>'3883`-SimpleDeclaration3884  |-'struct'3885  |-'X'3886  |-'<'3887  |-'int'3888  |-'>'3889  |-'{'3890  |-'}'3891  `-';'3892)txt"}));3893}3894 3895TEST_P(BuildSyntaxTreeTest, EmptyDeclaration) {3896  EXPECT_TRUE(treeDumpEqual(3897      R"cpp(3898;3899)cpp",3900      R"txt(3901TranslationUnit Detached3902`-EmptyDeclaration3903  `-';'3904)txt"));3905}3906 3907TEST_P(BuildSyntaxTreeTest, StaticAssert) {3908  if (!GetParam().isCXX11OrLater()) {3909    return;3910  }3911  EXPECT_TRUE(treeDumpEqual(3912      R"cpp(3913static_assert(true, "message");3914)cpp",3915      R"txt(3916TranslationUnit Detached3917`-StaticAssertDeclaration3918  |-'static_assert'3919  |-'('3920  |-BoolLiteralExpression Condition3921  | `-'true' LiteralToken3922  |-','3923  |-StringLiteralExpression Message3924  | `-'"message"' LiteralToken3925  |-')'3926  `-';'3927)txt"));3928}3929 3930TEST_P(BuildSyntaxTreeTest, StaticAssert_WithoutMessage) {3931  if (!GetParam().isCXX17OrLater()) {3932    return;3933  }3934  EXPECT_TRUE(treeDumpEqual(3935      R"cpp(3936static_assert(true);3937)cpp",3938      R"txt(3939TranslationUnit Detached3940`-StaticAssertDeclaration3941  |-'static_assert'3942  |-'('3943  |-BoolLiteralExpression Condition3944  | `-'true' LiteralToken3945  |-')'3946  `-';'3947)txt"));3948}3949 3950TEST_P(BuildSyntaxTreeTest, ExternC) {3951  if (!GetParam().isCXX()) {3952    return;3953  }3954  EXPECT_TRUE(treeDumpEqual(3955      R"cpp(3956extern "C" int a;3957extern "C" { int b; int c; }3958)cpp",3959      R"txt(3960TranslationUnit Detached3961|-LinkageSpecificationDeclaration3962| |-'extern'3963| |-'"C"'3964| `-SimpleDeclaration3965|   |-'int'3966|   |-DeclaratorList Declarators3967|   | `-SimpleDeclarator ListElement3968|   |   `-'a'3969|   `-';'3970`-LinkageSpecificationDeclaration3971  |-'extern'3972  |-'"C"'3973  |-'{'3974  |-SimpleDeclaration3975  | |-'int'3976  | |-DeclaratorList Declarators3977  | | `-SimpleDeclarator ListElement3978  | |   `-'b'3979  | `-';'3980  |-SimpleDeclaration3981  | |-'int'3982  | |-DeclaratorList Declarators3983  | | `-SimpleDeclarator ListElement3984  | |   `-'c'3985  | `-';'3986  `-'}'3987)txt"));3988}3989 3990TEST_P(BuildSyntaxTreeTest, Macro_ObjectLike_Leaf) {3991  // All nodes can be mutated.3992  EXPECT_TRUE(treeDumpEqual(3993      R"cpp(3994#define OPEN {3995#define CLOSE }3996 3997void test() {3998  OPEN3999    1;4000  CLOSE4001 4002  OPEN4003    2;4004  }4005}4006)cpp",4007      R"txt(4008TranslationUnit Detached4009`-SimpleDeclaration4010  |-'void'4011  |-DeclaratorList Declarators4012  | `-SimpleDeclarator ListElement4013  |   |-'test'4014  |   `-ParametersAndQualifiers4015  |     |-'(' OpenParen4016  |     `-')' CloseParen4017  `-CompoundStatement4018    |-'{' OpenParen4019    |-CompoundStatement Statement4020    | |-'{' OpenParen4021    | |-ExpressionStatement Statement4022    | | |-IntegerLiteralExpression Expression4023    | | | `-'1' LiteralToken4024    | | `-';'4025    | `-'}' CloseParen4026    |-CompoundStatement Statement4027    | |-'{' OpenParen4028    | |-ExpressionStatement Statement4029    | | |-IntegerLiteralExpression Expression4030    | | | `-'2' LiteralToken4031    | | `-';'4032    | `-'}' CloseParen4033    `-'}' CloseParen4034)txt"));4035}4036 4037TEST_P(BuildSyntaxTreeTest, Macro_ObjectLike_MatchTree) {4038  // Some nodes are unmodifiable, they are marked with 'unmodifiable'.4039  EXPECT_TRUE(treeDumpEqual(4040      R"cpp(4041#define BRACES {}4042 4043void test() BRACES4044)cpp",4045      R"txt(4046TranslationUnit Detached4047`-SimpleDeclaration4048  |-'void'4049  |-DeclaratorList Declarators4050  | `-SimpleDeclarator ListElement4051  |   |-'test'4052  |   `-ParametersAndQualifiers4053  |     |-'(' OpenParen4054  |     `-')' CloseParen4055  `-CompoundStatement4056    |-'{' OpenParen unmodifiable4057    `-'}' CloseParen unmodifiable4058)txt"));4059}4060 4061TEST_P(BuildSyntaxTreeTest, Macro_ObjectLike_MismatchTree) {4062  EXPECT_TRUE(treeDumpEqual(4063      R"cpp(4064#define HALF_IF if (1+4065#define HALF_IF_2 1) {}4066void test() {4067  HALF_IF HALF_IF_2 else {}4068})cpp",4069      R"txt(4070TranslationUnit Detached4071`-SimpleDeclaration4072  |-'void'4073  |-DeclaratorList Declarators4074  | `-SimpleDeclarator ListElement4075  |   |-'test'4076  |   `-ParametersAndQualifiers4077  |     |-'(' OpenParen4078  |     `-')' CloseParen4079  `-CompoundStatement4080    |-'{' OpenParen4081    |-IfStatement Statement4082    | |-'if' IntroducerKeyword unmodifiable4083    | |-'(' unmodifiable4084    | |-ExpressionStatement Condition unmodifiable4085    | | `-BinaryOperatorExpression Expression unmodifiable4086    | |   |-IntegerLiteralExpression LeftHandSide unmodifiable4087    | |   | `-'1' LiteralToken unmodifiable4088    | |   |-'+' OperatorToken unmodifiable4089    | |   `-IntegerLiteralExpression RightHandSide unmodifiable4090    | |     `-'1' LiteralToken unmodifiable4091    | |-')' unmodifiable4092    | |-CompoundStatement ThenStatement unmodifiable4093    | | |-'{' OpenParen unmodifiable4094    | | `-'}' CloseParen unmodifiable4095    | |-'else' ElseKeyword4096    | `-CompoundStatement ElseStatement4097    |   |-'{' OpenParen4098    |   `-'}' CloseParen4099    `-'}' CloseParen4100)txt"));4101}4102 4103TEST_P(BuildSyntaxTreeTest, Macro_FunctionLike_ModifiableArguments) {4104  // FIXME: Note that the substitutions for `X` and `Y` are marked modifiable.4105  // However we cannot change `X` freely. Indeed if we change its substitution4106  // in the condition we should also change it the then-branch.4107  EXPECT_TRUE(treeDumpEqual(4108      R"cpp(4109#define MIN(X,Y) X < Y ? X : Y4110 4111void test() {4112  MIN(1,2);4113}4114)cpp",4115      R"txt(4116TranslationUnit Detached4117`-SimpleDeclaration4118  |-'void'4119  |-DeclaratorList Declarators4120  | `-SimpleDeclarator ListElement4121  |   |-'test'4122  |   `-ParametersAndQualifiers4123  |     |-'(' OpenParen4124  |     `-')' CloseParen4125  `-CompoundStatement4126    |-'{' OpenParen4127    |-ExpressionStatement Statement4128    | |-UnknownExpression Expression4129    | | |-BinaryOperatorExpression unmodifiable4130    | | | |-IntegerLiteralExpression LeftHandSide4131    | | | | `-'1' LiteralToken4132    | | | |-'<' OperatorToken unmodifiable4133    | | | `-IntegerLiteralExpression RightHandSide4134    | | |   `-'2' LiteralToken4135    | | |-'?' unmodifiable4136    | | |-IntegerLiteralExpression4137    | | | `-'1' LiteralToken4138    | | |-':' unmodifiable4139    | | `-IntegerLiteralExpression4140    | |   `-'2' LiteralToken4141    | `-';'4142    `-'}' CloseParen4143)txt"));4144}4145 4146TEST_P(BuildSyntaxTreeTest, Macro_FunctionLike_MismatchTree) {4147  EXPECT_TRUE(treeDumpEqual(4148      R"cpp(4149#define HALF_IF(X) if (X &&4150#define HALF_IF_2(Y) Y) {}4151void test() {4152  HALF_IF(1) HALF_IF_2(0) else {}4153})cpp",4154      R"txt(4155TranslationUnit Detached4156`-SimpleDeclaration4157  |-'void'4158  |-DeclaratorList Declarators4159  | `-SimpleDeclarator ListElement4160  |   |-'test'4161  |   `-ParametersAndQualifiers4162  |     |-'(' OpenParen4163  |     `-')' CloseParen4164  `-CompoundStatement4165    |-'{' OpenParen4166    |-IfStatement Statement4167    | |-'if' IntroducerKeyword unmodifiable4168    | |-'(' unmodifiable4169    | |-ExpressionStatement Condition unmodifiable4170    | | `-BinaryOperatorExpression Expression unmodifiable4171    | |   |-IntegerLiteralExpression LeftHandSide4172    | |   | `-'1' LiteralToken4173    | |   |-'&&' OperatorToken unmodifiable4174    | |   `-IntegerLiteralExpression RightHandSide4175    | |     `-'0' LiteralToken4176    | |-')' unmodifiable4177    | |-CompoundStatement ThenStatement unmodifiable4178    | | |-'{' OpenParen unmodifiable4179    | | `-'}' CloseParen unmodifiable4180    | |-'else' ElseKeyword4181    | `-CompoundStatement ElseStatement4182    |   |-'{' OpenParen4183    |   `-'}' CloseParen4184    `-'}' CloseParen4185)txt"));4186}4187 4188TEST_P(BuildSyntaxTreeTest, Macro_FunctionLike_Variadic) {4189  EXPECT_TRUE(treeDumpEqualOnAnnotations(4190      R"cpp(4191#define CALL(F_NAME, ...) F_NAME(__VA_ARGS__)4192 4193void f(int);4194void g(int, int);4195void test() [[{4196  CALL(f, 0);4197  CALL(g, 0, 1);4198}]]4199)cpp",4200      {R"txt(4201CompoundStatement4202|-'{' OpenParen4203|-ExpressionStatement Statement4204| |-CallExpression Expression4205| | |-IdExpression Callee4206| | | `-UnqualifiedId UnqualifiedId4207| | |   `-'f'4208| | |-'(' OpenParen unmodifiable4209| | |-CallArguments Arguments4210| | | `-IntegerLiteralExpression ListElement4211| | |   `-'0' LiteralToken4212| | `-')' CloseParen unmodifiable4213| `-';'4214|-ExpressionStatement Statement4215| |-CallExpression Expression4216| | |-IdExpression Callee4217| | | `-UnqualifiedId UnqualifiedId4218| | |   `-'g'4219| | |-'(' OpenParen unmodifiable4220| | |-CallArguments Arguments4221| | | |-IntegerLiteralExpression ListElement4222| | | | `-'0' LiteralToken4223| | | |-',' ListDelimiter4224| | | `-IntegerLiteralExpression ListElement4225| | |   `-'1' LiteralToken4226| | `-')' CloseParen unmodifiable4227| `-';'4228`-'}' CloseParen4229)txt"}));4230}4231 4232TEST_P(BuildSyntaxTreeTest, InitDeclarator_Equal) {4233  if (!GetParam().isCXX()) {4234    return;4235  }4236  EXPECT_TRUE(treeDumpEqualOnAnnotations(4237      R"cpp(4238struct S { S(int);};4239void test() {4240  [[S s = 1]];4241}4242)cpp",4243      {R"txt(4244SimpleDeclaration4245|-'S'4246`-DeclaratorList Declarators4247  `-SimpleDeclarator ListElement4248    |-'s'4249    |-'='4250    `-IntegerLiteralExpression4251      `-'1' LiteralToken4252)txt"}));4253}4254 4255TEST_P(BuildSyntaxTreeTest, InitDeclarator_Brace) {4256  if (!GetParam().isCXX11OrLater()) {4257    return;4258  }4259  EXPECT_TRUE(treeDumpEqualOnAnnotations(4260      R"cpp(4261struct S { 4262  S();4263  S(int);4264  S(int, float);4265};4266void test(){4267  // FIXME: 's...' is a declarator and '{...}' is initializer4268  [[S s0{}]];4269  [[S s1{1}]];4270  [[S s2{1, 2.}]];4271}4272)cpp",4273      {R"txt(4274SimpleDeclaration4275|-'S'4276`-DeclaratorList Declarators4277  `-SimpleDeclarator ListElement4278    `-UnknownExpression4279      |-'s0'4280      |-'{'4281      `-'}'4282  )txt",4283       R"txt(4284SimpleDeclaration4285|-'S'4286`-DeclaratorList Declarators4287  `-SimpleDeclarator ListElement4288    `-UnknownExpression4289      |-'s1'4290      |-'{'4291      |-IntegerLiteralExpression4292      | `-'1' LiteralToken4293      `-'}'4294  )txt",4295       R"txt(4296SimpleDeclaration4297|-'S'4298`-DeclaratorList Declarators4299  `-SimpleDeclarator ListElement4300    `-UnknownExpression4301      |-'s2'4302      |-'{'4303      |-IntegerLiteralExpression4304      | `-'1' LiteralToken4305      |-','4306      |-FloatingLiteralExpression4307      | `-'2.' LiteralToken4308      `-'}'4309)txt"}));4310}4311 4312TEST_P(BuildSyntaxTreeTest, InitDeclarator_EqualBrace) {4313  if (!GetParam().isCXX11OrLater()) {4314    return;4315  }4316  EXPECT_TRUE(treeDumpEqualOnAnnotations(4317      R"cpp(4318struct S { 4319  S();4320  S(int);4321  S(int, float);4322};4323void test() {4324  // FIXME: '= {...}' is initializer4325  [[S s0 = {}]];4326  [[S s1 = {1}]];4327  [[S s2 = {1, 2.}]];4328}4329)cpp",4330      {R"txt(4331SimpleDeclaration4332|-'S'4333`-DeclaratorList Declarators4334  `-SimpleDeclarator ListElement4335    |-'s0'4336    |-'='4337    `-UnknownExpression4338      |-'{'4339      `-'}'4340  )txt",4341       R"txt(4342SimpleDeclaration4343|-'S'4344`-DeclaratorList Declarators4345  `-SimpleDeclarator ListElement4346    |-'s1'4347    |-'='4348    `-UnknownExpression4349      |-'{'4350      |-IntegerLiteralExpression4351      | `-'1' LiteralToken4352      `-'}'4353  )txt",4354       R"txt(4355SimpleDeclaration4356|-'S'4357`-DeclaratorList Declarators4358  `-SimpleDeclarator ListElement4359    |-'s2'4360    |-'='4361    `-UnknownExpression4362      |-'{'4363      |-IntegerLiteralExpression4364      | `-'1' LiteralToken4365      |-','4366      |-FloatingLiteralExpression4367      | `-'2.' LiteralToken4368      `-'}'4369)txt"}));4370}4371 4372TEST_P(BuildSyntaxTreeTest, InitDeclarator_Paren) {4373  if (!GetParam().isCXX()) {4374    return;4375  }4376  EXPECT_TRUE(treeDumpEqualOnAnnotations(4377      R"cpp(4378struct S {4379  S(int);4380  S(int, float);4381};4382// FIXME: 's...' is a declarator and '(...)' is initializer4383[[S s1(1);]]4384[[S s2(1, 2.);]]4385)cpp",4386      {R"txt(4387SimpleDeclaration4388|-'S'4389|-DeclaratorList Declarators4390| `-SimpleDeclarator ListElement4391|   `-UnknownExpression4392|     |-'s1'4393|     |-'('4394|     |-IntegerLiteralExpression4395|     | `-'1' LiteralToken4396|     `-')'4397`-';'4398  )txt",4399       R"txt(4400SimpleDeclaration4401|-'S'4402|-DeclaratorList Declarators4403| `-SimpleDeclarator ListElement4404|   `-UnknownExpression4405|     |-'s2'4406|     |-'('4407|     |-IntegerLiteralExpression4408|     | `-'1' LiteralToken4409|     |-','4410|     |-FloatingLiteralExpression4411|     | `-'2.' LiteralToken4412|     `-')'4413`-';'4414)txt"}));4415}4416 4417TEST_P(BuildSyntaxTreeTest, InitDeclarator_Paren_DefaultArguments) {4418  if (!GetParam().isCXX()) {4419    return;4420  }4421  EXPECT_TRUE(treeDumpEqualOnAnnotations(4422      R"cpp(4423struct S {4424  S(int i = 1, float = 2.);4425};4426[[S s0;]]4427// FIXME: 's...' is a declarator and '(...)' is initializer4428[[S s1(1);]]4429[[S s2(1, 2.);]]4430)cpp",4431      {R"txt(4432SimpleDeclaration4433|-'S'4434|-DeclaratorList Declarators4435| `-SimpleDeclarator ListElement4436|   `-'s0'4437`-';'4438  )txt",4439       R"txt(4440SimpleDeclaration4441|-'S'4442|-DeclaratorList Declarators4443| `-SimpleDeclarator ListElement4444|   `-UnknownExpression4445|     |-'s1'4446|     |-'('4447|     |-IntegerLiteralExpression4448|     | `-'1' LiteralToken4449|     `-')'4450`-';'4451  )txt",4452       R"txt(4453SimpleDeclaration4454|-'S'4455|-DeclaratorList Declarators4456| `-SimpleDeclarator ListElement4457|   `-UnknownExpression4458|     |-'s2'4459|     |-'('4460|     |-IntegerLiteralExpression4461|     | `-'1' LiteralToken4462|     |-','4463|     |-FloatingLiteralExpression4464|     | `-'2.' LiteralToken4465|     `-')'4466`-';'4467)txt"}));4468}4469 4470TEST_P(BuildSyntaxTreeTest, ImplicitConversion_Argument) {4471  if (!GetParam().isCXX()) {4472    return;4473  }4474  EXPECT_TRUE(treeDumpEqualOnAnnotations(4475      R"cpp(4476struct X {4477  X(int);4478};4479void TakeX(const X&);4480void test() {4481  [[TakeX(1)]];4482}4483)cpp",4484      {R"txt(4485CallExpression Expression4486|-IdExpression Callee4487| `-UnqualifiedId UnqualifiedId4488|   `-'TakeX'4489|-'(' OpenParen4490|-CallArguments Arguments4491| `-IntegerLiteralExpression ListElement4492|   `-'1' LiteralToken4493`-')' CloseParen4494)txt"}));4495}4496 4497TEST_P(BuildSyntaxTreeTest, ImplicitConversion_Return) {4498  if (!GetParam().isCXX()) {4499    return;4500  }4501  EXPECT_TRUE(treeDumpEqualOnAnnotations(4502      R"cpp(4503struct X {4504  X(int);4505};4506X CreateX(){4507  [[return 1;]]4508}4509)cpp",4510      {R"txt(4511ReturnStatement Statement4512|-'return' IntroducerKeyword4513|-IntegerLiteralExpression ReturnValue4514| `-'1' LiteralToken4515`-';'4516)txt"}));4517}4518 4519TEST_P(BuildSyntaxTreeTest, ConstructorCall_ZeroArguments) {4520  if (!GetParam().isCXX()) {4521    return;4522  }4523  EXPECT_TRUE(treeDumpEqualOnAnnotations(4524      R"cpp(4525struct X {4526  X();4527};4528X test() {4529  [[return X();]]4530}4531)cpp",4532      {R"txt(4533ReturnStatement Statement4534|-'return' IntroducerKeyword4535|-UnknownExpression ReturnValue4536| |-'X'4537| |-'('4538| `-')'4539`-';'4540)txt"}));4541}4542 4543TEST_P(BuildSyntaxTreeTest, ConstructorCall_OneArgument) {4544  if (!GetParam().isCXX()) {4545    return;4546  }4547  EXPECT_TRUE(treeDumpEqualOnAnnotations(4548      R"cpp(4549struct X {4550  X(int);4551};4552X test() {4553  [[return X(1);]]4554}4555)cpp",4556      {R"txt(4557ReturnStatement Statement4558|-'return' IntroducerKeyword4559|-UnknownExpression ReturnValue4560| |-'X'4561| |-'('4562| |-IntegerLiteralExpression4563| | `-'1' LiteralToken4564| `-')'4565`-';'4566)txt"}));4567}4568 4569TEST_P(BuildSyntaxTreeTest, ConstructorCall_MultipleArguments) {4570  if (!GetParam().isCXX()) {4571    return;4572  }4573  EXPECT_TRUE(treeDumpEqualOnAnnotations(4574      R"cpp(4575struct X {4576  X(int, char);4577};4578X test() {4579  [[return X(1, '2');]]4580}4581)cpp",4582      {R"txt(4583ReturnStatement Statement4584|-'return' IntroducerKeyword4585|-UnknownExpression ReturnValue4586| |-'X'4587| |-'('4588| |-IntegerLiteralExpression4589| | `-'1' LiteralToken4590| |-','4591| |-CharacterLiteralExpression4592| | `-''2'' LiteralToken4593| `-')'4594`-';'4595)txt"}));4596}4597 4598TEST_P(BuildSyntaxTreeTest, ConstructorCall_DefaultArguments) {4599  if (!GetParam().isCXX()) {4600    return;4601  }4602  EXPECT_TRUE(treeDumpEqualOnAnnotations(4603      R"cpp(4604struct X {4605  X(int i = 1, char c = '2');4606};4607void test() {4608  auto x0 = [[X()]];4609  auto x1 = [[X(1)]];4610  auto x2 = [[X(1, '2')]];4611}4612)cpp",4613      {R"txt(4614UnknownExpression4615|-'X'4616|-'('4617`-')'4618)txt",4619       R"txt(4620UnknownExpression4621|-'X'4622|-'('4623|-IntegerLiteralExpression4624| `-'1' LiteralToken4625`-')'4626)txt",4627       R"txt(4628UnknownExpression4629|-'X'4630|-'('4631|-IntegerLiteralExpression4632| `-'1' LiteralToken4633|-','4634|-CharacterLiteralExpression4635| `-''2'' LiteralToken4636`-')'4637)txt"}));4638}4639 4640TEST_P(BuildSyntaxTreeTest, TypeConversion_FunctionalNotation) {4641  if (!GetParam().isCXX()) {4642    return;4643  }4644  EXPECT_TRUE(treeDumpEqualOnAnnotations(4645      R"cpp(4646float test() {4647  [[return float(1);]]4648}4649)cpp",4650      {R"txt(4651ReturnStatement Statement4652|-'return' IntroducerKeyword4653|-UnknownExpression ReturnValue4654| |-'float'4655| |-'('4656| |-IntegerLiteralExpression4657| | `-'1' LiteralToken4658| `-')'4659`-';'4660)txt"}));4661}4662 4663TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_Simple) {4664  EXPECT_TRUE(treeDumpEqual(4665      R"cpp(4666int a[10];4667)cpp",4668      R"txt(4669TranslationUnit Detached4670`-SimpleDeclaration4671  |-'int'4672  |-DeclaratorList Declarators4673  | `-SimpleDeclarator ListElement4674  |   |-'a'4675  |   `-ArraySubscript4676  |     |-'[' OpenParen4677  |     |-IntegerLiteralExpression Size4678  |     | `-'10' LiteralToken4679  |     `-']' CloseParen4680  `-';'4681)txt"));4682}4683 4684TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_Multidimensional) {4685  EXPECT_TRUE(treeDumpEqual(4686      R"cpp(4687int b[1][2][3];4688)cpp",4689      R"txt(4690TranslationUnit Detached4691`-SimpleDeclaration4692  |-'int'4693  |-DeclaratorList Declarators4694  | `-SimpleDeclarator ListElement4695  |   |-'b'4696  |   |-ArraySubscript4697  |   | |-'[' OpenParen4698  |   | |-IntegerLiteralExpression Size4699  |   | | `-'1' LiteralToken4700  |   | `-']' CloseParen4701  |   |-ArraySubscript4702  |   | |-'[' OpenParen4703  |   | |-IntegerLiteralExpression Size4704  |   | | `-'2' LiteralToken4705  |   | `-']' CloseParen4706  |   `-ArraySubscript4707  |     |-'[' OpenParen4708  |     |-IntegerLiteralExpression Size4709  |     | `-'3' LiteralToken4710  |     `-']' CloseParen4711  `-';'4712)txt"));4713}4714 4715TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_UnknownBound) {4716  EXPECT_TRUE(treeDumpEqual(4717      R"cpp(4718int c[] = {1,2,3};4719)cpp",4720      R"txt(4721TranslationUnit Detached4722`-SimpleDeclaration4723  |-'int'4724  |-DeclaratorList Declarators4725  | `-SimpleDeclarator ListElement4726  |   |-'c'4727  |   |-ArraySubscript4728  |   | |-'[' OpenParen4729  |   | `-']' CloseParen4730  |   |-'='4731  |   `-UnknownExpression4732  |     `-UnknownExpression4733  |       |-'{'4734  |       |-IntegerLiteralExpression4735  |       | `-'1' LiteralToken4736  |       |-','4737  |       |-IntegerLiteralExpression4738  |       | `-'2' LiteralToken4739  |       |-','4740  |       |-IntegerLiteralExpression4741  |       | `-'3' LiteralToken4742  |       `-'}'4743  `-';'4744)txt"));4745}4746 4747TEST_P(BuildSyntaxTreeTest, ArrayDeclarator_Static) {4748  if (!GetParam().isC99OrLater()) {4749    return;4750  }4751  EXPECT_TRUE(treeDumpEqual(4752      R"cpp(4753void f(int xs[static 10]);4754)cpp",4755      R"txt(4756TranslationUnit Detached4757`-SimpleDeclaration4758  |-'void'4759  |-DeclaratorList Declarators4760  | `-SimpleDeclarator ListElement4761  |   |-'f'4762  |   `-ParametersAndQualifiers4763  |     |-'(' OpenParen4764  |     |-ParameterDeclarationList Parameters4765  |     | `-SimpleDeclaration ListElement4766  |     |   |-'int'4767  |     |   `-DeclaratorList Declarators4768  |     |     `-SimpleDeclarator ListElement4769  |     |       |-'xs'4770  |     |       `-ArraySubscript4771  |     |         |-'[' OpenParen4772  |     |         |-'static'4773  |     |         |-IntegerLiteralExpression Size4774  |     |         | `-'10' LiteralToken4775  |     |         `-']' CloseParen4776  |     `-')' CloseParen4777  `-';'4778)txt"));4779}4780 4781TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Empty) {4782  EXPECT_TRUE(treeDumpEqual(4783      R"cpp(4784int func();4785)cpp",4786      R"txt(4787TranslationUnit Detached4788`-SimpleDeclaration4789  |-'int'4790  |-DeclaratorList Declarators4791  | `-SimpleDeclarator ListElement4792  |   |-'func'4793  |   `-ParametersAndQualifiers4794  |     |-'(' OpenParen4795  |     `-')' CloseParen4796  `-';'4797)txt"));4798}4799 4800TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Named) {4801  EXPECT_TRUE(treeDumpEqualOnAnnotations(4802      R"cpp(4803     int func1([[int a]]);4804     int func2([[int *ap]]);4805     int func3([[int a, float b]]);4806     int func4([[undef a]]); // error-ok: no crash on invalid type4807   )cpp",4808      {R"txt(4809ParameterDeclarationList Parameters4810`-SimpleDeclaration ListElement4811  |-'int'4812  `-DeclaratorList Declarators4813    `-SimpleDeclarator ListElement4814      `-'a'4815)txt",4816       R"txt(4817ParameterDeclarationList Parameters4818`-SimpleDeclaration ListElement4819  |-'int'4820  `-DeclaratorList Declarators4821    `-SimpleDeclarator ListElement4822      |-'*'4823      `-'ap'4824)txt",4825       R"txt(4826ParameterDeclarationList Parameters4827|-SimpleDeclaration ListElement4828| |-'int'4829| `-DeclaratorList Declarators4830|   `-SimpleDeclarator ListElement4831|     `-'a'4832|-',' ListDelimiter4833`-SimpleDeclaration ListElement4834  |-'float'4835  `-DeclaratorList Declarators4836    `-SimpleDeclarator ListElement4837      `-'b'4838)txt",4839       R"txt(4840ParameterDeclarationList Parameters4841`-SimpleDeclaration ListElement4842  |-'undef'4843  `-DeclaratorList Declarators4844    `-SimpleDeclarator ListElement4845      `-'a'4846)txt"}));4847}4848 4849TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Unnamed) {4850  EXPECT_TRUE(treeDumpEqual(4851      R"cpp(4852int func1(int);4853int func2(int *);4854int func3(int, float);4855)cpp",4856      R"txt(4857TranslationUnit Detached4858|-SimpleDeclaration4859| |-'int'4860| |-DeclaratorList Declarators4861| | `-SimpleDeclarator ListElement4862| |   |-'func1'4863| |   `-ParametersAndQualifiers4864| |     |-'(' OpenParen4865| |     |-ParameterDeclarationList Parameters4866| |     | `-SimpleDeclaration ListElement4867| |     |   `-'int'4868| |     `-')' CloseParen4869| `-';'4870|-SimpleDeclaration4871| |-'int'4872| |-DeclaratorList Declarators4873| | `-SimpleDeclarator ListElement4874| |   |-'func2'4875| |   `-ParametersAndQualifiers4876| |     |-'(' OpenParen4877| |     |-ParameterDeclarationList Parameters4878| |     | `-SimpleDeclaration ListElement4879| |     |   |-'int'4880| |     |   `-DeclaratorList Declarators4881| |     |     `-SimpleDeclarator ListElement4882| |     |       `-'*'4883| |     `-')' CloseParen4884| `-';'4885`-SimpleDeclaration4886  |-'int'4887  |-DeclaratorList Declarators4888  | `-SimpleDeclarator ListElement4889  |   |-'func3'4890  |   `-ParametersAndQualifiers4891  |     |-'(' OpenParen4892  |     |-ParameterDeclarationList Parameters4893  |     | |-SimpleDeclaration ListElement4894  |     | | `-'int'4895  |     | |-',' ListDelimiter4896  |     | `-SimpleDeclaration ListElement4897  |     |   `-'float'4898  |     `-')' CloseParen4899  `-';'4900)txt"));4901}4902 4903TEST_P(BuildSyntaxTreeTest,4904       ParametersAndQualifiers_InFreeFunctions_Default_One) {4905  if (!GetParam().isCXX()) {4906    return;4907  }4908  EXPECT_TRUE(treeDumpEqualOnAnnotations(4909      R"cpp(4910int func1([[int a = 1]]);4911)cpp",4912      {R"txt(4913ParameterDeclarationList Parameters4914`-SimpleDeclaration ListElement4915  |-'int'4916  `-DeclaratorList Declarators4917    `-SimpleDeclarator ListElement4918      |-'a'4919      |-'='4920      `-IntegerLiteralExpression4921        `-'1' LiteralToken4922)txt"}));4923}4924 4925TEST_P(BuildSyntaxTreeTest,4926       ParametersAndQualifiers_InFreeFunctions_Default_Multiple) {4927  if (!GetParam().isCXX()) {4928    return;4929  }4930  EXPECT_TRUE(treeDumpEqualOnAnnotations(4931      R"cpp(4932int func2([[int *ap, int a = 1, char c = '2']]);4933)cpp",4934      {R"txt(4935ParameterDeclarationList Parameters4936|-SimpleDeclaration ListElement4937| |-'int'4938| `-DeclaratorList Declarators4939|   `-SimpleDeclarator ListElement4940|     |-'*'4941|     `-'ap'4942|-',' ListDelimiter4943|-SimpleDeclaration ListElement4944| |-'int'4945| `-DeclaratorList Declarators4946|   `-SimpleDeclarator ListElement4947|     |-'a'4948|     |-'='4949|     `-IntegerLiteralExpression4950|       `-'1' LiteralToken4951|-',' ListDelimiter4952`-SimpleDeclaration ListElement4953  |-'char'4954  `-DeclaratorList Declarators4955    `-SimpleDeclarator ListElement4956      |-'c'4957      |-'='4958      `-CharacterLiteralExpression4959        `-''2'' LiteralToken4960)txt"}));4961}4962 4963TEST_P(BuildSyntaxTreeTest,4964       ParametersAndQualifiers_InVariadicFunctionTemplate_ParameterPack) {4965  if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) {4966    return;4967  }4968  EXPECT_TRUE(treeDumpEqualOnAnnotations(4969      R"cpp(4970template<typename T, typename... Args>4971[[void test(T , Args... );]]4972)cpp",4973      {R"txt(4974SimpleDeclaration4975|-'void'4976|-DeclaratorList Declarators4977| `-SimpleDeclarator ListElement4978|   |-'test'4979|   `-ParametersAndQualifiers4980|     |-'(' OpenParen4981|     |-ParameterDeclarationList Parameters4982|     | |-SimpleDeclaration ListElement4983|     | | `-'T'4984|     | |-',' ListDelimiter4985|     | `-SimpleDeclaration ListElement4986|     |   |-'Args'4987|     |   `-'...'4988|     `-')' CloseParen4989`-';'4990)txt"}));4991}4992 4993TEST_P(BuildSyntaxTreeTest,4994       ParametersAndQualifiers_InVariadicFunctionTemplate_NamedParameterPack) {4995  if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) {4996    return;4997  }4998  EXPECT_TRUE(treeDumpEqualOnAnnotations(4999      R"cpp(5000template<typename T, typename... Args>5001[[void test(T t, Args... args);]]5002)cpp",5003      {R"txt(5004SimpleDeclaration5005|-'void'5006|-DeclaratorList Declarators5007| `-SimpleDeclarator ListElement5008|   |-'test'5009|   `-ParametersAndQualifiers5010|     |-'(' OpenParen5011|     |-ParameterDeclarationList Parameters5012|     | |-SimpleDeclaration ListElement5013|     | | |-'T'5014|     | | `-DeclaratorList Declarators5015|     | |   `-SimpleDeclarator ListElement5016|     | |     `-'t'5017|     | |-',' ListDelimiter5018|     | `-SimpleDeclaration ListElement5019|     |   |-'Args'5020|     |   |-'...'5021|     |   `-DeclaratorList Declarators5022|     |     `-SimpleDeclarator ListElement5023|     |       `-'args'5024|     `-')' CloseParen5025`-';'5026)txt"}));5027}5028 5029TEST_P(BuildSyntaxTreeTest,5030       ParametersAndQualifiers_InFreeFunctions_VariadicArguments) {5031  if (!GetParam().isCXX11OrLater()) {5032    return;5033  }5034  EXPECT_TRUE(treeDumpEqual(5035      R"cpp(5036void test(int , char ...);5037)cpp",5038      R"txt(5039TranslationUnit Detached5040`-SimpleDeclaration5041  |-'void'5042  |-DeclaratorList Declarators5043  | `-SimpleDeclarator ListElement5044  |   |-'test'5045  |   `-ParametersAndQualifiers5046  |     |-'(' OpenParen5047  |     |-ParameterDeclarationList Parameters5048  |     | |-SimpleDeclaration ListElement5049  |     | | `-'int'5050  |     | |-',' ListDelimiter5051  |     | `-SimpleDeclaration ListElement5052  |     |   `-'char'5053  |     |-'...'5054  |     `-')' CloseParen5055  `-';'5056)txt"));5057}5058 5059TEST_P(BuildSyntaxTreeTest,5060       ParametersAndQualifiers_InFreeFunctions_Cxx_CvQualifiers) {5061  if (!GetParam().isCXX()) {5062    return;5063  }5064  EXPECT_TRUE(treeDumpEqual(5065      R"cpp(5066int func(const int a, volatile int b, const volatile int c);5067)cpp",5068      R"txt(5069TranslationUnit Detached5070`-SimpleDeclaration5071  |-'int'5072  |-DeclaratorList Declarators5073  | `-SimpleDeclarator ListElement5074  |   |-'func'5075  |   `-ParametersAndQualifiers5076  |     |-'(' OpenParen5077  |     |-ParameterDeclarationList Parameters5078  |     | |-SimpleDeclaration ListElement5079  |     | | |-'const'5080  |     | | |-'int'5081  |     | | `-DeclaratorList Declarators5082  |     | |   `-SimpleDeclarator ListElement5083  |     | |     `-'a'5084  |     | |-',' ListDelimiter5085  |     | |-SimpleDeclaration ListElement5086  |     | | |-'volatile'5087  |     | | |-'int'5088  |     | | `-DeclaratorList Declarators5089  |     | |   `-SimpleDeclarator ListElement5090  |     | |     `-'b'5091  |     | |-',' ListDelimiter5092  |     | `-SimpleDeclaration ListElement5093  |     |   |-'const'5094  |     |   |-'volatile'5095  |     |   |-'int'5096  |     |   `-DeclaratorList Declarators5097  |     |     `-SimpleDeclarator ListElement5098  |     |       `-'c'5099  |     `-')' CloseParen5100  `-';'5101)txt"));5102}5103 5104TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Cxx_Ref) {5105  if (!GetParam().isCXX()) {5106    return;5107  }5108  EXPECT_TRUE(treeDumpEqual(5109      R"cpp(5110int func(int& a);5111)cpp",5112      R"txt(5113TranslationUnit Detached5114`-SimpleDeclaration5115  |-'int'5116  |-DeclaratorList Declarators5117  | `-SimpleDeclarator ListElement5118  |   |-'func'5119  |   `-ParametersAndQualifiers5120  |     |-'(' OpenParen5121  |     |-ParameterDeclarationList Parameters5122  |     | `-SimpleDeclaration ListElement5123  |     |   |-'int'5124  |     |   `-DeclaratorList Declarators5125  |     |     `-SimpleDeclarator ListElement5126  |     |       |-'&'5127  |     |       `-'a'5128  |     `-')' CloseParen5129  `-';'5130)txt"));5131}5132 5133TEST_P(BuildSyntaxTreeTest,5134       ParametersAndQualifiers_InFreeFunctions_Cxx11_RefRef) {5135  if (!GetParam().isCXX11OrLater()) {5136    return;5137  }5138  EXPECT_TRUE(treeDumpEqual(5139      R"cpp(5140int func(int&& a);5141)cpp",5142      R"txt(5143TranslationUnit Detached5144`-SimpleDeclaration5145  |-'int'5146  |-DeclaratorList Declarators5147  | `-SimpleDeclarator ListElement5148  |   |-'func'5149  |   `-ParametersAndQualifiers5150  |     |-'(' OpenParen5151  |     |-ParameterDeclarationList Parameters5152  |     | `-SimpleDeclaration ListElement5153  |     |   |-'int'5154  |     |   `-DeclaratorList Declarators5155  |     |     `-SimpleDeclarator ListElement5156  |     |       |-'&&'5157  |     |       `-'a'5158  |     `-')' CloseParen5159  `-';'5160)txt"));5161}5162 5163TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InMemberFunctions_Simple) {5164  if (!GetParam().isCXX()) {5165    return;5166  }5167  EXPECT_TRUE(treeDumpEqual(5168      R"cpp(5169struct Test {5170  int a();5171};5172)cpp",5173      R"txt(5174TranslationUnit Detached5175`-SimpleDeclaration5176  |-'struct'5177  |-'Test'5178  |-'{'5179  |-SimpleDeclaration5180  | |-'int'5181  | |-DeclaratorList Declarators5182  | | `-SimpleDeclarator ListElement5183  | |   |-'a'5184  | |   `-ParametersAndQualifiers5185  | |     |-'(' OpenParen5186  | |     `-')' CloseParen5187  | `-';'5188  |-'}'5189  `-';'5190)txt"));5191}5192 5193TEST_P(BuildSyntaxTreeTest,5194       ParametersAndQualifiers_InMemberFunctions_CvQualifiers) {5195  if (!GetParam().isCXX()) {5196    return;5197  }5198  EXPECT_TRUE(treeDumpEqualOnAnnotations(5199      R"cpp(5200struct Test {5201  [[int b() const;]]5202  [[int c() volatile;]]5203  [[int d() const volatile;]]5204};5205)cpp",5206      {R"txt(5207SimpleDeclaration5208|-'int'5209|-DeclaratorList Declarators5210| `-SimpleDeclarator ListElement5211|   |-'b'5212|   `-ParametersAndQualifiers5213|     |-'(' OpenParen5214|     |-')' CloseParen5215|     `-'const'5216`-';'5217)txt",5218       R"txt(5219SimpleDeclaration5220|-'int'5221|-DeclaratorList Declarators5222| `-SimpleDeclarator ListElement5223|   |-'c'5224|   `-ParametersAndQualifiers5225|     |-'(' OpenParen5226|     |-')' CloseParen5227|     `-'volatile'5228`-';'5229)txt",5230       R"txt(5231SimpleDeclaration5232|-'int'5233|-DeclaratorList Declarators5234| `-SimpleDeclarator ListElement5235|   |-'d'5236|   `-ParametersAndQualifiers5237|     |-'(' OpenParen5238|     |-')' CloseParen5239|     |-'const'5240|     `-'volatile'5241`-';'5242)txt"}));5243}5244 5245TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InMemberFunctions_Ref) {5246  if (!GetParam().isCXX11OrLater()) {5247    return;5248  }5249  EXPECT_TRUE(treeDumpEqualOnAnnotations(5250      R"cpp(5251struct Test {5252  [[int e() &;]]5253};5254)cpp",5255      {R"txt(5256SimpleDeclaration5257|-'int'5258|-DeclaratorList Declarators5259| `-SimpleDeclarator ListElement5260|   |-'e'5261|   `-ParametersAndQualifiers5262|     |-'(' OpenParen5263|     |-')' CloseParen5264|     `-'&'5265`-';'5266)txt"}));5267}5268 5269TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InMemberFunctions_RefRef) {5270  if (!GetParam().isCXX11OrLater()) {5271    return;5272  }5273  EXPECT_TRUE(treeDumpEqualOnAnnotations(5274      R"cpp(5275struct Test {5276  [[int f() &&;]]5277};5278)cpp",5279      {R"txt(5280SimpleDeclaration5281|-'int'5282|-DeclaratorList Declarators5283| `-SimpleDeclarator ListElement5284|   |-'f'5285|   `-ParametersAndQualifiers5286|     |-'(' OpenParen5287|     |-')' CloseParen5288|     `-'&&'5289`-';'5290)txt"}));5291}5292 5293TEST_P(BuildSyntaxTreeTest, TrailingReturn) {5294  if (!GetParam().isCXX11OrLater()) {5295    return;5296  }5297  EXPECT_TRUE(treeDumpEqual(5298      R"cpp(5299auto foo() -> int;5300)cpp",5301      R"txt(5302TranslationUnit Detached5303`-SimpleDeclaration5304  |-'auto'5305  |-DeclaratorList Declarators5306  | `-SimpleDeclarator ListElement5307  |   |-'foo'5308  |   `-ParametersAndQualifiers5309  |     |-'(' OpenParen5310  |     |-')' CloseParen5311  |     `-TrailingReturnType TrailingReturn5312  |       |-'->' ArrowToken5313  |       `-'int'5314  `-';'5315)txt"));5316}5317 5318TEST_P(BuildSyntaxTreeTest, DynamicExceptionSpecification) {5319  if (!GetParam().supportsCXXDynamicExceptionSpecification()) {5320    return;5321  }5322  EXPECT_TRUE(treeDumpEqualOnAnnotations(5323      R"cpp(5324struct MyException1 {};5325struct MyException2 {};5326[[int a() throw();]]5327[[int b() throw(...);]]5328[[int c() throw(MyException1);]]5329[[int d() throw(MyException1, MyException2);]]5330)cpp",5331      {R"txt(5332SimpleDeclaration5333|-'int'5334|-DeclaratorList Declarators5335| `-SimpleDeclarator ListElement5336|   |-'a'5337|   `-ParametersAndQualifiers5338|     |-'(' OpenParen5339|     |-')' CloseParen5340|     |-'throw'5341|     |-'('5342|     `-')'5343`-';'5344)txt",5345       R"txt(5346SimpleDeclaration5347|-'int'5348|-DeclaratorList Declarators5349| `-SimpleDeclarator ListElement5350|   |-'b'5351|   `-ParametersAndQualifiers5352|     |-'(' OpenParen5353|     |-')' CloseParen5354|     |-'throw'5355|     |-'('5356|     |-'...'5357|     `-')'5358`-';'5359)txt",5360       R"txt(5361SimpleDeclaration5362|-'int'5363|-DeclaratorList Declarators5364| `-SimpleDeclarator ListElement5365|   |-'c'5366|   `-ParametersAndQualifiers5367|     |-'(' OpenParen5368|     |-')' CloseParen5369|     |-'throw'5370|     |-'('5371|     |-'MyException1'5372|     `-')'5373`-';'5374)txt",5375       R"txt(5376SimpleDeclaration5377|-'int'5378|-DeclaratorList Declarators5379| `-SimpleDeclarator ListElement5380|   |-'d'5381|   `-ParametersAndQualifiers5382|     |-'(' OpenParen5383|     |-')' CloseParen5384|     |-'throw'5385|     |-'('5386|     |-'MyException1'5387|     |-','5388|     |-'MyException2'5389|     `-')'5390`-';'5391)txt"}));5392}5393 5394TEST_P(BuildSyntaxTreeTest, NoexceptExceptionSpecification) {5395  if (!GetParam().isCXX11OrLater()) {5396    return;5397  }5398  EXPECT_TRUE(treeDumpEqual(5399      R"cpp(5400int a() noexcept;5401int b() noexcept(true);5402)cpp",5403      R"txt(5404TranslationUnit Detached5405|-SimpleDeclaration5406| |-'int'5407| |-DeclaratorList Declarators5408| | `-SimpleDeclarator ListElement5409| |   |-'a'5410| |   `-ParametersAndQualifiers5411| |     |-'(' OpenParen5412| |     |-')' CloseParen5413| |     `-'noexcept'5414| `-';'5415`-SimpleDeclaration5416  |-'int'5417  |-DeclaratorList Declarators5418  | `-SimpleDeclarator ListElement5419  |   |-'b'5420  |   `-ParametersAndQualifiers5421  |     |-'(' OpenParen5422  |     |-')' CloseParen5423  |     |-'noexcept'5424  |     |-'('5425  |     |-BoolLiteralExpression5426  |     | `-'true' LiteralToken5427  |     `-')'5428  `-';'5429)txt"));5430}5431 5432TEST_P(BuildSyntaxTreeTest, DeclaratorsInParentheses) {5433  EXPECT_TRUE(treeDumpEqual(5434      R"cpp(5435int (a);5436int *(b);5437int (*c)(int);5438int *(d)(int);5439)cpp",5440      R"txt(5441TranslationUnit Detached5442|-SimpleDeclaration5443| |-'int'5444| |-DeclaratorList Declarators5445| | `-SimpleDeclarator ListElement5446| |   `-ParenDeclarator5447| |     |-'(' OpenParen5448| |     |-'a'5449| |     `-')' CloseParen5450| `-';'5451|-SimpleDeclaration5452| |-'int'5453| |-DeclaratorList Declarators5454| | `-SimpleDeclarator ListElement5455| |   |-'*'5456| |   `-ParenDeclarator5457| |     |-'(' OpenParen5458| |     |-'b'5459| |     `-')' CloseParen5460| `-';'5461|-SimpleDeclaration5462| |-'int'5463| |-DeclaratorList Declarators5464| | `-SimpleDeclarator ListElement5465| |   |-ParenDeclarator5466| |   | |-'(' OpenParen5467| |   | |-'*'5468| |   | |-'c'5469| |   | `-')' CloseParen5470| |   `-ParametersAndQualifiers5471| |     |-'(' OpenParen5472| |     |-ParameterDeclarationList Parameters5473| |     | `-SimpleDeclaration ListElement5474| |     |   `-'int'5475| |     `-')' CloseParen5476| `-';'5477`-SimpleDeclaration5478  |-'int'5479  |-DeclaratorList Declarators5480  | `-SimpleDeclarator ListElement5481  |   |-'*'5482  |   |-ParenDeclarator5483  |   | |-'(' OpenParen5484  |   | |-'d'5485  |   | `-')' CloseParen5486  |   `-ParametersAndQualifiers5487  |     |-'(' OpenParen5488  |     |-ParameterDeclarationList Parameters5489  |     | `-SimpleDeclaration ListElement5490  |     |   `-'int'5491  |     `-')' CloseParen5492  `-';'5493)txt"));5494}5495 5496TEST_P(BuildSyntaxTreeTest, Declaration_ConstVolatileQualifiers_SimpleConst) {5497  EXPECT_TRUE(treeDumpEqual(5498      R"cpp(5499const int west = -1;5500int const east = 1;5501)cpp",5502      R"txt(5503TranslationUnit Detached5504|-SimpleDeclaration5505| |-'const'5506| |-'int'5507| |-DeclaratorList Declarators5508| | `-SimpleDeclarator ListElement5509| |   |-'west'5510| |   |-'='5511| |   `-PrefixUnaryOperatorExpression5512| |     |-'-' OperatorToken5513| |     `-IntegerLiteralExpression Operand5514| |       `-'1' LiteralToken5515| `-';'5516`-SimpleDeclaration5517  |-'int'5518  |-'const'5519  |-DeclaratorList Declarators5520  | `-SimpleDeclarator ListElement5521  |   |-'east'5522  |   |-'='5523  |   `-IntegerLiteralExpression5524  |     `-'1' LiteralToken5525  `-';'5526)txt"));5527}5528 5529TEST_P(BuildSyntaxTreeTest, Declaration_ConstVolatileQualifiers_MultipleConst) {5530  EXPECT_TRUE(treeDumpEqual(5531      R"cpp(5532const int const universal = 0;5533)cpp",5534      R"txt(5535TranslationUnit Detached5536`-SimpleDeclaration5537  |-'const'5538  |-'int'5539  |-'const'5540  |-DeclaratorList Declarators5541  | `-SimpleDeclarator ListElement5542  |   |-'universal'5543  |   |-'='5544  |   `-IntegerLiteralExpression5545  |     `-'0' LiteralToken5546  `-';'5547)txt"));5548}5549 5550TEST_P(BuildSyntaxTreeTest,5551       Declaration_ConstVolatileQualifiers_ConstAndVolatile) {5552  EXPECT_TRUE(treeDumpEqual(5553      R"cpp(5554const int const *const *volatile b;5555)cpp",5556      R"txt(5557TranslationUnit Detached5558`-SimpleDeclaration5559  |-'const'5560  |-'int'5561  |-'const'5562  |-DeclaratorList Declarators5563  | `-SimpleDeclarator ListElement5564  |   |-'*'5565  |   |-'const'5566  |   |-'*'5567  |   |-'volatile'5568  |   `-'b'5569  `-';'5570)txt"));5571}5572 5573TEST_P(BuildSyntaxTreeTest, RangesOfDeclaratorsWithTrailingReturnTypes) {5574  if (!GetParam().isCXX11OrLater()) {5575    return;5576  }5577  EXPECT_TRUE(treeDumpEqual(5578      R"cpp(5579auto foo() -> auto(*)(int) -> double*;5580)cpp",5581      R"txt(5582TranslationUnit Detached5583`-SimpleDeclaration5584  |-'auto'5585  |-DeclaratorList Declarators5586  | `-SimpleDeclarator ListElement5587  |   |-'foo'5588  |   `-ParametersAndQualifiers5589  |     |-'(' OpenParen5590  |     |-')' CloseParen5591  |     `-TrailingReturnType TrailingReturn5592  |       |-'->' ArrowToken5593  |       |-'auto'5594  |       `-SimpleDeclarator Declarator5595  |         |-ParenDeclarator5596  |         | |-'(' OpenParen5597  |         | |-'*'5598  |         | `-')' CloseParen5599  |         `-ParametersAndQualifiers5600  |           |-'(' OpenParen5601  |           |-ParameterDeclarationList Parameters5602  |           | `-SimpleDeclaration ListElement5603  |           |   `-'int'5604  |           |-')' CloseParen5605  |           `-TrailingReturnType TrailingReturn5606  |             |-'->' ArrowToken5607  |             |-'double'5608  |             `-SimpleDeclarator Declarator5609  |               `-'*'5610  `-';'5611)txt"));5612}5613 5614TEST_P(BuildSyntaxTreeTest, MemberPointers) {5615  if (!GetParam().isCXX()) {5616    return;5617  }5618  EXPECT_TRUE(treeDumpEqualOnAnnotations(5619      R"cpp(5620struct X {};5621[[int X::* a;]]5622[[const int X::* b;]]5623)cpp",5624      {R"txt(5625SimpleDeclaration5626|-'int'5627|-DeclaratorList Declarators5628| `-SimpleDeclarator ListElement5629|   |-MemberPointer5630|   | |-'X'5631|   | |-'::'5632|   | `-'*'5633|   `-'a'5634`-';'5635)txt",5636       R"txt(5637SimpleDeclaration5638|-'const'5639|-'int'5640|-DeclaratorList Declarators5641| `-SimpleDeclarator ListElement5642|   |-MemberPointer5643|   | |-'X'5644|   | |-'::'5645|   | `-'*'5646|   `-'b'5647`-';'5648)txt"}));5649}5650 5651TEST_P(BuildSyntaxTreeTest, MemberFunctionPointer) {5652  if (!GetParam().isCXX()) {5653    return;5654  }5655  EXPECT_TRUE(treeDumpEqualOnAnnotations(5656      R"cpp(5657struct X {5658  struct Y {};5659};5660[[void (X::*xp)();]]5661[[void (X::**xpp)(const int*);]]5662[[void (X::Y::*xyp)(const int*, char);]]5663)cpp",5664      {R"txt(5665SimpleDeclaration5666|-'void'5667|-DeclaratorList Declarators5668| `-SimpleDeclarator ListElement5669|   |-ParenDeclarator5670|   | |-'(' OpenParen5671|   | |-MemberPointer5672|   | | |-'X'5673|   | | |-'::'5674|   | | `-'*'5675|   | |-'xp'5676|   | `-')' CloseParen5677|   `-ParametersAndQualifiers5678|     |-'(' OpenParen5679|     `-')' CloseParen5680`-';'5681)txt",5682       R"txt(5683SimpleDeclaration5684|-'void'5685|-DeclaratorList Declarators5686| `-SimpleDeclarator ListElement5687|   |-ParenDeclarator5688|   | |-'(' OpenParen5689|   | |-MemberPointer5690|   | | |-'X'5691|   | | |-'::'5692|   | | `-'*'5693|   | |-'*'5694|   | |-'xpp'5695|   | `-')' CloseParen5696|   `-ParametersAndQualifiers5697|     |-'(' OpenParen5698|     |-ParameterDeclarationList Parameters5699|     | `-SimpleDeclaration ListElement5700|     |   |-'const'5701|     |   |-'int'5702|     |   `-DeclaratorList Declarators5703|     |     `-SimpleDeclarator ListElement5704|     |       `-'*'5705|     `-')' CloseParen5706`-';'5707)txt",5708       R"txt(5709SimpleDeclaration5710|-'void'5711|-DeclaratorList Declarators5712| `-SimpleDeclarator ListElement5713|   |-ParenDeclarator5714|   | |-'(' OpenParen5715|   | |-MemberPointer5716|   | | |-'X'5717|   | | |-'::'5718|   | | |-'Y'5719|   | | |-'::'5720|   | | `-'*'5721|   | |-'xyp'5722|   | `-')' CloseParen5723|   `-ParametersAndQualifiers5724|     |-'(' OpenParen5725|     |-ParameterDeclarationList Parameters5726|     | |-SimpleDeclaration ListElement5727|     | | |-'const'5728|     | | |-'int'5729|     | | `-DeclaratorList Declarators5730|     | |   `-SimpleDeclarator ListElement5731|     | |     `-'*'5732|     | |-',' ListDelimiter5733|     | `-SimpleDeclaration ListElement5734|     |   `-'char'5735|     `-')' CloseParen5736`-';'5737)txt"}));5738}5739 5740TEST_P(BuildSyntaxTreeTest, ComplexDeclarator) {5741  EXPECT_TRUE(treeDumpEqual(5742      R"cpp(5743void x(char a, short (*b)(int));5744)cpp",5745      R"txt(5746TranslationUnit Detached5747`-SimpleDeclaration5748  |-'void'5749  |-DeclaratorList Declarators5750  | `-SimpleDeclarator ListElement5751  |   |-'x'5752  |   `-ParametersAndQualifiers5753  |     |-'(' OpenParen5754  |     |-ParameterDeclarationList Parameters5755  |     | |-SimpleDeclaration ListElement5756  |     | | |-'char'5757  |     | | `-DeclaratorList Declarators5758  |     | |   `-SimpleDeclarator ListElement5759  |     | |     `-'a'5760  |     | |-',' ListDelimiter5761  |     | `-SimpleDeclaration ListElement5762  |     |   |-'short'5763  |     |   `-DeclaratorList Declarators5764  |     |     `-SimpleDeclarator ListElement5765  |     |       |-ParenDeclarator5766  |     |       | |-'(' OpenParen5767  |     |       | |-'*'5768  |     |       | |-'b'5769  |     |       | `-')' CloseParen5770  |     |       `-ParametersAndQualifiers5771  |     |         |-'(' OpenParen5772  |     |         |-ParameterDeclarationList Parameters5773  |     |         | `-SimpleDeclaration ListElement5774  |     |         |   `-'int'5775  |     |         `-')' CloseParen5776  |     `-')' CloseParen5777  `-';'5778)txt"));5779}5780 5781TEST_P(BuildSyntaxTreeTest, ComplexDeclarator2) {5782  EXPECT_TRUE(treeDumpEqual(5783      R"cpp(5784void x(char a, short (*b)(int), long (**c)(long long));5785)cpp",5786      R"txt(5787TranslationUnit Detached5788`-SimpleDeclaration5789  |-'void'5790  |-DeclaratorList Declarators5791  | `-SimpleDeclarator ListElement5792  |   |-'x'5793  |   `-ParametersAndQualifiers5794  |     |-'(' OpenParen5795  |     |-ParameterDeclarationList Parameters5796  |     | |-SimpleDeclaration ListElement5797  |     | | |-'char'5798  |     | | `-DeclaratorList Declarators5799  |     | |   `-SimpleDeclarator ListElement5800  |     | |     `-'a'5801  |     | |-',' ListDelimiter5802  |     | |-SimpleDeclaration ListElement5803  |     | | |-'short'5804  |     | | `-DeclaratorList Declarators5805  |     | |   `-SimpleDeclarator ListElement5806  |     | |     |-ParenDeclarator5807  |     | |     | |-'(' OpenParen5808  |     | |     | |-'*'5809  |     | |     | |-'b'5810  |     | |     | `-')' CloseParen5811  |     | |     `-ParametersAndQualifiers5812  |     | |       |-'(' OpenParen5813  |     | |       |-ParameterDeclarationList Parameters5814  |     | |       | `-SimpleDeclaration ListElement5815  |     | |       |   `-'int'5816  |     | |       `-')' CloseParen5817  |     | |-',' ListDelimiter5818  |     | `-SimpleDeclaration ListElement5819  |     |   |-'long'5820  |     |   `-DeclaratorList Declarators5821  |     |     `-SimpleDeclarator ListElement5822  |     |       |-ParenDeclarator5823  |     |       | |-'(' OpenParen5824  |     |       | |-'*'5825  |     |       | |-'*'5826  |     |       | |-'c'5827  |     |       | `-')' CloseParen5828  |     |       `-ParametersAndQualifiers5829  |     |         |-'(' OpenParen5830  |     |         |-ParameterDeclarationList Parameters5831  |     |         | `-SimpleDeclaration ListElement5832  |     |         |   |-'long'5833  |     |         |   `-'long'5834  |     |         `-')' CloseParen5835  |     `-')' CloseParen5836  `-';'5837)txt"));5838}5839 5840} // namespace5841