This patch to the Go frontend permits empty statements after a fallthrough statement, as the language spec specifies. This also gives a better error message when a fallthrough statement is in the wrong place. The test case for this is in the master repository, test/fixedbugs/issue14540.go, just not yet in the gccgo repository. This fixes https://golang.org/issue/14538. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 257377) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -5031f878a761bf83f5f96710d62f83e2dc5ecf04 +d9f33a479f8012f7495d197e4b7417cba4d477fa The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/parse.cc =================================================================== --- gcc/go/gofrontend/parse.cc (revision 257377) +++ gcc/go/gofrontend/parse.cc (working copy) @@ -4667,11 +4667,26 @@ Parse::expr_case_clause(Case_clauses* cl { Location fallthrough_loc = this->location(); is_fallthrough = true; - if (this->advance_token()->is_op(OPERATOR_SEMICOLON)) - this->advance_token(); + while (this->advance_token()->is_op(OPERATOR_SEMICOLON)) + ; if (this->peek_token()->is_op(OPERATOR_RCURLY)) go_error_at(fallthrough_loc, _("cannot fallthrough final case in switch")); + else if (!this->peek_token()->is_keyword(KEYWORD_CASE) + && !this->peek_token()->is_keyword(KEYWORD_DEFAULT)) + { + go_error_at(fallthrough_loc, "fallthrough statement out of place"); + while (!this->peek_token()->is_keyword(KEYWORD_CASE) + && !this->peek_token()->is_keyword(KEYWORD_DEFAULT) + && !this->peek_token()->is_op(OPERATOR_RCURLY) + && !this->peek_token()->is_eof()) + { + if (this->statement_may_start_here()) + this->statement_list(); + else + this->advance_token(); + } + } } if (is_default)