summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-09-11 18:43:29 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-05-21 14:43:01 +0200
commitf0e0cd9baf295f6fe8d7575762aedea7d4ee035e (patch)
treea331c1737b6e14ed8215d4b49bf687b122347a28
parentb161f54d7511daea89e7d217ee43e08ea90bf3de (diff)
downloadqttools-f0e0cd9baf295f6fe8d7575762aedea7d4ee035e.tar.gz
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>
-rw-r--r--src/linguist/shared/qmakeparser.cpp11
1 files 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)) {