aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2020-11-06 14:28:12 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2020-11-11 15:41:27 +0000
commit59f8bd47023227afc5d8acbdbaf18972395c1c73 (patch)
tree7d511b87f67f47e6ca2f723dea9bda00ab1ea8ac /src/libs/3rdparty/cplusplus
parent30c1652d109e20a3efcaaef61be108c91426d6fa (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.h1
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp10
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp3
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)