diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2020-11-06 14:28:12 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2020-11-11 15:41:27 +0000 |
commit | 59f8bd47023227afc5d8acbdbaf18972395c1c73 (patch) | |
tree | 7d511b87f67f47e6ca2f723dea9bda00ab1ea8ac /src/libs/3rdparty/cplusplus | |
parent | 30c1652d109e20a3efcaaef61be108c91426d6fa (diff) |
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 <christian.stenger@qt.io>
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 10 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 3 |
3 files changed, 14 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index a03f5b5f82..a9109791b4 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 f30e285753..5313bd2d91 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 1550c8b31d..4cf890d8f7 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) |