Commit 53c12016 by Ian Lance Taylor

compiler: Create dummy labels for blank labels.

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

From-SVN: r226009
parent 57c7a33b
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* ...@@ -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, ...@@ -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) ...@@ -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 ...@@ -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_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment