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