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
merge done from the gofrontend repository.

View File

@ -1937,10 +1937,6 @@ Label*
Gogo::add_label_definition(const std::string& label_name,
Location location)
{
// A label with a blank identifier is never declared or defined.
if (label_name == "_")
return NULL;
go_assert(!this->functions_.empty());
Function* func = this->functions_.back().function->func_value();
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 =
this->labels_.insert(std::make_pair(label_name, lnull));
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.
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 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.
// Get the backend representation for an unnamed label.

View File

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