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:
parent
57c7a33b97
commit
53c1201606
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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_;
|
||||||
|
|
Loading…
Reference in New Issue