diff --git a/src/plugins/cppeditor/cppinsertqtpropertymembers.cpp b/src/plugins/cppeditor/cppinsertqtpropertymembers.cpp index 9a43945ff70f0a65b215e22c1a58ebd0cd5c59f7..3995af34d798fdc9a18c82ea7cd8b96d557310a2 100644 --- a/src/plugins/cppeditor/cppinsertqtpropertymembers.cpp +++ b/src/plugins/cppeditor/cppinsertqtpropertymembers.cpp @@ -70,7 +70,7 @@ QList<CppQuickFixOperation::Ptr> InsertQtPropertyMembers::match(const CppQuickFi QString getterName; QString setterName; QString signalName; - int generateFlags; + int generateFlags = 0; for (QtPropertyDeclarationItemListAST *it = qtPropertyDeclaration->property_declaration_item_list; it; it = it->next) { const QString tokenString = file.tokenAt(it->value->item_name_token).spell(); diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 43b5cb455392a3e23ae5abc3cc09bcd8169f222d..bd6b4e18c5b4d3d2b1cad192005941ba6d6f32c7 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 74954b593019d9952d4297a30a1cb34c676c0fa6..53b484d770a46c0795ebf7048d40b7fe0eb1c2ac 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 f9d14bfec484695a4d8a9dd7c36a5f90971f4d9f..15114ea4678f1a11aed0a64a255d1e076268007a 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 6d2bf04b901c01e1570e4da73b13c2c500ab37fd..89f83065f40731188950c5eb9fc36f5453c77ca0 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 ef95d898f9a007cf1d418f65e853abe446cef3e6..7579838bb50241c3c2cb990f72effa4591002f78 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 414b27fbbd4a50e40edf94e8628fb06627ef2fa1..8dd0f9f5d8422865971aabf1ee497bacc46c171e 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); } diff --git a/tests/tools/cplusplus-dump/dumpers.inc b/tests/tools/cplusplus-dump/dumpers.inc index c3d4635ee3f8b1d1ba0452a1b37985fb0584b0d7..adedeb1d813b6afba448ee87b37b1859e8891a70 100644 --- a/tests/tools/cplusplus-dump/dumpers.inc +++ b/tests/tools/cplusplus-dump/dumpers.inc @@ -543,6 +543,8 @@ virtual bool visit(EnumSpecifierAST *ast) terminal(ast->lbrace_token, ast); for (EnumeratorListAST *iter = ast->enumerator_list; iter; iter = iter->next) nonterminal(iter->value); + if (ast->stray_comma_token) + terminal(ast->stray_comma_token, ast); if (ast->rbrace_token) terminal(ast->rbrace_token, ast); return false;