diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index 5ae4dc994c565e58bf7b65197e220eb1d5a99f64..453fe88bd0132b9fb86058e3d1879c8505fd6eb8 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -193,11 +193,13 @@ public:
 
     QStringList qmakeFeaturePaths();
 
-    enum { ConditionTrue, ConditionFalse, ConditionElse };
-    int m_condition;
-    int m_prevCondition;
-    bool m_updateCondition;
-    bool m_invertNext;
+    enum Condition { ConditionFalse, ConditionTrue, ConditionElse };
+    struct State {
+        Condition condition;
+        Condition prevCondition;
+        bool updateCondition; // == !(enclosingBlock()->kind() & ScopeContents)
+    } m_sts;
+    bool m_invertNext; // Short-lived, so not in State
     int m_skipLevel;
     bool m_cumulative;
     bool m_isFirstVariableValue;
@@ -224,6 +226,8 @@ public:
     bool m_parsePreAndPostFiles;
 };
 
+Q_DECLARE_TYPEINFO(ProFileEvaluator::Private::State, Q_PRIMITIVE_TYPE);
+
 ProFileEvaluator::Private::Private(ProFileEvaluator *q_)
   : q(q_)
 {
@@ -236,8 +240,8 @@ ProFileEvaluator::Private::Private(ProFileEvaluator *q_)
     m_cumulative = true;
 
     // Evaluator state
-    m_updateCondition = false;
-    m_condition = ConditionFalse;
+    m_sts.updateCondition = false;
+    m_sts.condition = ConditionFalse;
     m_invertNext = false;
     m_skipLevel = 0;
     m_isFirstVariableValue = true;
@@ -556,16 +560,16 @@ void ProFileEvaluator::Private::updateItem()
 bool ProFileEvaluator::Private::visitBeginProBlock(ProBlock *block)
 {
     if (block->blockKind() == ProBlock::ScopeKind) {
-        m_updateCondition = true;
+        m_sts.updateCondition = true;
         if (!m_skipLevel) {
-            m_prevCondition = m_condition;
-            m_condition = ConditionFalse;
+            m_sts.prevCondition = m_sts.condition;
+            m_sts.condition = ConditionFalse;
         } else {
-            Q_ASSERT(m_condition != ConditionTrue);
+            Q_ASSERT(m_sts.condition != ConditionTrue);
         }
     } else if (block->blockKind() & ProBlock::ScopeContentsKind) {
-        m_updateCondition = false;
-        if (m_condition != ConditionTrue)
+        m_sts.updateCondition = false;
+        if (m_sts.condition != ConditionTrue)
             ++m_skipLevel;
         else
             Q_ASSERT(!m_skipLevel);
@@ -577,12 +581,12 @@ bool ProFileEvaluator::Private::visitEndProBlock(ProBlock *block)
 {
     if (block->blockKind() & ProBlock::ScopeContentsKind) {
         if (m_skipLevel) {
-            Q_ASSERT(m_condition != ConditionTrue);
+            Q_ASSERT(m_sts.condition != ConditionTrue);
             --m_skipLevel;
         } else {
             // Conditionals contained inside this block may have changed the state.
             // So we reset it here to make an else following us do the right thing.
-            m_condition = ConditionTrue;
+            m_sts.condition = ConditionTrue;
         }
     }
     return true;
@@ -619,13 +623,13 @@ bool ProFileEvaluator::Private::visitProCondition(ProCondition *cond)
         if (cond->text().toLower() == QLatin1String("else")) {
             // The state ConditionElse makes sure that subsequential elses are ignored.
             // That's braindead, but qmake is like that.
-            if (m_prevCondition == ConditionTrue)
-                m_condition = ConditionElse;
-            else if (m_prevCondition == ConditionFalse)
-                m_condition = ConditionTrue;
-        } else if (m_condition == ConditionFalse) {
+            if (m_sts.prevCondition == ConditionTrue)
+                m_sts.condition = ConditionElse;
+            else if (m_sts.prevCondition == ConditionFalse)
+                m_sts.condition = ConditionTrue;
+        } else if (m_sts.condition == ConditionFalse) {
             if (isActiveConfig(cond->text(), true) ^ m_invertNext)
-                m_condition = ConditionTrue;
+                m_sts.condition = ConditionTrue;
         }
     }
     m_invertNext = false;
@@ -865,7 +869,7 @@ bool ProFileEvaluator::Private::visitProValue(ProValue *value)
 
 bool ProFileEvaluator::Private::visitProFunction(ProFunction *func)
 {
-    if (!m_updateCondition || m_condition == ConditionFalse) {
+    if (!m_sts.updateCondition || m_sts.condition == ConditionFalse) {
         QString text = func->text();
         int lparen = text.indexOf(QLatin1Char('('));
         int rparen = text.lastIndexOf(QLatin1Char(')'));
@@ -875,7 +879,7 @@ bool ProFileEvaluator::Private::visitProFunction(ProFunction *func)
         m_lineNo = func->lineNumber();
         bool result = evaluateConditionalFunction(funcName.trimmed(), arguments);
         if (!m_skipLevel && (result ^ m_invertNext))
-            m_condition = ConditionTrue;
+            m_sts.condition = ConditionTrue;
     }
     m_invertNext = false;
     return true;
diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h
index d7eb5a549a8ba6f122581c7fc0b7a5c8c0dbe51c..de4b07f41d0fac509b9d2f4244e1db5e357c97b1 100644
--- a/src/shared/proparser/profileevaluator.h
+++ b/src/shared/proparser/profileevaluator.h
@@ -87,6 +87,8 @@ public:
 private:
     class Private;
     Private *d;
+
+    template<typename T> friend class QTypeInfo;
 };
 
 QT_END_NAMESPACE