forked from qt-creator/qt-creator
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:
1
src/libs/3rdparty/cplusplus/AST.h
vendored
1
src/libs/3rdparty/cplusplus/AST.h
vendored
@@ -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;
|
||||
|
10
src/libs/3rdparty/cplusplus/Bind.cpp
vendored
10
src/libs/3rdparty/cplusplus/Bind.cpp
vendored
@@ -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);
|
||||
}
|
||||
|
3
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
3
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
@@ -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)
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user