Commit ef9da28d by Ian Lance Taylor

compiler: Don't allow multiple function declarations.

    
    Fixes golang/go#11573.
    
    Reviewed-on: https://go-review.googlesource.com/12508

From-SVN: r226529
parent de0fb905
2b1a79c6395991fc4e60e20312ff44065fdb816b 7a6089333f4ab10449f9140c4639cfe741abcb25
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -7408,16 +7408,10 @@ Bindings::new_definition(Named_object* old_object, Named_object* new_object) ...@@ -7408,16 +7408,10 @@ Bindings::new_definition(Named_object* old_object, Named_object* new_object)
case Named_object::NAMED_OBJECT_FUNC_DECLARATION: case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
{ {
Function_type* old_type = old_object->func_declaration_value()->type();
if (new_object->is_function_declaration())
{
Function_type* new_type =
new_object->func_declaration_value()->type();
if (old_type->is_valid_redeclaration(new_type, &reason))
return old_object;
}
if (new_object->is_function()) if (new_object->is_function())
{ {
Function_type* old_type =
old_object->func_declaration_value()->type();
Function_type* new_type = new_object->func_value()->type(); Function_type* new_type = new_object->func_value()->type();
if (old_type->is_valid_redeclaration(new_type, &reason)) if (old_type->is_valid_redeclaration(new_type, &reason))
{ {
......
...@@ -2231,9 +2231,11 @@ Parse::function_decl(bool saw_nointerface) ...@@ -2231,9 +2231,11 @@ Parse::function_decl(bool saw_nointerface)
std::string extern_name = this->lex_->extern_name(); std::string extern_name = this->lex_->extern_name();
const Token* token = this->advance_token(); const Token* token = this->advance_token();
bool expected_receiver = false;
Typed_identifier* rec = NULL; Typed_identifier* rec = NULL;
if (token->is_op(OPERATOR_LPAREN)) if (token->is_op(OPERATOR_LPAREN))
{ {
expected_receiver = true;
rec = this->receiver(); rec = this->receiver();
token = this->peek_token(); token = this->peek_token();
} }
...@@ -2304,7 +2306,8 @@ Parse::function_decl(bool saw_nointerface) ...@@ -2304,7 +2306,8 @@ Parse::function_decl(bool saw_nointerface)
{ {
if (named_object == NULL && !Gogo::is_sink_name(name)) if (named_object == NULL && !Gogo::is_sink_name(name))
{ {
if (fntype == NULL) if (fntype == NULL
|| (expected_receiver && rec == NULL))
this->gogo_->add_erroneous_name(name); this->gogo_->add_erroneous_name(name);
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment