This patch to the gofrontend improves the recently added type alias
handling, and lets the compiler pass the tests on the dev.typealias
branch of the gc compiler.

We now give an error for an attempt to define a method on an imported type.

We now give an error for each attempt to define a method on a builtin type.

I adjusted the error messages to be closer to gc error messages.

This changes the errors printed for test/fixedbugs/issue5089.go, but
the change is an improvement.

Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.  Committed
to mainline.

Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE     (revision 244835)
+++ gcc/go/gofrontend/MERGE     (working copy)
@@ -1,4 +1,4 @@
-fb609ff6d940768cf4db4ab7deb93b2ab686e45d
+5c6c93f58e2aaae186bac5dcde9df1679d4896b1
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/gogo.cc
===================================================================
--- gcc/go/gofrontend/gogo.cc   (revision 244460)
+++ gcc/go/gofrontend/gogo.cc   (working copy)
@@ -1779,18 +1779,27 @@ Gogo::start_function(const std::string&
 
          while (rtype->named_type() != NULL
                 && rtype->named_type()->is_alias())
-           rtype = rtype->named_type()->real_type();
+           rtype = rtype->named_type()->real_type()->forwarded();
 
          if (rtype->is_error_type())
            ret = Named_object::make_function(name, NULL, function);
          else if (rtype->named_type() != NULL)
            {
-             ret = rtype->named_type()->add_method(name, function);
-             if (!ret->is_function())
+             if (rtype->named_type()->named_object()->package() != NULL)
                {
-                 // Redefinition error.
+                 go_error_at(type->receiver()->location(),
+                             "may not define methods on non-local type");
                  ret = Named_object::make_function(name, NULL, function);
                }
+             else
+               {
+                 ret = rtype->named_type()->add_method(name, function);
+                 if (!ret->is_function())
+                   {
+                     // Redefinition error.
+                     ret = Named_object::make_function(name, NULL, function);
+                   }
+               }
            }
          else if (rtype->forward_declaration_type() != NULL)
            {
@@ -2247,8 +2256,14 @@ Gogo::define_global_names()
          if (global_no->is_type())
            {
              if (no->type_declaration_value()->has_methods())
-               go_error_at(no->location(),
-                           "may not define methods for global type");
+               {
+                 for (std::vector<Named_object*>::const_iterator p =
+                        no->type_declaration_value()->methods()->begin();
+                      p != no->type_declaration_value()->methods()->end();
+                      p++)
+                   go_error_at((*p)->location(),
+                               "may not define methods on non-local type");
+               }
              no->set_type_value(global_no->type_value());
            }
          else
Index: gcc/testsuite/go.test/test/fixedbugs/issue5089.go
===================================================================
--- gcc/testsuite/go.test/test/fixedbugs/issue5089.go   (revision 244166)
+++ gcc/testsuite/go.test/test/fixedbugs/issue5089.go   (working copy)
@@ -1,6 +1,6 @@
 // errorcheck
 
-// Copyright 2013 The Go Authors.  All rights reserved.
+// Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
@@ -8,7 +8,7 @@
 
 package p
 
-import "bufio" // GCCGO_ERROR "previous"
+import "bufio"
 
 func (b *bufio.Reader) Buffered() int { // ERROR "non-local|redefinition"
        return -1

Reply via email to