Commit 10e947f6 authored by Lassi Hämäläinen's avatar Lassi Hämäläinen Committed by Nikolai Kosjar

C++: Fix crashes with the pattern "enum class operator A"

Parser parsed the pattern as an enum declaration the name of
which is a conversion operator. Add check to disallow keywords
after enum-key (enum, enum class, enum struct).
Add tests tst_AST::enumDeclaration and
invalidEnumClassDeclaration.

Task-number: QTCREATORBUG-15341
Change-Id: Ia037f00184c1d7e5b0374f39331bb6748f8d90b1
Reviewed-by: default avatarNikolai Kosjar <nikolai.kosjar@theqtcompany.com>
parent c62ad6c4
......@@ -1789,6 +1789,11 @@ bool Parser::parseEnumSpecifier(SpecifierListAST *&node)
if (_languageFeatures.cxx11Enabled && (LA() == T_CLASS || LA() == T_STRUCT))
ast->key_token = consumeToken();
if (tok().isKeyword()) {
error(cursor(), "expected identifier before '%s'", tok().spell());
return false;
}
parseName(ast->name);
if (_languageFeatures.cxx11Enabled && LA() == T_COLON) {
......
......@@ -208,6 +208,8 @@ private slots:
void expensiveExpression();
void invalidCode_data();
void invalidCode();
void enumDeclaration();
void invalidEnumClassDeclaration();
};
void tst_AST::gcc_attributes_1()
......@@ -1982,6 +1984,28 @@ void tst_AST::invalidCode()
QVERIFY(diag.errorCount != 0);
}
void tst_AST::enumDeclaration()
{
QSharedPointer<TranslationUnit> unit(parseStatement(
//Unnamed
"enum { ENUMERATOR0 };\n"
"enum Enum { ENUMERATOR1 };\n"
"enum EnumWithBase : int { ENUMERATOR2 };\n"
"enum enum : int { ENUMERATOR2a };\n"
"enum class EnumClass { ENUMERATOR3 = 10 };\n", true));
QVERIFY(unit->ast());
QCOMPARE(diag.errorCount, 0);
}
void tst_AST::invalidEnumClassDeclaration()
{
QSharedPointer<TranslationUnit> unit(parseStatement(
"enum class operator A { };", true));
QVERIFY(diag.errorCount != 0);
}
void tst_AST::initTestCase()
{
control.setDiagnosticClient(&diag);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment