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>
This commit is contained in:
Christian Kandeler
2020-11-06 14:28:12 +01:00
parent 30c1652d10
commit 59f8bd4702
4 changed files with 14 additions and 1 deletions

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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)

View File

@@ -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