diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp index f0291a09575a43ecc9055830d61d7fb4f2a33895..8be3d032895e22f5eb9182249056cb58bfa9dce8 100644 --- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp +++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp @@ -458,7 +458,7 @@ bool CheckUndefinedSymbols::visit(SizeofExpressionAST *ast) } else if (type_id->declarator && type_id->declarator->postfix_declarators && ! type_id->declarator->postfix_declarators->next - && type_id->declarator->postfix_declarators->asArrayDeclarator() != 0) { + && type_id->declarator->postfix_declarators->value->asArrayDeclarator() != 0) { // this sizeof expression is ambiguos, e.g. // sizeof(a[10]) // `a' can be a typeid or an expression. diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp index d58d17a9716487e8701b848f2caecabd8d72b426..a9b2d38d1e9ac024184a8fa9863f529917e64564 100644 --- a/src/libs/cplusplus/FindUsages.cpp +++ b/src/libs/cplusplus/FindUsages.cpp @@ -416,8 +416,8 @@ bool FindUsages::visit(ParameterDeclarationAST *ast) if (! _inSimpleDeclaration) // visit the core declarator only if we are not in simple-declaration. accept(declarator->core_declarator); - for (PostfixDeclaratorAST *fx_op = declarator->postfix_declarators; fx_op; fx_op = fx_op->next) - accept(fx_op); + for (PostfixDeclaratorListAST *it = declarator->postfix_declarators; it; it = it->next) + accept(it->value); for (SpecifierAST *spec = declarator->post_attributes; spec; spec = spec->next) accept(spec); diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index a221f8a25b2d1281596a1e80ca616f2200f342cc..9251835db512ead2d9027cace3f94c5bc3907151 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -1073,7 +1073,7 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi doc->check(); if (SimpleDeclarationAST *sd = doc->translationUnit()->ast()->asSimpleDeclaration()) { if (sd->declarators->value->postfix_declarators - && sd->declarators->value->postfix_declarators->asFunctionDeclarator()) { + && sd->declarators->value->postfix_declarators->value->asFunctionDeclarator()) { autocompleteSignature = true; } } diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 035f5dae37a811e07cb964ff4de7138e3eddeb2d..30ba2cba5a6a24cd467dc51f0b683e67dffc5180 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -560,10 +560,8 @@ unsigned DeclaratorAST::lastToken() const return it->lastToken(); } - for (PostfixDeclaratorAST *it = postfix_declarators; it; it = it->next) { - if (! it->next) - return it->lastToken(); - } + if (postfix_declarators) + return postfix_declarators->lastToken(); if (core_declarator) return core_declarator->lastToken(); diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index bd5b91f4ad38a74fa1776b85ef80baa7d7284224..b56fed68c710af24c7ff72a45cc8cb7ffa0be085 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -374,9 +374,6 @@ public: class CPLUSPLUS_EXPORT PostfixDeclaratorAST: public AST { -public: - PostfixDeclaratorAST *next; - public: virtual PostfixDeclaratorAST *asPostfixDeclarator() { return this; } }; @@ -387,7 +384,7 @@ public: SpecifierAST *attributes; PtrOperatorAST *ptr_operators; CoreDeclaratorAST *core_declarator; - PostfixDeclaratorAST *postfix_declarators; + PostfixDeclaratorListAST *postfix_declarators; SpecifierAST *post_attributes; unsigned equals_token; ExpressionAST *initializer; diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 5345471140354520e45e5b08adb7118b71556514..e8fbdce3284461a145422023c903b6d6ec0ca7f5 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -73,8 +73,7 @@ void DeclaratorAST::accept0(ASTVisitor *visitor) for (PtrOperatorAST *it = ptr_operators; it; it = it->next) accept(it, visitor); accept(core_declarator, visitor); - for (PostfixDeclaratorAST *it = postfix_declarators; it; it = it->next) - accept(it, visitor); + accept(postfix_declarators, visitor); for (SpecifierAST *it = post_attributes; it; it = it->next) accept(it, visitor); accept(initializer, visitor); diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index 9bbf9681f0f3f5743e002699370112e61c720548..922dd6b2760e779b77897f64e11ae96ea915b62d 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -200,6 +200,7 @@ typedef List<EnumeratorAST *> EnumeratorListAST; typedef List<MemInitializerAST *> MemInitializerListAST; typedef List<NewArrayDeclaratorAST *> NewArrayDeclaratorListAST; typedef List<PostfixAST *> PostfixListAST; +typedef List<PostfixDeclaratorAST *> PostfixDeclaratorListAST; typedef List<NameAST *> ObjCIdentifierListAST; typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST; diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp index f89f796fe4eb8d6ac1b3299fd6db43c1dc41957e..d32926e2eb7f374805df5760b36fe615a66b0fbd 100644 --- a/src/shared/cplusplus/CheckDeclarator.cpp +++ b/src/shared/cplusplus/CheckDeclarator.cpp @@ -205,7 +205,6 @@ bool CheckDeclarator::visit(FunctionDeclaratorAST *ast) fun->setVolatile(true); } - accept(ast->next); return false; } @@ -215,7 +214,6 @@ bool CheckDeclarator::visit(ArrayDeclaratorAST *ast) FullySpecifiedType exprTy = semantic()->check(ast->expression, _scope); FullySpecifiedType arrTy(ty); _fullySpecifiedType = ty; - accept(ast->next); return false; } @@ -226,7 +224,6 @@ bool CheckDeclarator::visit(PointerToMemberAST *ast) FullySpecifiedType ty(ptrTy); _fullySpecifiedType = ty; applyCvQualifiers(ast->cv_qualifier_seq); - accept(ast->next); return false; } @@ -236,7 +233,6 @@ bool CheckDeclarator::visit(PointerAST *ast) FullySpecifiedType ty(ptrTy); _fullySpecifiedType = ty; applyCvQualifiers(ast->cv_qualifier_seq); - accept(ast->next); return false; } @@ -245,7 +241,6 @@ bool CheckDeclarator::visit(ReferenceAST *ast) ReferenceType *refTy = control()->referenceType(_fullySpecifiedType); FullySpecifiedType ty(refTy); _fullySpecifiedType = ty; - accept(ast->next); return false; } diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index f9519736163961dda79e9aba2d661e934beee0d3..c74b3ca96026a28e80abfd401398ce660221af76 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1127,7 +1127,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer) if (! parseCoreDeclarator(node)) return false; - PostfixDeclaratorAST **postfix_ptr = &node->postfix_declarators; + PostfixDeclaratorListAST **postfix_ptr = &node->postfix_declarators; for (;;) { unsigned startOfPostDeclarator = cursor(); @@ -1155,7 +1155,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer) ast->parameters = parameter_declaration_clause; ast->as_cpp_initializer = initializer; ast->rparen_token = rparen_token; - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixDeclaratorListAST(ast); postfix_ptr = &(*postfix_ptr)->next; blockErrors(blocked); @@ -1185,7 +1185,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer) ast->rparen_token = consumeToken(); parseCvQualifiers(ast->cv_qualifier_seq); parseExceptionSpecification(ast->exception_specification); - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixDeclaratorListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else if (LA() == T_LBRACKET) { ArrayDeclaratorAST *ast = new (_pool) ArrayDeclaratorAST; @@ -1193,7 +1193,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer) if (LA() == T_RBRACKET || parseConstantExpression(ast->expression)) { match(T_RBRACKET, &ast->rbracket_token); } - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixDeclaratorListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else break; @@ -1257,7 +1257,7 @@ bool Parser::parseAbstractDeclarator(DeclaratorAST *&node) if (! parseAbstractCoreDeclarator(node)) return false; - PostfixDeclaratorAST *postfix_declarators = 0, + PostfixDeclaratorListAST *postfix_declarators = 0, **postfix_ptr = &postfix_declarators; for (;;) { @@ -1270,7 +1270,7 @@ bool Parser::parseAbstractDeclarator(DeclaratorAST *&node) } parseCvQualifiers(ast->cv_qualifier_seq); parseExceptionSpecification(ast->exception_specification); - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixDeclaratorListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else if (LA() == T_LBRACKET) { ArrayDeclaratorAST *ast = new (_pool) ArrayDeclaratorAST; @@ -1279,7 +1279,7 @@ bool Parser::parseAbstractDeclarator(DeclaratorAST *&node) if (LA() == T_RBRACKET) ast->rbracket_token = consumeToken(); } - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixDeclaratorListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else break; @@ -2206,7 +2206,7 @@ bool Parser::maybeAmbiguousStatement(DeclarationStatementAST *ast) const } else if (DeclaratorListAST *declarators = declaration->declarators) { // no decl_specifiers... if (DeclaratorAST *declarator = declarators->value) { - if (declarator->postfix_declarators && declarator->postfix_declarators->asFunctionDeclarator() + if (declarator->postfix_declarators && declarator->postfix_declarators->value->asFunctionDeclarator() && ! declarator->initializer) { return false; } diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp index c653b7fdcf6164835cfae76022bc2232c703ed50..9dc3d872a73150dbf946cef87524cbe720e506e8 100644 --- a/tests/auto/cplusplus/ast/tst_ast.cpp +++ b/tests/auto/cplusplus/ast/tst_ast.cpp @@ -484,7 +484,7 @@ void tst_AST::cpp_initializer_or_function_declaration() QVERIFY(decl_id->name->asSimpleName() != 0); QCOMPARE(decl_id->name->asSimpleName()->identifier_token, 2U); - FunctionDeclaratorAST *fun_declarator = declarator->postfix_declarators->asFunctionDeclarator(); + FunctionDeclaratorAST *fun_declarator = declarator->postfix_declarators->value->asFunctionDeclarator(); QVERIFY(fun_declarator != 0); QCOMPARE(fun_declarator->lparen_token, 3U); QVERIFY(fun_declarator->parameters != 0);