compiler: Create dummy labels for blank labels.
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 20 Jul 2015 17:25:24 +0000 (17:25 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 20 Jul 2015 17:25:24 +0000 (17:25 +0000)
    Fixes golang/go#11591.

    Reviewed-on: https://go-review.googlesource.com/12043

From-SVN: r226009

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/gogo.h

index 1b1e3cdc04548dff54cebe4b2e977bf8995e0fbd..463b2036f11ccf80d3cc27bfc994b982cb436e1e 100644 (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.
index ad4672ffe059a20cf292b34dab535538a02e2724..d521fb1e2b79549216ec8549596d0a2b2fb6f11a 100644 (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.
index ffc2440f8ffacac74015fadb39ec0000f6496901..51f628fa3b201242004cc2118ede0ffae317cb99 100644 (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_;