compiler: Don't allow multiple function declarations.
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 3 Aug 2015 19:55:00 +0000 (19:55 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 3 Aug 2015 19:55:00 +0000 (19:55 +0000)
    Fixes golang/go#11573.

    Reviewed-on: https://go-review.googlesource.com/12508

From-SVN: r226529

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/parse.cc

index e3a971a8e619a7f8648fca0b1ac576ef83cfe966..56ae88e5aadd036d60677e08ecfb07cc8b036d66 100644 (file)
@@ -1,4 +1,4 @@
-2b1a79c6395991fc4e60e20312ff44065fdb816b
+7a6089333f4ab10449f9140c4639cfe741abcb25
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 52bec3dc6dd80725a3432e623ee3b62f3f1a2954..9a5dd57cdb56ed855f76c699c8272ac5170932ea 100644 (file)
@@ -7408,16 +7408,10 @@ Bindings::new_definition(Named_object* old_object, Named_object* new_object)
 
     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())
          {
+            Function_type* old_type =
+                old_object->func_declaration_value()->type();
            Function_type* new_type = new_object->func_value()->type();
            if (old_type->is_valid_redeclaration(new_type, &reason))
              {
index b7a0c3973a45b283f99a9a486277a16111e4b0a3..7f7eba489c7df1cb67b96d7b216143e3fbe727dc 100644 (file)
@@ -2231,9 +2231,11 @@ Parse::function_decl(bool saw_nointerface)
   std::string extern_name = this->lex_->extern_name();
   const Token* token = this->advance_token();
 
+  bool expected_receiver = false;
   Typed_identifier* rec = NULL;
   if (token->is_op(OPERATOR_LPAREN))
     {
+      expected_receiver = true;
       rec = this->receiver();
       token = this->peek_token();
     }
@@ -2304,7 +2306,8 @@ Parse::function_decl(bool saw_nointerface)
     {
       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);
          else
            {