From f6a3ab0f167f23d0669eae77280c7ff660e7ad98 Mon Sep 17 00:00:00 2001 From: John McCall Date: Sat, 22 Jan 2011 09:28:32 +0000 Subject: [PATCH] Improve our parse recovery on 'case blah;' and 'default;'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124025 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseStmt.cpp | 24 ++++++++++++++++++------ test/Parser/switch-recovery.cpp | 14 ++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index 3a6f80da2d..5f932919b9 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -311,13 +311,19 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs) { ColonProtection.restore(); SourceLocation ColonLoc; - if (Tok.isNot(tok::colon)) { + if (Tok.is(tok::colon)) { + ColonLoc = ConsumeToken(); + + // Treat "case blah;" as a typo for "case blah:". + } else if (Tok.is(tok::semi)) { + ColonLoc = ConsumeToken(); + Diag(ColonLoc, diag::err_expected_colon_after) << "'case'" + << FixItHint::CreateReplacement(ColonLoc, ":"); + } else { SourceLocation ExpectedLoc = PP.getLocForEndOfToken(PrevTokLocation); Diag(ExpectedLoc, diag::err_expected_colon_after) << "'case'" << FixItHint::CreateInsertion(ExpectedLoc, ":"); ColonLoc = ExpectedLoc; - } else { - ColonLoc = ConsumeToken(); } StmtResult Case = @@ -382,13 +388,19 @@ StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) { SourceLocation DefaultLoc = ConsumeToken(); // eat the 'default'. SourceLocation ColonLoc; - if (Tok.isNot(tok::colon)) { + if (Tok.is(tok::colon)) { + ColonLoc = ConsumeToken(); + + // Treat "default;" as a typo for "default:". + } else if (Tok.is(tok::semi)) { + ColonLoc = ConsumeToken(); + Diag(ColonLoc, diag::err_expected_colon_after) << "'default'" + << FixItHint::CreateReplacement(ColonLoc, ":"); + } else { SourceLocation ExpectedLoc = PP.getLocForEndOfToken(PrevTokLocation); Diag(ExpectedLoc, diag::err_expected_colon_after) << "'default'" << FixItHint::CreateInsertion(ExpectedLoc, ":"); ColonLoc = ExpectedLoc; - } else { - ColonLoc = ConsumeToken(); } // Diagnose the common error "switch (X) {... default: }", which is not valid. diff --git a/test/Parser/switch-recovery.cpp b/test/Parser/switch-recovery.cpp index 7b6323a405..f11babc5b6 100644 --- a/test/Parser/switch-recovery.cpp +++ b/test/Parser/switch-recovery.cpp @@ -17,4 +17,18 @@ struct B { return; } } + + void test2() { + enum X { Xa, Xb } x; + + switch (x) { // expected-warning {{enumeration value 'Xb' not handled in switch}} + case Xa; // expected-error {{expected ':' after 'case'}} + break; + } + + switch (x) { + default; // expected-error {{expected ':' after 'default'}} + break; + } + } }; -- 2.40.0