summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-12-16 12:25:51 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-12-16 12:26:12 +0100
commit88fe5a50a11908c2c1cc99308fd6f8846b3b7644 (patch)
tree939a5c927c9733062a898a1c886e2abcda467875 /src/shared/cplusplus
parent476dda1b43ab0627c451a4422a4e1db799e6aa00 (diff)
downloadqt-creator-88fe5a50a11908c2c1cc99308fd6f8846b3b7644.tar.gz
Added semantic checks for stray semicolons and topldevel empty declarations.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp4
-rw-r--r--src/shared/cplusplus/AST.h2
-rw-r--r--src/shared/cplusplus/ASTClone.cpp1
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp2
-rw-r--r--src/shared/cplusplus/Bind.cpp16
-rw-r--r--src/shared/cplusplus/Parser.cpp3
6 files changed, 27 insertions, 1 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 43b5cb4553..bd6b4e18c5 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1107,6 +1107,8 @@ unsigned EnumSpecifierAST::firstToken() const
if (enumerator_list)
if (unsigned candidate = enumerator_list->firstToken())
return candidate;
+ if (stray_comma_token)
+ return stray_comma_token;
if (rbrace_token)
return rbrace_token;
return 0;
@@ -1117,6 +1119,8 @@ unsigned EnumSpecifierAST::lastToken() const
{
if (rbrace_token)
return rbrace_token + 1;
+ if (stray_comma_token)
+ return stray_comma_token + 1;
if (enumerator_list)
if (unsigned candidate = enumerator_list->lastToken())
return candidate;
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 74954b5930..53b484d770 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1621,6 +1621,7 @@ public:
NameAST *name;
unsigned lbrace_token;
EnumeratorListAST *enumerator_list;
+ unsigned stray_comma_token;
unsigned rbrace_token;
public: // annotations
@@ -1632,6 +1633,7 @@ public:
, name(0)
, lbrace_token(0)
, enumerator_list(0)
+ , stray_comma_token(0)
, rbrace_token(0)
, symbol(0)
{}
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index f9d14bfec4..15114ea467 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -557,6 +557,7 @@ EnumSpecifierAST *EnumSpecifierAST::clone(MemoryPool *pool) const
for (EnumeratorListAST *iter = enumerator_list, **ast_iter = &ast->enumerator_list;
iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
*ast_iter = new (pool) EnumeratorListAST((iter->value) ? iter->value->clone(pool) : 0);
+ ast->stray_comma_token = stray_comma_token;
ast->rbrace_token = rbrace_token;
return ast;
}
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 6d2bf04b90..89f83065f4 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -926,6 +926,8 @@ bool ASTMatcher::match(EnumSpecifierAST *node, EnumSpecifierAST *pattern)
else if (! AST::match(node->enumerator_list, pattern->enumerator_list, this))
return false;
+ pattern->stray_comma_token = node->stray_comma_token;
+
pattern->rbrace_token = node->rbrace_token;
return true;
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index ef95d898f9..7579838bb5 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -1796,7 +1796,13 @@ bool Bind::visit(SimpleDeclarationAST *ast)
bool Bind::visit(EmptyDeclarationAST *ast)
{
(void) ast;
- // unsigned semicolon_token = ast->semicolon_token;
+ unsigned semicolon_token = ast->semicolon_token;
+ if (_scope && (_scope->isClass() || _scope->isNamespace())) {
+ const Token &tk = tokenAt(semicolon_token);
+
+ if (! tk.generated())
+ translationUnit()->warning(semicolon_token, "extra `;'");
+ }
return false;
}
@@ -2770,6 +2776,14 @@ bool Bind::visit(EnumSpecifierAST *ast)
for (EnumeratorListAST *it = ast->enumerator_list; it; it = it->next) {
this->enumerator(it->value, e);
}
+
+ if (ast->stray_comma_token /* && ! translationUnit()->cxx0xEnabled()*/) {
+ const Token &tk = tokenAt(ast->stray_comma_token);
+ if (! tk.generated())
+ translationUnit()->warning(ast->stray_comma_token,
+ "commas at the end of enumerator lists are a C++0x-specific feature");
+ }
+
(void) switchScope(previousScope);
return false;
}
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 414b27fbbd..8dd0f9f5d8 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1546,6 +1546,9 @@ bool Parser::parseEnumSpecifier(SpecifierListAST *&node)
enumerator_ptr = &(*enumerator_ptr)->next;
}
+ if (LA() == T_COMMA && LA(2) == T_RBRACE)
+ ast->stray_comma_token = consumeToken();
+
if (LA() != T_RBRACE)
match(T_COMMA, &comma_token);
}