use smarter error recovery for do/while.

llvm-svn: 60933
This commit is contained in:
Chris Lattner 2008-12-12 06:35:28 +00:00
parent c0081db332
commit 10da53c60c
2 changed files with 9 additions and 5 deletions

View File

@ -640,7 +640,8 @@ private:
OwningStmtResult ParseDefaultStatement();
OwningStmtResult ParseCompoundStatement(bool isStmtExpr = false);
OwningStmtResult ParseCompoundStatementBody(bool isStmtExpr = false);
bool ParseParenExprOrCondition(OwningExprResult &CondExp);
bool ParseParenExprOrCondition(OwningExprResult &CondExp,
bool OnlyAllowCondition = false);
OwningStmtResult ParseIfStatement();
OwningStmtResult ParseSwitchStatement();
OwningStmtResult ParseWhileStatement();

View File

@ -416,7 +416,7 @@ Parser::OwningStmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
/// ParseParenExprOrCondition:
/// [C ] '(' expression ')'
/// [C++] '(' condition ')'
/// [C++] '(' condition ')' [not allowed if OnlyAllowCondition=true]
///
/// This function parses and performs error recovery on the specified condition
/// or expression (depending on whether we're in C++ or C mode). This function
@ -425,7 +425,8 @@ Parser::OwningStmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
/// should try to recover harder. It returns false if the condition is
/// successfully parsed. Note that a successful parse can still have semantic
/// errors in the condition.
bool Parser::ParseParenExprOrCondition(OwningExprResult &CondExp) {
bool Parser::ParseParenExprOrCondition(OwningExprResult &CondExp,
bool OnlyAllowCondition) {
SourceLocation LParenLoc = ConsumeParen();
if (getLang().CPlusPlus)
@ -769,8 +770,10 @@ Parser::OwningStmtResult Parser::ParseDoStatement() {
return StmtError();
}
// Parse the condition.
OwningExprResult Cond(ParseSimpleParenExpression());
// Parse the parenthesized condition.
OwningExprResult Cond(Actions);
ParseParenExprOrCondition(Cond, true);
DoScope.Exit();
if (Cond.isInvalid() || Body.isInvalid())