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); }