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