compiler: Create dummy labels for blank labels.

Fixes golang/go#11591.
    
    Reviewed-on: https://go-review.googlesource.com/12043

From-SVN: r226009
This commit is contained in:
Ian Lance Taylor 2015-07-20 17:25:24 +00:00
parent 57c7a33b97
commit 53c1201606
3 changed files with 26 additions and 6 deletions

View File

@ -1,4 +1,4 @@
19ff97ed3eb07d902bc4b3f97b21c4b6df834ad2 5c49a77455f52ba2c7eddb5b831456dc1c67b02f
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

@ -1937,10 +1937,6 @@ Label*
Gogo::add_label_definition(const std::string& label_name, Gogo::add_label_definition(const std::string& label_name,
Location location) Location location)
{ {
// A label with a blank identifier is never declared or defined.
if (label_name == "_")
return NULL;
go_assert(!this->functions_.empty()); go_assert(!this->functions_.empty());
Function* func = this->functions_.back().function->func_value(); Function* func = this->functions_.back().function->func_value();
Label* label = func->add_label_definition(this, label_name, location); Label* label = func->add_label_definition(this, label_name, location);
@ -4724,7 +4720,13 @@ Function::add_label_definition(Gogo* gogo, const std::string& label_name,
std::pair<Labels::iterator, bool> ins = std::pair<Labels::iterator, bool> ins =
this->labels_.insert(std::make_pair(label_name, lnull)); this->labels_.insert(std::make_pair(label_name, lnull));
Label* label; Label* label;
if (ins.second) if (label_name == "_")
{
label = Label::create_dummy_label();
if (ins.second)
ins.first->second = label;
}
else if (ins.second)
{ {
// This is a new label. // This is a new label.
label = new Label(label_name); label = new Label(label_name);
@ -7625,6 +7627,20 @@ Label::get_addr(Translate_context* context, Location location)
return context->backend()->label_address(label, location); return context->backend()->label_address(label, location);
} }
// Return the dummy label that represents any instance of the blank label.
Label*
Label::create_dummy_label()
{
static Label* dummy_label;
if (dummy_label == NULL)
{
dummy_label = new Label("_");
dummy_label->set_is_used();
}
return dummy_label;
}
// Class Unnamed_label. // Class Unnamed_label.
// Get the backend representation for an unnamed label. // Get the backend representation for an unnamed label.

View File

@ -2688,6 +2688,10 @@ class Label
Bexpression* Bexpression*
get_addr(Translate_context*, Location location); get_addr(Translate_context*, Location location);
// Return a dummy label, representing any instance of the blank label.
static Label*
create_dummy_label();
private: private:
// The name of the label. // The name of the label.
std::string name_; std::string name_;