From 26343eaf9d25412f6deba7eae9117fc5e9bc02cc Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 27 Aug 2015 22:41:55 +0000 Subject: [PATCH] compiler: Allow multiple blank label definitions. Fixes golang/go#12316. Reviewed-on: https://go-review.googlesource.com/13907 From-SVN: r227284 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/gogo.h | 7 +++++++ gcc/go/gofrontend/statements.cc | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 4561966046c..dc519b28402 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -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. diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h index 374f155e05d..3af2af745fb 100644 --- a/gcc/go/gofrontend/gogo.h +++ b/gcc/go/gofrontend/gogo.h @@ -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_; diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc index 72b41cb09a3..5d102bf2e17 100644 --- a/gcc/go/gofrontend/statements.cc +++ b/gcc/go/gofrontend/statements.cc @@ -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); }