This patch by Chris Manghane fixes the Go frontend to permit multiple
blank label definitions. This fixes https://golang.org/issue/12316 .
Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE (revision 227276)
+++ gcc/go/gofrontend/MERGE (working copy)
@@ -1,4 +1,4 @@
-a1d2cac484f46068b5a6ddf3e041d425a3d25e0c
+9ae5835a010a55fba875103be5f4e61485a97099
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
Index: gcc/go/gofrontend/gogo.h
===================================================================
--- gcc/go/gofrontend/gogo.h (revision 227276)
+++ gcc/go/gofrontend/gogo.h (working copy)
@@ -2689,6 +2689,8 @@ class Label
void
define(Location location, Bindings_snapshot* snapshot)
{
+ if (this->is_dummy_label())
+ return;
go_assert(Linemap::is_unknown_location(this->location_)
&& this->snapshot_ == NULL);
this->location_ = location;
@@ -2709,6 +2711,11 @@ class Label
static Label*
create_dummy_label();
+ // Return TRUE if this is a dummy label.
+ bool
+ is_dummy_label() const
+ { return this->name_ == "_"; }
+
private:
// The name of the label.
std::string name_;
Index: gcc/go/gofrontend/statements.cc
===================================================================
--- gcc/go/gofrontend/statements.cc (revision 226846)
+++ gcc/go/gofrontend/statements.cc (working copy)
@@ -3080,6 +3080,11 @@ Label_statement::do_traverse(Traverse*)
Bstatement*
Label_statement::do_get_backend(Translate_context* context)
{
+ if (this->label_->is_dummy_label())
+ {
+ Bexpression* bce =
context->backend()->boolean_constant_expression(false);
+ return context->backend()->expression_statement(bce);
+ }
Blabel* blabel = this->label_->get_backend_label(context);
return context->backend()->label_definition_statement(blabel);
}