compiler: Allow multiple blank label definitions.

Fixes golang/go#12316.
    
    Reviewed-on: https://go-review.googlesource.com/13907

From-SVN: r227284
This commit is contained in:
Ian Lance Taylor 2015-08-27 22:41:55 +00:00
parent f6a665d39f
commit 26343eaf9d
3 changed files with 13 additions and 1 deletions

View File

@ -1,4 +1,4 @@
a1d2cac484f46068b5a6ddf3e041d425a3d25e0c 9ae5835a010a55fba875103be5f4e61485a97099
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.

View File

@ -2689,6 +2689,8 @@ class Label
void void
define(Location location, Bindings_snapshot* snapshot) define(Location location, Bindings_snapshot* snapshot)
{ {
if (this->is_dummy_label())
return;
go_assert(Linemap::is_unknown_location(this->location_) go_assert(Linemap::is_unknown_location(this->location_)
&& this->snapshot_ == NULL); && this->snapshot_ == NULL);
this->location_ = location; this->location_ = location;
@ -2709,6 +2711,11 @@ class Label
static Label* static Label*
create_dummy_label(); create_dummy_label();
// Return TRUE if this is a dummy label.
bool
is_dummy_label() const
{ return this->name_ == "_"; }
private: private:
// The name of the label. // The name of the label.
std::string name_; std::string name_;

View File

@ -3080,6 +3080,11 @@ Label_statement::do_traverse(Traverse*)
Bstatement* Bstatement*
Label_statement::do_get_backend(Translate_context* context) 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); Blabel* blabel = this->label_->get_backend_label(context);
return context->backend()->label_definition_statement(blabel); return context->backend()->label_definition_statement(blabel);
} }