forked from qt-creator/qt-creator
preprocessor: do not loop endlessly on incomplete expressions
An missing closing parantheses after "defined(..." caused an endless loop. Change-Id: I19b17cebc1a56880216c3bfb67c9d296f80cc064 Reviewed-by: Leandro Melo <leandro.melo@nokia.com>
This commit is contained in:
@@ -654,12 +654,12 @@ void Preprocessor::handleDefined(PPToken *tk)
|
|||||||
break;
|
break;
|
||||||
} while (isValidToken(*tk));
|
} while (isValidToken(*tk));
|
||||||
|
|
||||||
if (lparenSeen) {
|
|
||||||
while (tk->isNot(T_RPAREN))
|
if (lparenSeen && tk->is(T_RPAREN))
|
||||||
lex(tk);
|
lex(tk);
|
||||||
} else {
|
|
||||||
pushToken(tk);
|
pushToken(tk);
|
||||||
}
|
|
||||||
QByteArray result(1, '0');
|
QByteArray result(1, '0');
|
||||||
if (m_env->resolve(idToken.asByteArrayRef()))
|
if (m_env->resolve(idToken.asByteArrayRef()))
|
||||||
result[0] = '1';
|
result[0] = '1';
|
||||||
|
@@ -886,6 +886,26 @@ void tst_Preprocessor::defined_data()
|
|||||||
"#if X <= 0x040000\n"
|
"#if X <= 0x040000\n"
|
||||||
"#define Y 1\n"
|
"#define Y 1\n"
|
||||||
"#endif\n";
|
"#endif\n";
|
||||||
|
|
||||||
|
QTest::newRow("incomplete defined 1") << true << true <<
|
||||||
|
"#define X 0x040500\n"
|
||||||
|
"#if defined(X\n"
|
||||||
|
"#define Y 1\n"
|
||||||
|
"#endif\n";
|
||||||
|
QTest::newRow("incomplete defined 2") << false << false <<
|
||||||
|
"#if defined(X\n"
|
||||||
|
"#define Y 1\n"
|
||||||
|
"#endif\n";
|
||||||
|
QTest::newRow("complete defined 1") << true << true <<
|
||||||
|
"#define X 0x040500\n"
|
||||||
|
"#if defined(X )\n"
|
||||||
|
"#define Y 1\n"
|
||||||
|
"#endif\n";
|
||||||
|
QTest::newRow("complete defined 2") << true << true <<
|
||||||
|
"#define X 0x040500\n"
|
||||||
|
"#if defined(X/*xxx*/)\n"
|
||||||
|
"#define Y 1\n"
|
||||||
|
"#endif\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
QTEST_APPLESS_MAIN(tst_Preprocessor)
|
QTEST_APPLESS_MAIN(tst_Preprocessor)
|
||||||
|
Reference in New Issue
Block a user