OSDN Git Service

Support multiple init functions in a single file.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Mar 2011 21:38:46 +0000 (21:38 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Mar 2011 21:38:46 +0000 (21:38 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170756 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/gogo-tree.cc
gcc/go/gofrontend/gogo.cc

index 83488fc..562a5af 100644 (file)
@@ -839,19 +839,6 @@ Named_object::get_id(Gogo* gogo)
       // types.
       decl_name = Gogo::unpack_hidden_name(this->name_);
     }
-  else if (this->is_function()
-          && !this->func_value()->is_method()
-          && this->package_ == NULL
-          && Gogo::unpack_hidden_name(this->name_) == "init")
-    {
-      // A single package can have multiple "init" functions, which
-      // means that we need to give them different names.
-      static int init_index;
-      char buf[20];
-      snprintf(buf, sizeof buf, "%d", init_index);
-      ++init_index;
-      decl_name = gogo->package_name() + ".init." + buf;
-    }
   else
     {
       std::string package_name;
index 69ad398..f8c143c 100644 (file)
@@ -211,12 +211,6 @@ Gogo::Gogo(int int_type_size, int pointer_size)
   this->globals_->add_function_declaration("imag", NULL, imag_type, loc);
 
   this->define_builtin_function_trees();
-
-  // Declare "init", to ensure that it is not defined with parameters
-  // or return values.
-  this->declare_function("init",
-                        Type::make_function_type(NULL, NULL, NULL, loc),
-                        loc);
 }
 
 // Munge name for use in an error message.
@@ -660,7 +654,24 @@ Gogo::start_function(const std::string& name, Function_type* type,
 
   const std::string* pname;
   std::string nested_name;
-  if (!name.empty())
+  bool is_init = false;
+  if (Gogo::unpack_hidden_name(name) == "init" && !type->is_method())
+    {
+      if ((type->parameters() != NULL && !type->parameters()->empty())
+         || (type->results() != NULL && !type->results()->empty()))
+       error_at(location,
+                "func init must have no arguments and no return values");
+      // There can be multiple "init" functions, so give them each a
+      // different name.
+      static int init_count;
+      char buf[30];
+      snprintf(buf, sizeof buf, ".$init%d", init_count);
+      ++init_count;
+      nested_name = buf;
+      pname = &nested_name;
+      is_init = true;
+    }
+  else if (!name.empty())
     pname = &name;
   else
     {
@@ -753,7 +764,7 @@ Gogo::start_function(const std::string& name, Function_type* type,
   of.function = ret;
   of.blocks.push_back(block);
 
-  if (!type->is_method() && Gogo::unpack_hidden_name(name) == "init")
+  if (is_init)
     {
       this->init_functions_.push_back(ret);
       this->need_init_fn_ = true;