From 59f8bd47023227afc5d8acbdbaf18972395c1c73 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 6 Nov 2020 14:28:12 +0100 Subject: [PATCH] CPlusPlus: Expose "static" specifier also for function declarations To be able to do this, the parser needs to store the decl specifier list in FunctionDeclaratorAST objects, the same way it is done for FunctionDefinitionAST. Task-number: QTCREATORBUG-24894 Change-Id: I475fb08b1f14c63f3050d72dff200c1b08df5789 Reviewed-by: Christian Stenger --- src/libs/3rdparty/cplusplus/AST.h | 1 + src/libs/3rdparty/cplusplus/Bind.cpp | 10 ++++++++++ src/libs/3rdparty/cplusplus/Parser.cpp | 3 +++ tests/auto/cplusplus/findusages/tst_findusages.cpp | 1 - 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index a03f5b5f823..a9109791b47 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -1249,6 +1249,7 @@ protected: class CPLUSPLUS_EXPORT FunctionDeclaratorAST: public PostfixDeclaratorAST { public: + SpecifierListAST *decl_specifier_list = nullptr; int lparen_token = 0; ParameterDeclarationClauseAST *parameter_declaration_clause = nullptr; int rparen_token = 0; diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index f30e2857533..5313bd2d913 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -3308,10 +3308,20 @@ bool Bind::visit(FunctionDeclaratorAST *ast) _type = this->trailingReturnType(ast->trailing_return_type, _type); fun->setReturnType(_type); + // "static", "virtual" etc. + FullySpecifiedType declSpecifiers; + for (SpecifierListAST *it = ast->decl_specifier_list; it; it = it->next) + declSpecifiers = this->specifier(it->value, declSpecifiers); + setDeclSpecifiers(fun, declSpecifiers); + // int lparen_token = ast->lparen_token; this->parameterDeclarationClause(ast->parameter_declaration_clause, ast->lparen_token, fun); // int rparen_token = ast->rparen_token; FullySpecifiedType type(fun); + type.setStatic(declSpecifiers.isStatic()); + type.setVirtual(declSpecifiers.isVirtual()); + type.setDeprecated(declSpecifiers.isDeprecated()); + type.setUnavailable(declSpecifiers.isUnavailable()); for (SpecifierListAST *it = ast->cv_qualifier_list; it; it = it->next) { type = this->specifier(it->value, type); } diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 1550c8b31d8..4cf890d8f79 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -1673,6 +1673,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, SpecifierListAST *decl_specif int rparen_token = consumeToken(); FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST; + ast->decl_specifier_list = decl_specifier_list; ast->lparen_token = lparen_token; ast->parameter_declaration_clause = parameter_declaration_clause; ast->as_cpp_initializer = initializer; @@ -1696,6 +1697,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, SpecifierListAST *decl_specif } FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST; + ast->decl_specifier_list = decl_specifier_list; ast->lparen_token = consumeToken(); parseParameterDeclarationClause(ast->parameter_declaration_clause); if (LA() != T_RPAREN) { @@ -1799,6 +1801,7 @@ bool Parser::parseAbstractDeclarator(DeclaratorAST *&node, SpecifierListAST *dec for (;;) { if (LA() == T_LPAREN) { FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST; + ast->decl_specifier_list = decl_specifier_list; ast->lparen_token = consumeToken(); if (LA() == T_RPAREN || parseParameterDeclarationClause(ast->parameter_declaration_clause)) { if (LA() == T_RPAREN) diff --git a/tests/auto/cplusplus/findusages/tst_findusages.cpp b/tests/auto/cplusplus/findusages/tst_findusages.cpp index 71d09f6c619..a179992abb8 100644 --- a/tests/auto/cplusplus/findusages/tst_findusages.cpp +++ b/tests/auto/cplusplus/findusages/tst_findusages.cpp @@ -2232,7 +2232,6 @@ int main() QCOMPARE(find.usages().at(28).type, Usage::Type::Read); QCOMPARE(find.usages().at(29).type, Usage::Type::Read); QCOMPARE(find.usages().at(31).type, Usage::Type::Other); - QEXPECT_FAIL(nullptr, "parser does not expose static specifier", Continue); QCOMPARE(find.usages().at(32).type, Usage::Type::Other); // Usages of struct type