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