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>
This commit is contained in:
parent
0d6f1ef588
commit
ae3f95a951
@ -1027,13 +1027,14 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
|
|||||||
const QString *defName;
|
const QString *defName;
|
||||||
ushort defType;
|
ushort defType;
|
||||||
if (m_tmp == statics.strfor) {
|
if (m_tmp == statics.strfor) {
|
||||||
flushCond(tokPtr);
|
|
||||||
putLineMarker(tokPtr);
|
|
||||||
if (m_invert || m_operator == OrOperator) {
|
if (m_invert || m_operator == OrOperator) {
|
||||||
// '|' could actually work reasonably, but qmake does nonsense here.
|
// '|' could actually work reasonably, but qmake does nonsense here.
|
||||||
parseError(fL1S("Unexpected operator in front of for()."));
|
parseError(fL1S("Unexpected operator in front of for()."));
|
||||||
|
bogusTest(tokPtr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
flushCond(tokPtr);
|
||||||
|
putLineMarker(tokPtr);
|
||||||
if (*uce == (TokLiteral|TokNewStr)) {
|
if (*uce == (TokLiteral|TokNewStr)) {
|
||||||
nlen = uce[1];
|
nlen = uce[1];
|
||||||
uc = uce + 2 + nlen;
|
uc = uce + 2 + nlen;
|
||||||
@ -1076,12 +1077,13 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
|
|||||||
defName = &statics.strdefineTest;
|
defName = &statics.strdefineTest;
|
||||||
defType = TokTestDef;
|
defType = TokTestDef;
|
||||||
deffunc:
|
deffunc:
|
||||||
flushScopes(tokPtr);
|
|
||||||
putLineMarker(tokPtr);
|
|
||||||
if (m_invert) {
|
if (m_invert) {
|
||||||
parseError(fL1S("Unexpected operator in front of function definition."));
|
parseError(fL1S("Unexpected operator in front of function definition."));
|
||||||
|
bogusTest(tokPtr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
flushScopes(tokPtr);
|
||||||
|
putLineMarker(tokPtr);
|
||||||
if (*uce == (TokLiteral|TokNewStr)) {
|
if (*uce == (TokLiteral|TokNewStr)) {
|
||||||
uint nlen = uce[1];
|
uint nlen = uce[1];
|
||||||
if (uce[nlen + 2] == TokFuncTerminator) {
|
if (uce[nlen + 2] == TokFuncTerminator) {
|
||||||
@ -1101,6 +1103,7 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
|
|||||||
if (m_state != StNew || m_blockstack.top().braceLevel || m_blockstack.size() > 1
|
if (m_state != StNew || m_blockstack.top().braceLevel || m_blockstack.size() > 1
|
||||||
|| m_invert || m_operator != NoOperator) {
|
|| m_invert || m_operator != NoOperator) {
|
||||||
parseError(fL1S("option() must appear outside any control structures."));
|
parseError(fL1S("option() must appear outside any control structures."));
|
||||||
|
bogusTest(tokPtr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (*uce == (TokLiteral|TokNewStr)) {
|
if (*uce == (TokLiteral|TokNewStr)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user