From f0e0cd9baf295f6fe8d7575762aedea7d4ee035e Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Tue, 11 Sep 2012 18:43:29 +0200
Subject: [PATCH] improve parse error recovery paths

to reduce collateral damage from parse errors.

(cherry picked from qtcreator/00c0d0d5e42d28e03c2846c17d3acbcd8420859d)
Change-Id: Ic59700d657069d3b15372509b4bff966057d27a9
Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
(cherry picked from qtbase/ae3f95a951334dee001e37c305e4d7bf91c0d1b3)
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
---
 src/linguist/shared/qmakeparser.cpp | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/linguist/shared/qmakeparser.cpp b/src/linguist/shared/qmakeparser.cpp
index 2205026b2..ef0f19367 100644
--- a/src/linguist/shared/qmakeparser.cpp
+++ b/src/linguist/shared/qmakeparser.cpp
@@ -1017,13 +1017,14 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
             const QString *defName;
             ushort defType;
             if (m_tmp == statics.strfor) {
-                flushCond(tokPtr);
-                putLineMarker(tokPtr);
                 if (m_invert || m_operator == OrOperator) {
                     // '|' could actually work reasonably, but qmake does nonsense here.
                     parseError(fL1S("Unexpected operator in front of for()."));
+                    bogusTest(tokPtr);
                     return;
                 }
+                flushCond(tokPtr);
+                putLineMarker(tokPtr);
                 if (*uce == (TokLiteral|TokNewStr)) {
                     nlen = uce[1];
                     uc = uce + 2 + nlen;
@@ -1066,12 +1067,13 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
                 defName = &statics.strdefineTest;
                 defType = TokTestDef;
               deffunc:
-                flushScopes(tokPtr);
-                putLineMarker(tokPtr);
                 if (m_invert) {
                     parseError(fL1S("Unexpected operator in front of function definition."));
+                    bogusTest(tokPtr);
                     return;
                 }
+                flushScopes(tokPtr);
+                putLineMarker(tokPtr);
                 if (*uce == (TokLiteral|TokNewStr)) {
                     uint nlen = uce[1];
                     if (uce[nlen + 2] == TokFuncTerminator) {
@@ -1091,6 +1093,7 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
                 if (m_state != StNew || m_blockstack.top().braceLevel || m_blockstack.size() > 1
                         || m_invert || m_operator != NoOperator) {
                     parseError(fL1S("option() must appear outside any control structures."));
+                    bogusTest(tokPtr);
                     return;
                 }
                 if (*uce == (TokLiteral|TokNewStr)) {
-- 
GitLab