Improve the diagnostics generated for switch statements missing expressions

- Move the diagnostic to the case statement instead of at the end of the switch
- Add a fix-it hint as to how to fix the compilation error

llvm-svn: 132903
This commit is contained in:
David Majnemer 2011-06-13 05:50:12 +00:00
parent ff455bbc3c
commit 0ac67fa22f
2 changed files with 21 additions and 4 deletions

View File

@ -502,6 +502,7 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase,
StmtTy *DeepestParsedCaseStmt = 0;
// While we have case statements, eat and stack them.
SourceLocation ColonLoc;
do {
SourceLocation CaseLoc = MissingCase ? Expr.get()->getExprLoc() :
ConsumeToken(); // eat the 'case'.
@ -539,7 +540,6 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase,
ColonProtection.restore();
SourceLocation ColonLoc;
if (Tok.is(tok::colon)) {
ColonLoc = ConsumeToken();
@ -589,8 +589,9 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase,
} else {
// Nicely diagnose the common error "switch (X) { case 4: }", which is
// not valid.
// FIXME: add insertion hint.
Diag(Tok, diag::err_label_end_of_compound_statement);
SourceLocation ExpectedLoc = PP.getLocForEndOfToken(ColonLoc);
Diag(ExpectedLoc, diag::err_label_end_of_compound_statement)
<< FixItHint::CreateInsertion(ExpectedLoc, ";");
SubStmt = true;
}
@ -634,7 +635,9 @@ StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) {
// Diagnose the common error "switch (X) {... default: }", which is not valid.
if (Tok.is(tok::r_brace)) {
Diag(Tok, diag::err_label_end_of_compound_statement);
SourceLocation ExpectedLoc = PP.getLocForEndOfToken(ColonLoc);
Diag(ExpectedLoc, diag::err_label_end_of_compound_statement)
<< FixItHint::CreateInsertion(ExpectedLoc, ";");
return StmtError();
}

View File

@ -156,3 +156,17 @@ void test12(int x) {
}
}
}
void missing_statement_case(int x) {
switch (x) {
case 1:
case 0: // expected-error {{label at end of compound statement: expected statement}}
}
}
void missing_statement_default(int x) {
switch (x) {
case 0:
default: // expected-error {{label at end of compound statement: expected statement}}
}
}