From 2b4171c331d0875e411ea19b63b04a41a263c10c Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <ian@gcc.gnu.org>
Date: Fri, 21 Jun 2013 17:56:49 +0000
Subject: [PATCH] compiler: do not skip compilation of blank-named functions.

Fixes issue 22.

From-SVN: r200316
---
 gcc/go/gofrontend/gogo-tree.cc |  8 ++++++++
 gcc/go/gofrontend/gogo.cc      |  7 ++++---
 gcc/go/gofrontend/gogo.h       | 10 ++++++++++
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc
index cd54f2bdeed8..06fd4f0bb229 100644
--- a/gcc/go/gofrontend/gogo-tree.cc
+++ b/gcc/go/gofrontend/gogo-tree.cc
@@ -829,6 +829,14 @@ Gogo::write_globals()
 	    }
 	}
 
+      // Skip blank named functions.
+      if (no->is_function() && no->func_value()->is_sink())
+        {
+          --i;
+          --count;
+          continue;
+        }
+
       if (!no->is_variable())
 	{
 	  vec[i] = no->get_tree(this, NULL);
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index d005fb86156e..948b11f54dd7 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -819,7 +819,8 @@ Gogo::start_function(const std::string& name, Function_type* type,
       char buf[30];
       snprintf(buf, sizeof buf, ".$sink%d", sink_count);
       ++sink_count;
-      ret = Named_object::make_function(buf, NULL, function);
+      ret = this->package_->bindings()->add_function(buf, NULL, function);
+      ret->func_value()->set_is_sink();
     }
   else if (!type->is_method())
     {
@@ -3253,8 +3254,8 @@ Function::Function(Function_type* type, Function* enclosing, Block* block,
   : type_(type), enclosing_(enclosing), results_(NULL),
     closure_var_(NULL), block_(block), location_(location), labels_(),
     local_type_count_(0), descriptor_(NULL), fndecl_(NULL), defer_stack_(NULL),
-    results_are_named_(false), nointerface_(false), calls_recover_(false),
-    is_recover_thunk_(false), has_recover_thunk_(false),
+    is_sink_(false), results_are_named_(false), nointerface_(false),
+    calls_recover_(false), is_recover_thunk_(false), has_recover_thunk_(false),
     in_unique_section_(false), is_descriptor_wrapper_(false)
 {
 }
diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h
index 4a840758cac7..7f55470a3fe3 100644
--- a/gcc/go/gofrontend/gogo.h
+++ b/gcc/go/gofrontend/gogo.h
@@ -911,6 +911,14 @@ class Function
   result_variables()
   { return this->results_; }
 
+  bool
+  is_sink() const
+  { return this->is_sink_; }
+
+  void
+  set_is_sink()
+  { this->is_sink_ = true; }
+
   // Whether the result variables have names.
   bool
   results_are_named() const
@@ -1167,6 +1175,8 @@ class Function
   // distinguish the defer stack for one function from another.  This
   // is NULL unless we actually need a defer stack.
   Temporary_statement* defer_stack_;
+  // True if this function is sink-named.  No code is generated.
+  bool is_sink_ : 1;
   // True if the result variables are named.
   bool results_are_named_ : 1;
   // True if this method should not be included in the type descriptor.
-- 
GitLab