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)

Reply via email to