forked from OSchip/llvm-project
[parser] If there are unmatched braces in a function definition, try to
recover by returning the statements that we parsed so far, instead of dropping the whole function body. rdar://10967343 llvm-svn: 153367
This commit is contained in:
parent
4b9ab74690
commit
6db850133f
|
@ -823,17 +823,20 @@ StmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
|
|||
Stmts.push_back(R.release());
|
||||
}
|
||||
|
||||
SourceLocation CloseLoc = Tok.getLocation();
|
||||
|
||||
// We broke out of the while loop because we found a '}' or EOF.
|
||||
if (Tok.isNot(tok::r_brace)) {
|
||||
Diag(Tok, diag::err_expected_rbrace);
|
||||
Diag(T.getOpenLocation(), diag::note_matching) << "{";
|
||||
return StmtError();
|
||||
// Recover by creating a compound statement with what we parsed so far,
|
||||
// instead of dropping everything and returning StmtError();
|
||||
} else {
|
||||
if (!T.consumeClose())
|
||||
CloseLoc = T.getCloseLocation();
|
||||
}
|
||||
|
||||
if (T.consumeClose())
|
||||
return StmtError();
|
||||
|
||||
return Actions.ActOnCompoundStmt(T.getOpenLocation(), T.getCloseLocation(),
|
||||
return Actions.ActOnCompoundStmt(T.getOpenLocation(), CloseLoc,
|
||||
move_arg(Stmts), isStmtExpr);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
void foo() {
|
||||
int x;
|
||||
if (x) {
|
||||
}
|
||||
|
||||
// RUN: c-index-test -cursor-at=%s:2:7 %s > %t
|
||||
// RUN: FileCheck %s -input-file %t
|
||||
|
||||
// CHECK: VarDecl=x:2:7
|
|
@ -0,0 +1,11 @@
|
|||
@implementation I
|
||||
-(void)meth {
|
||||
int x;
|
||||
if (x) {
|
||||
}
|
||||
@end
|
||||
|
||||
// RUN: c-index-test -cursor-at=%s:3:7 %s > %t
|
||||
// RUN: FileCheck %s -input-file %t
|
||||
|
||||
// CHECK: VarDecl=x:3:7
|
Loading…
Reference in New Issue