]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: consistently report "duplicate method" error in go1.13
authorRobert Griesemer <gri@golang.org>
Wed, 13 Mar 2024 15:56:06 +0000 (08:56 -0700)
committerGopher Robot <gobot@golang.org>
Thu, 14 Mar 2024 23:23:41 +0000 (23:23 +0000)
Go 1.13 is not supported anymore, but this CL removes an unnecessary
check and in turn fixes an old bug.

Fixes #66285.

Change-Id: I15ee1712b31f8ac8c915f18410d99cbf44334d35
Reviewed-on: https://go-review.googlesource.com/c/go/+/571058
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Robert Griesemer <gri@google.com>

src/cmd/compile/internal/types2/typeset.go
src/go/types/typeset.go
src/internal/types/testdata/fixedbugs/issue66285.go [new file with mode: 0644]

index a7dddc308d53a33f9f61052996218585d078a80f..63dafadeb43f6d63fc83708809ac145586c72ab9 100644 (file)
@@ -238,9 +238,7 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_
                        // error message.
                        if check != nil {
                                check.later(func() {
-                                       // ignore version check if method is from a different package
-                                       // TODO(gri) this seems incorrect - see go.dev/issue/66285
-                                       if check.pkg == m.pkg && pos.IsKnown() && !check.allowVersion(atPos(pos), go1_14) || !Identical(m.typ, other.Type()) {
+                                       if pos.IsKnown() && !check.allowVersion(atPos(pos), go1_14) || !Identical(m.typ, other.Type()) {
                                                err := check.newError(DuplicateDecl)
                                                err.addf(atPos(pos), "duplicate method %s", m.name)
                                                err.addf(atPos(mpos[other.(*Func)]), "other declaration of %s", m.name)
index 29bd7183356c1015d84148c32553571212c17312..2e2ebb30f77772589c253a1ff33bc28c760167b3 100644 (file)
@@ -240,9 +240,7 @@ func computeInterfaceTypeSet(check *Checker, pos token.Pos, ityp *Interface) *_T
                        // error message.
                        if check != nil {
                                check.later(func() {
-                                       // ignore version check if method is from a different package
-                                       // TODO(gri) this seems incorrect - see go.dev/issue/66285
-                                       if check.pkg == m.pkg && pos.IsValid() && !check.allowVersion(atPos(pos), go1_14) || !Identical(m.typ, other.Type()) {
+                                       if pos.IsValid() && !check.allowVersion(atPos(pos), go1_14) || !Identical(m.typ, other.Type()) {
                                                err := check.newError(DuplicateDecl)
                                                err.addf(atPos(pos), "duplicate method %s", m.name)
                                                err.addf(atPos(mpos[other.(*Func)]), "other declaration of %s", m.name)
diff --git a/src/internal/types/testdata/fixedbugs/issue66285.go b/src/internal/types/testdata/fixedbugs/issue66285.go
new file mode 100644 (file)
index 0000000..9811fec
--- /dev/null
@@ -0,0 +1,37 @@
+// -lang=go1.21
+
+// Copyright 2024 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.
+
+// Note: Downgrading to go1.13 requires at least go1.21,
+//       hence the need for -lang=go1.21 at the top.
+
+//go:build go1.13
+
+package p
+
+import "io"
+
+// A "duplicate method" error should be reported for
+// all these interfaces, irrespective of which package
+// the embedded Reader is coming from.
+
+type _ interface {
+       Reader
+       Reader // ERROR "duplicate method Read"
+}
+
+type Reader interface {
+       Read(p []byte) (n int, err error)
+}
+
+type _ interface {
+       io.Reader
+       Reader // ERROR "duplicate method Read"
+}
+
+type _ interface {
+       io.Reader
+       io /* ERROR "duplicate method Read" */ .Reader
+}