improve parse error recovery paths

to reduce collateral damage from parse errors.

Change-Id: Ic59700d657069d3b15372509b4bff966057d27a9
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
This commit is contained in:
Oswald Buddenhagen
2012-09-11 18:43:29 +02:00
parent d3c0557444
commit 00c0d0d5e4

View File

@@ -979,13 +979,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;
@@ -1028,12 +1029,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) {
@@ -1053,6 +1055,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)) {