From 17e0886c69a3d2c317f8e146d9a7b02f3cfc0498 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Fri, 24 Sep 2010 15:58:23 +0200
Subject: [PATCH] C++ indenter: Fix error recovery in function definitions.

Task-number: QTCREATORBUG-1517
---
 src/plugins/cpptools/cppcodeformatter.cpp          |  4 ++--
 .../cplusplus/codeformatter/tst_codeformatter.cpp  | 14 ++++++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp
index a81a57f339a..744465f3980 100644
--- a/src/plugins/cpptools/cppcodeformatter.cpp
+++ b/src/plugins/cpptools/cppcodeformatter.cpp
@@ -160,7 +160,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
             if (tryExpression(true))
                 break;
             switch (kind) {
-            case T_RBRACE:
+            case T_RBRACE:      leave(true); continue;
             case T_SEMICOLON:   leave(true); break;
             case T_EQUAL:       enter(initializer); break;
             case T_LBRACE:      enter(defun_open); break;
@@ -251,7 +251,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
             if (tryStatement())
                 break;
             switch (kind) {
-            case T_RBRACE:      leave(); continue; // always nested in declaration_start
+            case T_RBRACE:      leave(); leave(); break; // always nested in declaration_start
             } break;
 
         case switch_statement:
diff --git a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
index bebe2383c29..155a28810a4 100644
--- a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
+++ b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
@@ -49,6 +49,7 @@ private Q_SLOTS:
     void nestedInitializer();
     void forStatement();
     void templateSingleline();
+    void macrosNoSemicolon2();
 };
 
 struct Line {
@@ -952,6 +953,19 @@ void tst_CodeFormatter::templateSingleline()
     checkIndent(data);
 }
 
+void tst_CodeFormatter::macrosNoSemicolon2()
+{
+    QList<Line> data;
+    data
+         << Line("FOO(ABC)")
+         << Line("{")
+         << Line("    BAR(FOO)")
+         << Line("}")
+         << Line("int i;")
+         ;
+    checkIndent(data);
+}
+
 QTEST_APPLESS_MAIN(tst_CodeFormatter)
 #include "tst_codeformatter.moc"
 
-- 
GitLab