Don't crash on missing '{' after __except or __finally, PR22687.

Also add some general test/Parser coverage for SEH blocks.

llvm-svn: 230449
This commit is contained in:
Nico Weber 2015-02-25 02:22:06 +00:00
parent 64b04b9bdf
commit fc3fe4f0a1
2 changed files with 32 additions and 2 deletions

View File

@ -421,7 +421,7 @@ StmtResult Parser::ParseSEHTryBlock() {
assert(Tok.is(tok::kw___try) && "Expected '__try'");
SourceLocation TryLoc = ConsumeToken();
if(Tok.isNot(tok::l_brace))
if (Tok.isNot(tok::l_brace))
return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
StmtResult TryBlock(ParseCompoundStatement(/*isStmtExpr=*/false,
@ -438,7 +438,7 @@ StmtResult Parser::ParseSEHTryBlock() {
SourceLocation Loc = ConsumeToken();
Handler = ParseSEHFinallyBlock(Loc);
} else {
return StmtError(Diag(Tok,diag::err_seh_expected_handler));
return StmtError(Diag(Tok, diag::err_seh_expected_handler));
}
if(Handler.isInvalid())
@ -491,6 +491,9 @@ StmtResult Parser::ParseSEHExceptBlock(SourceLocation ExceptLoc) {
if (ExpectAndConsume(tok::r_paren))
return StmtError();
if (Tok.isNot(tok::l_brace))
return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
StmtResult Block(ParseCompoundStatement());
if(Block.isInvalid())
@ -509,6 +512,9 @@ StmtResult Parser::ParseSEHFinallyBlock(SourceLocation FinallyBlock) {
raii2(Ident___abnormal_termination, false),
raii3(Ident_AbnormalTermination, false);
if (Tok.isNot(tok::l_brace))
return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
StmtResult Block(ParseCompoundStatement());
if(Block.isInvalid())
return Block;

View File

@ -0,0 +1,24 @@
// RUN: %clang_cc1 %s -fsyntax-only -Wmicrosoft -verify -fms-extensions
void f() {
int a;
__try a; // expected-error {{expected '{'}} expected-warning {{expression result unused}}
__try {
}
} // expected-error {{expected '__except' or '__finally' block}}
void g() {
int a;
__try {
} __except(1) a; // expected-error {{expected '{'}} expected-warning {{expression result unused}}
}
void h() {
int a;
__try {
} __finally a; // expected-error {{expected '{'}} expected-warning {{expression result unused}}
}