diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp
index 89915daef5e631ac03a9287ee674b4413e1eebf1..1c84bae4b822ef8463609a15a9e9cb8240dcc55e 100644
--- a/src/plugins/cpptools/cppcodeformatter.cpp
+++ b/src/plugins/cpptools/cppcodeformatter.cpp
@@ -72,16 +72,8 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
 
         switch (m_currentState.top().type) {
         case topmost_intro:
-            if (tryDeclaration())
-                break;
-            switch (kind) {
-            case T_NAMESPACE:   enter(namespace_start); break;
-            case T_STRUCT:
-            case T_UNION:
-            case T_CLASS:       enter(class_start); break;
-            case T_ENUM:        enter(enum_start); break;
-            case T_USING:       enter(using_start); break;
-            } break;
+            tryDeclaration();
+            break;
 
         case namespace_start:
             switch (kind) {
@@ -93,13 +85,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
             if (tryDeclaration())
                 break;
             switch (kind) {
-            case T_NAMESPACE:   enter(namespace_start); break;
             case T_RBRACE:      leave(); continue; // always nested in namespace_start
-            case T_STRUCT:
-            case T_UNION:
-            case T_CLASS:       enter(class_start); break;
-            case T_ENUM:        enter(enum_start); break;
-            case T_USING:       enter(using_start); break;
             } break;
 
         case class_start:
@@ -113,11 +99,6 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
                 break;
             switch (kind) {
             case T_RBRACE:      leave(); continue; // always nested in class_start
-            case T_STRUCT:
-            case T_UNION:
-            case T_CLASS:       enter(class_start); break;
-            case T_ENUM:        enter(enum_start); break;
-            case T_USING:       enter(using_start); break;
             } break;
 
         case enum_start:
@@ -704,6 +685,24 @@ bool CodeFormatter::tryDeclaration()
         enter(template_start);
         return true;
 
+    case T_NAMESPACE:
+        enter(namespace_start);
+        return true;
+
+    case T_STRUCT:
+    case T_UNION:
+    case T_CLASS:
+        enter(class_start);
+        return true;
+
+    case T_ENUM:
+        enter(enum_start);
+        return true;
+
+    case T_USING:
+        enter(using_start);
+        return true;
+
     default:
         return false;
     }
diff --git a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
index e8be0dcfb85d1b1ebd0dd1edf9f20d9caa17a19d..2cc5ee9737b48369bc991c12173416a48105a223 100644
--- a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
+++ b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
@@ -42,6 +42,7 @@ private Q_SLOTS:
     void operatorOverloads();
     void gnuStyle();
     void whitesmithsStyle();
+    void singleLineEnum();
 };
 
 struct Line {
@@ -755,6 +756,19 @@ void tst_CodeFormatter::whitesmithsStyle()
     checkIndent(data, 2);
 }
 
+void tst_CodeFormatter::singleLineEnum()
+{
+    enum { a, b};
+    QList<Line> data;
+    data << Line("enum { foo, bar, car = 2 };")
+         << Line("void blah() {")
+         << Line("    enum { foo, bar, car = 2 };")
+         << Line("    int i;")
+         << Line("}")
+         ;
+    checkIndent(data);
+}
+
 QTEST_APPLESS_MAIN(tst_CodeFormatter)
 #include "tst_codeformatter.moc"