diff --git a/clang/include/clang/Tooling/Syntax/Nodes.h b/clang/include/clang/Tooling/Syntax/Nodes.h --- a/clang/include/clang/Tooling/Syntax/Nodes.h +++ b/clang/include/clang/Tooling/Syntax/Nodes.h @@ -99,6 +99,7 @@ ParametersAndQualifiers, MemberPointer, UnqualifiedId, + ParameterDeclarationList, // Nested Name Specifiers. NestedNameSpecifier, GlobalNameSpecifier, @@ -173,7 +174,7 @@ ExplicitTemplateInstantiation_declaration, ArraySubscript_sizeExpression, TrailingReturnType_declarator, - ParametersAndQualifiers_parameter, + ParametersAndQualifiers_parameters, ParametersAndQualifiers_trailingReturn, IdExpression_id, IdExpression_qualifier, @@ -988,6 +989,19 @@ SimpleDeclarator *declarator(); }; +/// Models a `parameter-declaration-list` which appears within +/// `parameters-and-qualifiers`. See C++ [dcl.fct] +class ParameterDeclarationList final : public List { +public: + ParameterDeclarationList() : List(NodeKind::ParameterDeclarationList) {} + static bool classof(const Node *N) { + return N->kind() == NodeKind::ParameterDeclarationList; + } + std::vector parameterDeclarations(); + std::vector> + parametersAndCommas(); +}; + /// Parameter list for a function type and a trailing return type, if the /// function has one. /// E.g.: @@ -1006,8 +1020,7 @@ return N->kind() == NodeKind::ParametersAndQualifiers; } Leaf *lparen(); - /// FIXME: use custom iterator instead of 'vector'. - std::vector parameters(); + ParameterDeclarationList *parameters(); Leaf *rparen(); TrailingReturnType *trailingReturn(); }; diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -1209,11 +1209,29 @@ return true; } + syntax::ParameterDeclarationList * + buildParameterDeclarationList(ArrayRef Params) { + for (auto *P : Params) { + Builder.markChild(P, syntax::NodeRole::List_element); + const auto *DelimiterToken = std::next(Builder.findToken(P->getEndLoc())); + if (DelimiterToken->kind() == clang::tok::TokenKind::comma) + Builder.markChildToken(DelimiterToken, + syntax::NodeRole::List_delimiter); + } + auto *Parameters = new (allocator()) syntax::ParameterDeclarationList; + if (!Params.empty()) + Builder.foldNode(Builder.getRange(Params.front()->getBeginLoc(), + Params.back()->getEndLoc()), + Parameters, nullptr); + return Parameters; + } + bool WalkUpFromFunctionTypeLoc(FunctionTypeLoc L) { Builder.markChildToken(L.getLParenLoc(), syntax::NodeRole::OpenParen); - for (auto *P : L.getParams()) { - Builder.markChild(P, syntax::NodeRole::ParametersAndQualifiers_parameter); - } + + Builder.markChild(buildParameterDeclarationList(L.getParams()), + syntax::NodeRole::ParametersAndQualifiers_parameters); + Builder.markChildToken(L.getRParenLoc(), syntax::NodeRole::CloseParen); Builder.foldNode(Builder.getRange(L.getLParenLoc(), L.getEndLoc()), new (allocator()) syntax::ParametersAndQualifiers, L); diff --git a/clang/lib/Tooling/Syntax/Nodes.cpp b/clang/lib/Tooling/Syntax/Nodes.cpp --- a/clang/lib/Tooling/Syntax/Nodes.cpp +++ b/clang/lib/Tooling/Syntax/Nodes.cpp @@ -134,6 +134,8 @@ return OS << "MemberExpression"; case NodeKind::CallArguments: return OS << "CallArguments"; + case NodeKind::ParameterDeclarationList: + return OS << "ParameterDeclarationList"; } llvm_unreachable("unknown node kind"); } @@ -200,8 +202,8 @@ return OS << "ArraySubscript_sizeExpression"; case syntax::NodeRole::TrailingReturnType_declarator: return OS << "TrailingReturnType_declarator"; - case syntax::NodeRole::ParametersAndQualifiers_parameter: - return OS << "ParametersAndQualifiers_parameter"; + case syntax::NodeRole::ParametersAndQualifiers_parameters: + return OS << "ParametersAndQualifiers_parameters"; case syntax::NodeRole::ParametersAndQualifiers_trailingReturn: return OS << "ParametersAndQualifiers_trailingReturn"; case syntax::NodeRole::IdExpression_id: @@ -269,6 +271,29 @@ return Children; } +std::vector +syntax::ParameterDeclarationList::parameterDeclarations() { + auto ParametersAsNodes = getElementsAsNodes(); + std::vector Children; + for (const auto &ParameterAsNode : ParametersAsNodes) { + Children.push_back(llvm::cast(ParameterAsNode)); + } + return Children; +} + +std::vector> +syntax::ParameterDeclarationList::parametersAndCommas() { + auto ParametersAsNodesAndCommas = getElementsAsNodesAndDelimiters(); + std::vector> + Children; + for (const auto &ParameterAsNodeAndComma : ParametersAsNodesAndCommas) { + Children.push_back( + {llvm::cast(ParameterAsNodeAndComma.element), + ParameterAsNodeAndComma.delimiter}); + } + return Children; +} + syntax::Expression *syntax::MemberExpression::object() { return cast_or_null( findChild(syntax::NodeRole::MemberExpression_object)); @@ -574,14 +599,10 @@ return cast_or_null(findChild(syntax::NodeRole::OpenParen)); } -std::vector +syntax::ParameterDeclarationList * syntax::ParametersAndQualifiers::parameters() { - std::vector Children; - for (auto *C = firstChild(); C; C = C->nextSibling()) { - if (C->role() == syntax::NodeRole::ParametersAndQualifiers_parameter) - Children.push_back(cast(C)); - } - return Children; + return cast_or_null( + findChild(syntax::NodeRole::ParametersAndQualifiers_parameters)); } syntax::Leaf *syntax::ParametersAndQualifiers::rparen() { diff --git a/clang/lib/Tooling/Syntax/Tree.cpp b/clang/lib/Tooling/Syntax/Tree.cpp --- a/clang/lib/Tooling/Syntax/Tree.cpp +++ b/clang/lib/Tooling/Syntax/Tree.cpp @@ -359,6 +359,9 @@ switch (this->kind()) { case NodeKind::NestedNameSpecifier: return clang::tok::coloncolon; + case NodeKind::CallArguments: + case NodeKind::ParametersAndQualifiers: + return clang::tok::comma; default: llvm_unreachable("This is not a subclass of List, thus " "getDelimiterTokenKind() cannot be called"); @@ -369,6 +372,9 @@ switch (this->kind()) { case NodeKind::NestedNameSpecifier: return TerminationKind::Terminated; + case NodeKind::CallArguments: + case NodeKind::ParametersAndQualifiers: + return TerminationKind::Separated; default: llvm_unreachable("This is not a subclass of List, thus " "getTerminationKind() cannot be called"); @@ -379,6 +385,10 @@ switch (this->kind()) { case NodeKind::NestedNameSpecifier: return false; + case NodeKind::CallArguments: + return true; + case NodeKind::ParametersAndQualifiers: + return true; default: llvm_unreachable("This is not a subclass of List, thus canBeEmpty() " "cannot be called"); diff --git a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp --- a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp @@ -85,15 +85,16 @@ | |-'foo' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'a' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'b' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | |-'int' + | | | `-SimpleDeclarator SimpleDeclaration_declarator + | | | `-'a' + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | |-'int' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | `-'b' | `-')' CloseParen `-CompoundStatement |-'{' OpenParen @@ -3162,8 +3163,9 @@ | |-'_c' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | `-'char' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | `-SimpleDeclaration List_element + | | `-'char' | `-')' CloseParen `-';' )txt")); @@ -3219,11 +3221,12 @@ | |-'=' | `-ParametersAndQualifiers | |-'(' OpenParen -| |-SimpleDeclaration ParametersAndQualifiers_parameter -| | |-'const' -| | |-'X' -| | `-SimpleDeclarator SimpleDeclaration_declarator -| | `-'&' +| |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | `-SimpleDeclaration List_element +| | |-'const' +| | |-'X' +| | `-SimpleDeclarator SimpleDeclaration_declarator +| | `-'&' | `-')' CloseParen `-';' )txt"})); @@ -3249,14 +3252,15 @@ | |-'+' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | `-'X' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'const' - | | |-'X' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'&' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | `-'X' + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | |-'const' + | | |-'X' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | `-'&' | `-')' CloseParen `-';' )txt"})); @@ -3885,16 +3889,17 @@ | |-'f' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | |-'xs' - | | `-ArraySubscript - | | |-'[' OpenParen - | | |-'static' - | | |-IntegerLiteralExpression ArraySubscript_sizeExpression - | | | `-'10' LiteralToken - | | `-']' CloseParen + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | `-SimpleDeclaration List_element + | | |-'int' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | |-'xs' + | | `-ArraySubscript + | | |-'[' OpenParen + | | |-'static' + | | |-IntegerLiteralExpression ArraySubscript_sizeExpression + | | | `-'10' LiteralToken + | | `-']' CloseParen | `-')' CloseParen `-';' )txt")); @@ -3933,10 +3938,11 @@ | | |-'func1' | | `-ParametersAndQualifiers | | |-'(' OpenParen -| | |-SimpleDeclaration ParametersAndQualifiers_parameter -| | | |-'int' -| | | `-SimpleDeclarator SimpleDeclaration_declarator -| | | `-'a' +| | |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | | `-SimpleDeclaration List_element +| | | |-'int' +| | | `-SimpleDeclarator SimpleDeclaration_declarator +| | | `-'a' | | `-')' CloseParen | `-';' |-SimpleDeclaration @@ -3945,11 +3951,12 @@ | | |-'func2' | | `-ParametersAndQualifiers | | |-'(' OpenParen -| | |-SimpleDeclaration ParametersAndQualifiers_parameter -| | | |-'int' -| | | `-SimpleDeclarator SimpleDeclaration_declarator -| | | |-'*' -| | | `-'ap' +| | |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | | `-SimpleDeclaration List_element +| | | |-'int' +| | | `-SimpleDeclarator SimpleDeclaration_declarator +| | | |-'*' +| | | `-'ap' | | `-')' CloseParen | `-';' `-SimpleDeclaration @@ -3958,15 +3965,16 @@ | |-'func3' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'a' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'float' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'b' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | |-'int' + | | | `-SimpleDeclarator SimpleDeclaration_declarator + | | | `-'a' + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | |-'float' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | `-'b' | `-')' CloseParen `-';' )txt")); @@ -3987,8 +3995,9 @@ | | |-'func1' | | `-ParametersAndQualifiers | | |-'(' OpenParen -| | |-SimpleDeclaration ParametersAndQualifiers_parameter -| | | `-'int' +| | |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | | `-SimpleDeclaration List_element +| | | `-'int' | | `-')' CloseParen | `-';' |-SimpleDeclaration @@ -3997,10 +4006,11 @@ | | |-'func2' | | `-ParametersAndQualifiers | | |-'(' OpenParen -| | |-SimpleDeclaration ParametersAndQualifiers_parameter -| | | |-'int' -| | | `-SimpleDeclarator SimpleDeclaration_declarator -| | | `-'*' +| | |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | | `-SimpleDeclaration List_element +| | | |-'int' +| | | `-SimpleDeclarator SimpleDeclaration_declarator +| | | `-'*' | | `-')' CloseParen | `-';' `-SimpleDeclaration @@ -4009,11 +4019,103 @@ | |-'func3' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | `-'int' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | `-'float' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | `-'int' + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | `-'float' + | `-')' CloseParen + `-';' +)txt")); +} + +TEST_P(SyntaxTreeTest, + ParametersAndQualifiers_InVariadicFunctionTemplate_ParameterPack) { + if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) { + return; + } + EXPECT_TRUE(treeDumpEqualOnAnnotations( + R"cpp( +template +[[void test(T , Args... );]] +)cpp", + {R"txt( +SimpleDeclaration +|-'void' +|-SimpleDeclarator SimpleDeclaration_declarator +| |-'test' +| `-ParametersAndQualifiers +| |-'(' OpenParen +| |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | |-SimpleDeclaration List_element +| | | `-'T' +| | |-',' List_delimiter +| | `-SimpleDeclaration List_element +| | |-'Args' +| | `-'...' +| `-')' CloseParen +`-';' +)txt"})); +} + +TEST_P(SyntaxTreeTest, + ParametersAndQualifiers_InVariadicFunctionTemplate_NamedParameterPack) { + if (!GetParam().isCXX11OrLater() || GetParam().hasDelayedTemplateParsing()) { + return; + } + EXPECT_TRUE(treeDumpEqualOnAnnotations( + R"cpp( +template +[[void test(T t, Args... args);]] +)cpp", + {R"txt( +SimpleDeclaration +|-'void' +|-SimpleDeclarator SimpleDeclaration_declarator +| |-'test' +| `-ParametersAndQualifiers +| |-'(' OpenParen +| |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | |-SimpleDeclaration List_element +| | | |-'T' +| | | `-SimpleDeclarator SimpleDeclaration_declarator +| | | `-'t' +| | |-',' List_delimiter +| | `-SimpleDeclaration List_element +| | |-'Args' +| | |-'...' +| | `-SimpleDeclarator SimpleDeclaration_declarator +| | `-'args' +| `-')' CloseParen +`-';' +)txt"})); +} + +TEST_P(SyntaxTreeTest, + ParametersAndQualifiers_InFreeFunctions_VariadicArguments) { + if (!GetParam().isCXX11OrLater()) { + return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test(int , char ...); +)cpp", + R"txt( +TranslationUnit Detached +`-SimpleDeclaration + |-'void' + |-SimpleDeclarator SimpleDeclaration_declarator + | |-'test' + | `-ParametersAndQualifiers + | |-'(' OpenParen + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | `-'int' + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | `-'char' + | |-'...' | `-')' CloseParen `-';' )txt")); @@ -4036,24 +4138,25 @@ | |-'func' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'const' - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'a' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'volatile' - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'b' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'const' - | | |-'volatile' - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'c' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | |-'const' + | | | |-'int' + | | | `-SimpleDeclarator SimpleDeclaration_declarator + | | | `-'a' + | | |-',' List_delimiter + | | |-SimpleDeclaration List_element + | | | |-'volatile' + | | | |-'int' + | | | `-SimpleDeclarator SimpleDeclaration_declarator + | | | `-'b' + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | |-'const' + | | |-'volatile' + | | |-'int' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | `-'c' | `-')' CloseParen `-';' )txt")); @@ -4075,11 +4178,12 @@ | |-'func' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | |-'&' - | | `-'a' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | `-SimpleDeclaration List_element + | | |-'int' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | |-'&' + | | `-'a' | `-')' CloseParen `-';' )txt")); @@ -4101,11 +4205,12 @@ | |-'func' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'int' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | |-'&&' - | | `-'a' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | `-SimpleDeclaration List_element + | | |-'int' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | |-'&&' + | | `-'a' | `-')' CloseParen `-';' )txt")); @@ -4403,8 +4508,9 @@ | | | `-')' CloseParen | | `-ParametersAndQualifiers | | |-'(' OpenParen -| | |-SimpleDeclaration ParametersAndQualifiers_parameter -| | | `-'int' +| | |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | | `-SimpleDeclaration List_element +| | | `-'int' | | `-')' CloseParen | `-';' `-SimpleDeclaration @@ -4417,8 +4523,9 @@ | | `-')' CloseParen | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | `-'int' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | `-SimpleDeclaration List_element + | | `-'int' | `-')' CloseParen `-';' )txt")); @@ -4523,8 +4630,9 @@ | | `-')' CloseParen | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | `-'int' + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | `-SimpleDeclaration List_element + | | `-'int' | |-')' CloseParen | `-TrailingReturnType ParametersAndQualifiers_trailingReturn | |-'->' ArrowToken @@ -4617,11 +4725,12 @@ | | `-')' CloseParen | `-ParametersAndQualifiers | |-'(' OpenParen -| |-SimpleDeclaration ParametersAndQualifiers_parameter -| | |-'const' -| | |-'int' -| | `-SimpleDeclarator SimpleDeclaration_declarator -| | `-'*' +| |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | `-SimpleDeclaration List_element +| | |-'const' +| | |-'int' +| | `-SimpleDeclarator SimpleDeclaration_declarator +| | `-'*' | `-')' CloseParen `-';' )txt", @@ -4641,14 +4750,15 @@ | | `-')' CloseParen | `-ParametersAndQualifiers | |-'(' OpenParen -| |-SimpleDeclaration ParametersAndQualifiers_parameter -| | |-'const' -| | |-'int' -| | `-SimpleDeclarator SimpleDeclaration_declarator -| | `-'*' -| |-',' -| |-SimpleDeclaration ParametersAndQualifiers_parameter -| | `-'char' +| |-ParameterDeclarationList ParametersAndQualifiers_parameters +| | |-SimpleDeclaration List_element +| | | |-'const' +| | | |-'int' +| | | `-SimpleDeclarator SimpleDeclaration_declarator +| | | `-'*' +| | |-',' List_delimiter +| | `-SimpleDeclaration List_element +| | `-'char' | `-')' CloseParen `-';' )txt"})); @@ -4667,24 +4777,26 @@ | |-'x' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'char' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'a' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'short' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | |-ParenDeclarator - | | | |-'(' OpenParen - | | | |-'*' - | | | |-'b' - | | | `-')' CloseParen - | | `-ParametersAndQualifiers - | | |-'(' OpenParen - | | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | | `-'int' - | | `-')' CloseParen + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | |-'char' + | | | `-SimpleDeclarator SimpleDeclaration_declarator + | | | `-'a' + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | |-'short' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | |-ParenDeclarator + | | | |-'(' OpenParen + | | | |-'*' + | | | |-'b' + | | | `-')' CloseParen + | | `-ParametersAndQualifiers + | | |-'(' OpenParen + | | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | | `-SimpleDeclaration List_element + | | | `-'int' + | | `-')' CloseParen | `-')' CloseParen `-';' )txt")); @@ -4703,40 +4815,43 @@ | |-'x' | `-ParametersAndQualifiers | |-'(' OpenParen - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'char' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | `-'a' - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'short' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | |-ParenDeclarator - | | | |-'(' OpenParen - | | | |-'*' - | | | |-'b' - | | | `-')' CloseParen - | | `-ParametersAndQualifiers - | | |-'(' OpenParen - | | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | | `-'int' - | | `-')' CloseParen - | |-',' - | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | |-'long' - | | `-SimpleDeclarator SimpleDeclaration_declarator - | | |-ParenDeclarator - | | | |-'(' OpenParen - | | | |-'*' - | | | |-'*' - | | | |-'c' - | | | `-')' CloseParen - | | `-ParametersAndQualifiers - | | |-'(' OpenParen - | | |-SimpleDeclaration ParametersAndQualifiers_parameter - | | | |-'long' - | | | `-'long' - | | `-')' CloseParen + | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | |-SimpleDeclaration List_element + | | | |-'char' + | | | `-SimpleDeclarator SimpleDeclaration_declarator + | | | `-'a' + | | |-',' List_delimiter + | | |-SimpleDeclaration List_element + | | | |-'short' + | | | `-SimpleDeclarator SimpleDeclaration_declarator + | | | |-ParenDeclarator + | | | | |-'(' OpenParen + | | | | |-'*' + | | | | |-'b' + | | | | `-')' CloseParen + | | | `-ParametersAndQualifiers + | | | |-'(' OpenParen + | | | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | | | `-SimpleDeclaration List_element + | | | | `-'int' + | | | `-')' CloseParen + | | |-',' List_delimiter + | | `-SimpleDeclaration List_element + | | |-'long' + | | `-SimpleDeclarator SimpleDeclaration_declarator + | | |-ParenDeclarator + | | | |-'(' OpenParen + | | | |-'*' + | | | |-'*' + | | | |-'c' + | | | `-')' CloseParen + | | `-ParametersAndQualifiers + | | |-'(' OpenParen + | | |-ParameterDeclarationList ParametersAndQualifiers_parameters + | | | `-SimpleDeclaration List_element + | | | |-'long' + | | | `-'long' + | | `-')' CloseParen | `-')' CloseParen `-';' )txt"));