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;