aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-03-07 21:38:46 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-03-07 21:38:46 +0000
commitc7e529d3bc34424e0b0686854f2a4db42286ea9c (patch)
treeacbce969256b8d4b61d5de641da2a92a92c5c90e /gcc/go
parentb4ed59860a2fa536620e9b0b7bb6b3851fd6911c (diff)
downloadgcc-c7e529d3bc34424e0b0686854f2a4db42286ea9c.zip
gcc-c7e529d3bc34424e0b0686854f2a4db42286ea9c.tar.gz
gcc-c7e529d3bc34424e0b0686854f2a4db42286ea9c.tar.bz2
Support multiple init functions in a single file.
From-SVN: r170756
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/gogo-tree.cc13
-rw-r--r--gcc/go/gofrontend/gogo.cc27
2 files changed, 19 insertions, 21 deletions
diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc
index 83488fc..562a5af 100644
--- a/gcc/go/gofrontend/gogo-tree.cc
+++ b/gcc/go/gofrontend/gogo-tree.cc
@@ -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;
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index 69ad398..f8c143c 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -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;