CPlusPlus: Fix crash on weird-looking construct

This was misparsed as a function with an initializer (e.g. "= default"),
and then the empty id caused trouble later on.

Fixes: QTCREATORBUG-29386
Change-Id: I85a35db544e11ad85f50e3a15b1a071b36e79cd0
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Christian Kandeler
2023-08-11 17:48:47 +02:00
parent 8761b7c20c
commit e9b3cd548c
2 changed files with 14 additions and 0 deletions

View File

@@ -3020,6 +3020,11 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node, SpecifierListAST *decl_sp
if (!_languageFeatures.cxx11Enabled || LA(2) == T_NUMERIC_LITERAL) { if (!_languageFeatures.cxx11Enabled || LA(2) == T_NUMERIC_LITERAL) {
parseInitializer(node->initializer, &node->equal_token); parseInitializer(node->initializer, &node->equal_token);
} else { } else {
if (LA(2) != T_NUMERIC_LITERAL && LA(2) != T_DEFAULT && LA(2) != T_DELETE) {
error(cursor(), "expected 'default', 'delete' or '0', got '%s'", tok(2).spell());
return false;
}
node->equal_token = consumeToken(); node->equal_token = consumeToken();
IdExpressionAST *id_expr = new (_pool) IdExpressionAST; IdExpressionAST *id_expr = new (_pool) IdExpressionAST;

View File

@@ -190,6 +190,7 @@ private slots:
void enumDeclaration(); void enumDeclaration();
void invalidEnumClassDeclaration(); void invalidEnumClassDeclaration();
void invalidEnumWithDestructorId(); void invalidEnumWithDestructorId();
void invalidFunctionInitializer();
}; };
void tst_AST::gcc_attributes_1() void tst_AST::gcc_attributes_1()
@@ -2052,6 +2053,14 @@ void tst_AST::invalidEnumWithDestructorId()
QVERIFY(diag.errorCount != 0); QVERIFY(diag.errorCount != 0);
} }
void tst_AST::invalidFunctionInitializer()
{
QSharedPointer<TranslationUnit> unit(parse(
"int main() { a t=b; c d(e)=\"\"; }", TranslationUnit::ParseTranlationUnit, false, false, true));
QVERIFY(diag.errorCount != 0);
}
void tst_AST::initTestCase() void tst_AST::initTestCase()
{ {
control.setDiagnosticClient(&diag); control.setDiagnosticClient(&diag);