summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp10
-rw-r--r--src/shared/cplusplus/AST.h3
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp3
-rw-r--r--src/shared/cplusplus/ASTfwd.h2
-rw-r--r--src/shared/cplusplus/CheckSpecifier.cpp3
-rw-r--r--src/shared/cplusplus/Parser.cpp27
-rw-r--r--src/shared/cplusplus/Parser.h4
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);