compiler: permit empty statements after fallthrough
The language spec permits empty statements after a fallthrough
statement, so implement that. Also give 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.
Fixes golang/go#14538
Change-Id: I1a8b409bb688e19727d66a8b46e22f8b4cacf746
Reviewed-on: https://go-review.googlesource.com/91855
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/go/parse.cc b/go/parse.cc
index 9700cc3..cc3791b 100644
--- a/go/parse.cc
+++ b/go/parse.cc
@@ -4667,11 +4667,26 @@
{
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)