From c7e529d3bc34424e0b0686854f2a4db42286ea9c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 7 Mar 2011 21:38:46 +0000 Subject: [PATCH] Support multiple init functions in a single file. From-SVN: r170756 --- gcc/go/gofrontend/gogo-tree.cc | 13 ------------- gcc/go/gofrontend/gogo.cc | 27 +++++++++++++++++++-------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc index 83488fc83e7..562a5afa984 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 69ad3981765..f8c143c9c29 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; -- 2.30.2