diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 83b0d4191c8a7242ea04e4aa0523ce5196de0f2e..c9295c94248f0c7571b38787c88e4057d0a6395f 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -748,34 +748,11 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour
 
                 else {
                     if (! m->isFunctionLike()) {
-                        QByteArray tmp;
-                        expandObjectLikeMacro(identifierToken, spell, m, &tmp);
-
-                        if (_dot->isNot(T_LPAREN)) {
-                            _result->append(tmp);
+                        if (0 == (m = processObjectLikeMacro(identifierToken, spell, m)))
                             continue;
 
-                        } else {
-                            m = 0; // reset the active the macro
-
-                            pushState(createStateFromSource(tmp));
-
-                            if (_dot->is(T_IDENTIFIER)) {
-                                const QByteArray id = tokenSpell(*_dot);
-
-                                if (Macro *macro = env->resolve(id)) {
-                                    if (macro->isFunctionLike())
-                                        m = macro;
-                                }
-                            }
-
-                            popState();
-
-                            if (! m) {
-                                _result->append(tmp);
-                                continue;
-                            }
-                        }
+                        // the macro expansion generated something that looks like
+                        // a function-like macro.
                     }
 
                     // `m' is function-like macro.
@@ -817,6 +794,39 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour
     _result = previousResult;
 }
 
+Macro *Preprocessor::processObjectLikeMacro(TokenIterator identifierToken,
+                                            const QByteArray &spell,
+                                            Macro *m)
+{
+    QByteArray tmp;
+    expandObjectLikeMacro(identifierToken, spell, m, &tmp);
+
+    if (_dot->is(T_LPAREN)) {
+        // check if the expension generated a function-like macro.
+
+        m = 0; // reset the active the macro
+
+        pushState(createStateFromSource(tmp));
+
+        if (_dot->is(T_IDENTIFIER)) {
+            const QByteArray id = tokenSpell(*_dot);
+
+            if (Macro *macro = env->resolve(id)) {
+                if (macro->isFunctionLike())
+                    m = macro;
+            }
+        }
+
+        popState();
+
+        if (m != 0)
+            return m;
+    }
+
+    _result->append(tmp);
+    return 0;
+}
+
 void Preprocessor::expandObjectLikeMacro(TokenIterator identifierToken,
                                          const QByteArray &spell,
                                          Macro *m,
diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h
index 9fc2d49a27679630128601501f8af277df2c6597..c66517e2495b64bfec659bfdfd26559eda566ea3 100644
--- a/src/libs/cplusplus/pp-engine.h
+++ b/src/libs/cplusplus/pp-engine.h
@@ -128,9 +128,14 @@ private:
     QByteArray tokenText(const CPlusPlus::Token &token) const; // does a deep copy
 
     void processNewline();
+
     void processSkippingBlocks(bool skippingBlocks,
                                TokenIterator dot, TokenIterator lastToken);
 
+    Macro *processObjectLikeMacro(TokenIterator identifierToken,
+                                  const QByteArray &spell,
+                                  Macro *m);
+
     void processDirective(TokenIterator dot, TokenIterator lastToken);
     void processInclude(bool skipCurrentPath,
                         TokenIterator dot, TokenIterator lastToken,