diff options
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 10 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 3 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisit.cpp | 3 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTfwd.h | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/CheckSpecifier.cpp | 3 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 27 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.h | 4 |
7 files changed, 30 insertions, 22 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 0ef6f91f4a..ab2578c49f 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -382,15 +382,13 @@ unsigned ClassSpecifierAST::lastToken() const if (lbrace_token) return lbrace_token + 1; - for (BaseSpecifierAST *it = base_clause; it; it = it->next) { - if (! it->next) - return it->lastToken(); - } + else if (base_clause_list) + return base_clause_list->lastToken(); - if (colon_token) + else if (colon_token) return colon_token + 1; - if (name) + else if (name) return name->lastToken(); for (SpecifierAST *it = attributes; it; it = it->next) { diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index da2c9d1fae..fdaaf8100c 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -478,7 +478,6 @@ public: unsigned virtual_token; unsigned access_specifier_token; NameAST *name; - BaseSpecifierAST *next; public: // annotations BaseClass *symbol; @@ -571,7 +570,7 @@ public: SpecifierAST *attributes; NameAST *name; unsigned colon_token; - BaseSpecifierAST *base_clause; + BaseSpecifierListAST *base_clause_list; unsigned lbrace_token; DeclarationListAST *member_specifiers; unsigned rbrace_token; diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index aea713c4c7..9b48f3db6d 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -163,8 +163,7 @@ void ClassSpecifierAST::accept0(ASTVisitor *visitor) for (SpecifierAST *it = attributes; it; it = it->next) accept(it, visitor); accept(name, visitor); - for (BaseSpecifierAST *it = base_clause; it; it = it->next) - accept(it, visitor); + accept(base_clause_list, visitor); for (DeclarationListAST *it = member_specifiers; it; it = it->next) accept(it, visitor); } diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index d38aafc128..94f36c7b01 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -195,6 +195,8 @@ typedef List<ExpressionAST *> ExpressionListAST; typedef List<DeclarationAST *> DeclarationListAST; typedef List<StatementAST *> StatementListAST; typedef List<DeclaratorAST *> DeclaratorListAST; +typedef List<BaseSpecifierAST *> BaseSpecifierListAST; + typedef List<NameAST *> ObjCIdentifierListAST; typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST; typedef List<ObjCSelectorArgumentAST *> ObjCSelectorArgumentListAST; diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index 8c70f153d5..65909536fd 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -328,7 +328,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast) _scope->enterSymbol(klass); _fullySpecifiedType.setType(klass); - for (BaseSpecifierAST *base = ast->base_clause; base; base = base->next) { + for (BaseSpecifierListAST *it = ast->base_clause_list; it; it = it->next) { + BaseSpecifierAST *base = it->value; Name *baseClassName = semantic()->check(base->name, _scope); BaseClass *baseClass = control()->newBaseClass(ast->firstToken(), baseClassName); base->symbol = baseClass; diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 40581cc9e9..dc89952caf 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1550,17 +1550,23 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node) unsigned colon_token = 0; if (LA() == T_COLON || LA() == T_LBRACE) { - BaseSpecifierAST *base_clause = 0; + BaseSpecifierListAST *base_clause_list = 0; + if (LA() == T_COLON) { colon_token = cursor(); - parseBaseClause(base_clause); + + parseBaseClause(base_clause_list); + if (LA() != T_LBRACE) { _translationUnit->error(cursor(), "expected `{' before `%s'", tok().spell()); - unsigned saved = cursor(); + + const unsigned saved = cursor(); + for (int n = 0; n < 3 && LA() != T_EOF_SYMBOL; ++n, consumeToken()) { if (LA() == T_LBRACE) break; } + if (LA() != T_LBRACE) rewind(saved); } @@ -1571,7 +1577,7 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node) ast->attributes = attributes; ast->name = name; ast->colon_token = colon_token; - ast->base_clause = base_clause; + ast->base_clause_list = base_clause_list; if (LA() == T_LBRACE) ast->lbrace_token = consumeToken(); @@ -1778,13 +1784,14 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node, return true; } -bool Parser::parseBaseClause(BaseSpecifierAST *&node) +bool Parser::parseBaseClause(BaseSpecifierListAST *&node) { DEBUG_THIS_RULE(); + if (LA() == T_COLON) { - consumeToken(); + consumeToken(); // ### remove me - BaseSpecifierAST **ast = &node; + BaseSpecifierListAST **ast = &node; if (parseBaseSpecifier(*ast)) { ast = &(*ast)->next; @@ -1895,7 +1902,7 @@ bool Parser::parseExpressionList(ExpressionListAST *&node) return false; } -bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node) +bool Parser::parseBaseSpecifier(BaseSpecifierListAST *&node) { DEBUG_THIS_RULE(); BaseSpecifierAST *ast = new (_pool) BaseSpecifierAST; @@ -1918,7 +1925,9 @@ bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node) parseName(ast->name); if (! ast->name) _translationUnit->error(cursor(), "expected class-name"); - node = ast; + + node = new (_pool) BaseSpecifierListAST; + node->value = ast; return true; } diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index d9ccf6ab49..2f0514d269 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -84,8 +84,8 @@ public: bool parseAsmOperand(); bool parseAsmClobberList(); bool parseAssignmentExpression(ExpressionAST *&node); - bool parseBaseClause(BaseSpecifierAST *&node); - bool parseBaseSpecifier(BaseSpecifierAST *&node); + bool parseBaseClause(BaseSpecifierListAST *&node); + bool parseBaseSpecifier(BaseSpecifierListAST *&node); bool parseBlockDeclaration(DeclarationAST *&node); bool parseCppCastExpression(ExpressionAST *&node); bool parseCastExpression(ExpressionAST *&node); |