compiler: Allow multiple blank label definitions.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 27 Aug 2015 22:41:55 +0000 (22:41 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 27 Aug 2015 22:41:55 +0000 (22:41 +0000)
    Fixes golang/go#12316.

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

From-SVN: r227284

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

index 4561966046c22dfaa9c0af49a971912dd425b808..dc519b28402ca4c4dada511ff86da598d36639fe 100644 (file)
@@ -1,4 +1,4 @@
-a1d2cac484f46068b5a6ddf3e041d425a3d25e0c
+9ae5835a010a55fba875103be5f4e61485a97099
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 374f155e05d9e79433ab4d0f5210af4485c38cdb..3af2af745fb6cc2f4abbc8247b7e308c5ef9b879 100644 (file)
@@ -2689,6 +2689,8 @@ class Label
   void
   define(Location location, Bindings_snapshot* snapshot)
   {
+    if (this->is_dummy_label())
+      return;
     go_assert(Linemap::is_unknown_location(this->location_)
               && this->snapshot_ == NULL);
     this->location_ = location;
@@ -2709,6 +2711,11 @@ class Label
   static Label*
   create_dummy_label();
 
+  // Return TRUE if this is a dummy label.
+  bool
+  is_dummy_label() const
+  { return this->name_ == "_"; }
+
  private:
   // The name of the label.
   std::string name_;
index 72b41cb09a35cacecd4b48ece57bcc7e77dac4a8..5d102bf2e17e6a95a916a6f77ffb4a58f20f5270 100644 (file)
@@ -3080,6 +3080,11 @@ Label_statement::do_traverse(Traverse*)
 Bstatement*
 Label_statement::do_get_backend(Translate_context* context)
 {
+  if (this->label_->is_dummy_label())
+    {
+      Bexpression* bce = context->backend()->boolean_constant_expression(false);
+      return context->backend()->expression_statement(bce);
+    }
   Blabel* blabel = this->label_->get_backend_label(context);
   return context->backend()->label_definition_statement(blabel);
 }