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());
|
Stmts.push_back(R.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SourceLocation CloseLoc = Tok.getLocation();
|
||||||
|
|
||||||
// We broke out of the while loop because we found a '}' or EOF.
|
// We broke out of the while loop because we found a '}' or EOF.
|
||||||
if (Tok.isNot(tok::r_brace)) {
|
if (Tok.isNot(tok::r_brace)) {
|
||||||
Diag(Tok, diag::err_expected_rbrace);
|
Diag(Tok, diag::err_expected_rbrace);
|
||||||
Diag(T.getOpenLocation(), diag::note_matching) << "{";
|
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 Actions.ActOnCompoundStmt(T.getOpenLocation(), CloseLoc,
|
||||||
return StmtError();
|
|
||||||
|
|
||||||
return Actions.ActOnCompoundStmt(T.getOpenLocation(), T.getCloseLocation(),
|
|
||||||
move_arg(Stmts), isStmtExpr);
|
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