From 88fe5a50a11908c2c1cc99308fd6f8846b3b7644 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Thu, 16 Dec 2010 12:25:51 +0100 Subject: Added semantic checks for stray semicolons and topldevel empty declarations. --- src/shared/cplusplus/AST.cpp | 4 ++++ src/shared/cplusplus/AST.h | 2 ++ src/shared/cplusplus/ASTClone.cpp | 1 + src/shared/cplusplus/ASTMatcher.cpp | 2 ++ src/shared/cplusplus/Bind.cpp | 16 +++++++++++++++- src/shared/cplusplus/Parser.cpp | 3 +++ 6 files changed, 27 insertions(+), 1 deletion(-) (limited to 'src/shared/cplusplus') 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); } -- cgit v1.2.1