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
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -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 (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.
|
||||
|
|
|
@ -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_;
|
||||
|
|
Loading…
Reference in New Issue