forked from qt-creator/qt-creator
CPlusPlus: Add missing error check to parseExpressionStatement()
Fixes: QTCREATORBUG-32043 Change-Id: Ic4f1716339d1277d0a2d5a237fd6ae0389ed2485 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
16
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
16
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
@@ -487,15 +487,17 @@ int Parser::find(int token, int stopAt)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Parser::match(int kind, int *token)
|
bool Parser::match(int kind, int *token)
|
||||||
{
|
{
|
||||||
if (LA() == kind)
|
if (LA() == kind) {
|
||||||
*token = consumeToken();
|
*token = consumeToken();
|
||||||
else {
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
*token = 0;
|
*token = 0;
|
||||||
error(_tokenIndex, "expected token `%s' got `%s'",
|
error(_tokenIndex, "expected token `%s' got `%s'",
|
||||||
Token::name(kind), tok().spell());
|
Token::name(kind), tok().spell());
|
||||||
}
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::parseClassOrNamespaceName(NameAST *&node)
|
bool Parser::parseClassOrNamespaceName(NameAST *&node)
|
||||||
@@ -3503,7 +3505,8 @@ bool Parser::parseExpressionStatement(StatementAST *&node)
|
|||||||
DEBUG_THIS_RULE();
|
DEBUG_THIS_RULE();
|
||||||
if (LA() == T_SEMICOLON) {
|
if (LA() == T_SEMICOLON) {
|
||||||
ExpressionStatementAST *ast = new (_pool) ExpressionStatementAST;
|
ExpressionStatementAST *ast = new (_pool) ExpressionStatementAST;
|
||||||
match(T_SEMICOLON, &ast->semicolon_token);
|
if (!match(T_SEMICOLON, &ast->semicolon_token))
|
||||||
|
return false;
|
||||||
node = ast;
|
node = ast;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -3524,10 +3527,11 @@ bool Parser::parseExpressionStatement(StatementAST *&node)
|
|||||||
ExpressionStatementAST *ast = new (previousPool) ExpressionStatementAST;
|
ExpressionStatementAST *ast = new (previousPool) ExpressionStatementAST;
|
||||||
if (expression)
|
if (expression)
|
||||||
ast->expression = expression->clone(previousPool);
|
ast->expression = expression->clone(previousPool);
|
||||||
match(T_SEMICOLON, &ast->semicolon_token);
|
if (match(T_SEMICOLON, &ast->semicolon_token)) {
|
||||||
node = ast;
|
node = ast;
|
||||||
parsed = true;
|
parsed = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_inExpressionStatement = wasInExpressionStatement;
|
_inExpressionStatement = wasInExpressionStatement;
|
||||||
|
|
||||||
|
2
src/libs/3rdparty/cplusplus/Parser.h
vendored
2
src/libs/3rdparty/cplusplus/Parser.h
vendored
@@ -273,7 +273,7 @@ public:
|
|||||||
const Identifier *className(ClassSpecifierAST *ast) const;
|
const Identifier *className(ClassSpecifierAST *ast) const;
|
||||||
const Identifier *identifier(NameAST *name) const;
|
const Identifier *identifier(NameAST *name) const;
|
||||||
|
|
||||||
void match(int kind, int *token);
|
bool match(int kind, int *token);
|
||||||
|
|
||||||
bool maybeAmbiguousStatement(DeclarationStatementAST *ast, StatementAST *&node);
|
bool maybeAmbiguousStatement(DeclarationStatementAST *ast, StatementAST *&node);
|
||||||
bool maybeForwardOrClassDeclaration(SpecifierListAST *decl_specifier_seq) const;
|
bool maybeForwardOrClassDeclaration(SpecifierListAST *decl_specifier_seq) const;
|
||||||
|
Reference in New Issue
Block a user