summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp35
-rw-r--r--src/shared/cplusplus/CheckDeclaration.h2
-rw-r--r--src/shared/cplusplus/CheckStatement.cpp10
-rw-r--r--src/shared/cplusplus/Symbols.cpp8
4 files changed, 45 insertions, 10 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 79392bf4e7..ef71c79809 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -122,6 +122,18 @@ void CheckDeclaration::checkFunctionArguments(Function *fun)
}
}
+unsigned CheckDeclaration::locationOfDeclaratorId(DeclaratorAST *declarator) const
+{
+ if (declarator && declarator->core_declarator) {
+ if (DeclaratorIdAST *declaratorId = declarator->core_declarator->asDeclaratorId())
+ return declaratorId->firstToken();
+ else if (NestedDeclaratorAST *nested = declarator->core_declarator->asNestedDeclarator())
+ return locationOfDeclaratorId(nested->declarator);
+ }
+
+ return 0;
+}
+
bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
{
FullySpecifiedType ty = semantic()->check(ast->decl_specifier_seq, _scope);
@@ -164,11 +176,13 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
FullySpecifiedType declTy = semantic()->check(it->declarator, qualTy,
_scope, &name);
- unsigned location = 0;
- if (it->declarator)
- location = it->declarator->firstToken();
- else
- location = ast->firstToken();
+ unsigned location = locationOfDeclaratorId(it->declarator);
+ if (! location) {
+ if (it->declarator)
+ location = it->declarator->firstToken();
+ else
+ location = ast->firstToken();
+ }
Function *fun = 0;
if (declTy && 0 != (fun = declTy->asFunctionType())) {
@@ -355,10 +369,13 @@ bool CheckDeclaration::visit(NamespaceAliasDefinitionAST *)
bool CheckDeclaration::visit(ParameterDeclarationAST *ast)
{
- unsigned sourceLocation = 0;
-
- if (ast->declarator)
- sourceLocation = ast->declarator->firstToken();
+ unsigned sourceLocation = locationOfDeclaratorId(ast->declarator);
+ if (! sourceLocation) {
+ if (ast->declarator)
+ sourceLocation = ast->declarator->firstToken();
+ else
+ sourceLocation = ast->firstToken();
+ }
Name *argName = 0;
FullySpecifiedType ty = semantic()->check(ast->type_specifier, _scope);
diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h
index 0ba2568830..4abd859847 100644
--- a/src/shared/cplusplus/CheckDeclaration.h
+++ b/src/shared/cplusplus/CheckDeclaration.h
@@ -72,6 +72,8 @@ protected:
using ASTVisitor::visit;
+ unsigned locationOfDeclaratorId(DeclaratorAST *declarator) const;
+
virtual bool visit(SimpleDeclarationAST *ast);
virtual bool visit(EmptyDeclarationAST *ast);
virtual bool visit(AccessDeclarationAST *ast);
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index 433dc5c873..0d7bced86e 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -144,6 +144,8 @@ bool CheckStatement::visit(ExpressionStatementAST *ast)
bool CheckStatement::visit(ForStatementAST *ast)
{
Block *block = control()->newBlock(ast->for_token);
+ block->setStartOffset(tokenAt(ast->firstToken()).offset);
+ block->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = block;
_scope->enterSymbol(block);
Scope *previousScope = switchScope(block->members());
@@ -158,6 +160,8 @@ bool CheckStatement::visit(ForStatementAST *ast)
bool CheckStatement::visit(IfStatementAST *ast)
{
Block *block = control()->newBlock(ast->if_token);
+ block->setStartOffset(tokenAt(ast->firstToken()).offset);
+ block->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = block;
_scope->enterSymbol(block);
Scope *previousScope = switchScope(block->members());
@@ -198,6 +202,8 @@ bool CheckStatement::visit(ReturnStatementAST *ast)
bool CheckStatement::visit(SwitchStatementAST *ast)
{
Block *block = control()->newBlock(ast->switch_token);
+ block->setStartOffset(tokenAt(ast->firstToken()).offset);
+ block->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = block;
_scope->enterSymbol(block);
Scope *previousScope = switchScope(block->members());
@@ -219,6 +225,8 @@ bool CheckStatement::visit(TryBlockStatementAST *ast)
bool CheckStatement::visit(CatchClauseAST *ast)
{
Block *block = control()->newBlock(ast->catch_token);
+ block->setStartOffset(tokenAt(ast->firstToken()).offset);
+ block->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = block;
_scope->enterSymbol(block);
Scope *previousScope = switchScope(block->members());
@@ -231,6 +239,8 @@ bool CheckStatement::visit(CatchClauseAST *ast)
bool CheckStatement::visit(WhileStatementAST *ast)
{
Block *block = control()->newBlock(ast->while_token);
+ block->setStartOffset(tokenAt(ast->firstToken()).offset);
+ block->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = block;
_scope->enterSymbol(block);
Scope *previousScope = switchScope(block->members());
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index dc1a6957c6..dddc153928 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -328,7 +328,13 @@ FullySpecifiedType Block::type() const
{ return FullySpecifiedType(); }
void Block::visitSymbol0(SymbolVisitor *visitor)
-{ visitor->visit(this); }
+{
+ if (visitor->visit(this)) {
+ for (unsigned i = 0; i < memberCount(); ++i) {
+ visitSymbol(memberAt(i), visitor);
+ }
+ }
+}
Enum::Enum(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name)
: ScopedSymbol(translationUnit, sourceLocation, name)