Skip to content

Commit

Permalink
compiler: permit duplicate methods from embedded interfaces
Browse files Browse the repository at this point in the history
    
    This is a language change for Go 1.14.
    
    Updates golang/go#6977
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/214240


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@280109 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
ian committed Jan 10, 2020
1 parent 87d0b3d commit 95a3175
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 27 deletions.
2 changes: 1 addition & 1 deletion gcc/go/gofrontend/MERGE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
92ee4c2e295fc760105f187f6ea6dc65c81fa892
98c4c21b52afd6384f9364527bd7f5f9a1c752cf

The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
26 changes: 17 additions & 9 deletions gcc/go/gofrontend/types.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8943,8 +8943,12 @@ Interface_type::finalize_methods()
continue;
}

const Typed_identifier_list* imethods = it->parse_methods_;
if (imethods == NULL)
continue;

Named_type* nt = t->named_type();
if (nt != NULL && it->parse_methods_ != NULL)
if (nt != NULL)
{
std::vector<Named_type*>::const_iterator q;
for (q = seen.begin(); q != seen.end(); ++q)
Expand All @@ -8960,22 +8964,26 @@ Interface_type::finalize_methods()
seen.push_back(nt);
}

const Typed_identifier_list* imethods = it->parse_methods_;
if (imethods == NULL)
continue;
for (Typed_identifier_list::const_iterator q = imethods->begin();
q != imethods->end();
++q)
{
if (q->name().empty())
inherit.push_back(*q);
else if (this->find_method(q->name()) == NULL)
this->all_methods_->push_back(Typed_identifier(q->name(),
q->type(), tl));
else
go_error_at(tl, "inherited method %qs is ambiguous",
Gogo::message_name(q->name()).c_str());
{
const Typed_identifier* oldm = this->find_method(q->name());
if (oldm == NULL)
this->all_methods_->push_back(Typed_identifier(q->name(),
q->type(), tl));
else if (!Type::are_identical(q->type(), oldm->type(),
Type::COMPARE_TAGS, NULL))
go_error_at(tl, "duplicate method %qs",
Gogo::message_name(q->name()).c_str());
}
}

seen.pop_back();
}

if (!this->all_methods_->empty())
Expand Down
14 changes: 0 additions & 14 deletions gcc/testsuite/go.test/test/fixedbugs/bug211.go

This file was deleted.

6 changes: 3 additions & 3 deletions gcc/testsuite/go.test/test/fixedbugs/bug251.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
// errorcheck

// Copyright 2010 The Go Authors. All rights reserved.
// Copyright 2010 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.

package main

type I1 interface {
type I1 interface { // GC_ERROR "invalid recursive type"
m() I2
I2 // GCCGO_ERROR "loop|interface"
}

type I2 interface {
I1 // ERROR "loop|interface"
I1 // GCCGO_ERROR "loop|interface"
}


Expand Down

0 comments on commit 95a3175

Please sign in to comment.