aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2020-01-10 14:27:05 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2020-01-10 14:27:05 +0000
commit2fb672a2574004a1e77c8ba83af539673f5cf659 (patch)
treeba1efe5fc64fac371ba9c620dc86893c9163bd94 /gcc
parent9c158322b6fdb47666f49c001dc54ea9f5c853e9 (diff)
downloadgcc-2fb672a2574004a1e77c8ba83af539673f5cf659.zip
gcc-2fb672a2574004a1e77c8ba83af539673f5cf659.tar.gz
gcc-2fb672a2574004a1e77c8ba83af539673f5cf659.tar.bz2
compiler: permit duplicate methods from embedded interfaces
This is a language change for Go 1.14. Updates golang/go#6977 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/214240 From-SVN: r280109
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/types.cc26
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug211.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug251.go6
4 files changed, 21 insertions, 27 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 9189bed..e7f037a 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -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.
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index 27d53df..d6cd326 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -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)
@@ -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())
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug211.go b/gcc/testsuite/go.test/test/fixedbugs/bug211.go
deleted file mode 100644
index b150479..0000000
--- a/gcc/testsuite/go.test/test/fixedbugs/bug211.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// errorcheck
-
-// Copyright 2009 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 R interface { duplicate() }
-type S interface { duplicate() }
-type T interface { R; S } // ERROR "duplicate"
-
-func main() {
-}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug251.go b/gcc/testsuite/go.test/test/fixedbugs/bug251.go
index 43d9d52..706bb8d 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug251.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug251.go
@@ -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"
}