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)