From ddec18cf827f3e21868892e1b4df48281314d69a Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 10 Feb 2021 12:32:59 -0800 Subject: [PATCH] [dev.typeparams] cmd/compile/internal/types2: overlapping embedded interfaces requires go1.14 Add respective check to type checker. Enables another excluded test in test/run.go. This CL completes the currently required checks for language compatibility in types2. Updates #31793. Change-Id: Icececff9e6023d38f600c93bcb54cdcafcf501b9 Reviewed-on: https://go-review.googlesource.com/c/go/+/290911 Trust: Robert Griesemer Reviewed-by: Robert Findley --- .../compile/internal/types2/stdlib_test.go | 1 - .../internal/types2/testdata/go1_13.src | 21 +++++++++++++++++++ src/cmd/compile/internal/types2/typexpr.go | 8 +++++-- test/run.go | 1 - 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/cmd/compile/internal/types2/testdata/go1_13.src diff --git a/src/cmd/compile/internal/types2/stdlib_test.go b/src/cmd/compile/internal/types2/stdlib_test.go index 2949e23019..0477e54998 100644 --- a/src/cmd/compile/internal/types2/stdlib_test.go +++ b/src/cmd/compile/internal/types2/stdlib_test.go @@ -192,7 +192,6 @@ func TestStdFixed(t *testing.T) { "issue22200b.go", // go/types does not have constraints on stack size "issue25507.go", // go/types does not have constraints on stack size "issue20780.go", // go/types does not have constraints on stack size - "issue34329.go", // go/types does not have constraints on language level (-lang=go1.13) (see #31793) "issue42058a.go", // go/types does not have constraints on channel element size "issue42058b.go", // go/types does not have constraints on channel element size "bug251.go", // issue #34333 which was exposed with fix for #34151 diff --git a/src/cmd/compile/internal/types2/testdata/go1_13.src b/src/cmd/compile/internal/types2/testdata/go1_13.src new file mode 100644 index 0000000000..93cb4c72a7 --- /dev/null +++ b/src/cmd/compile/internal/types2/testdata/go1_13.src @@ -0,0 +1,21 @@ +// Copyright 2021 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. + +// Check Go language version-specific errors. + +package go1_13 // go1.13 + +// interface embedding + +type I interface { m() } + +type _ interface { + m() + I // ERROR "duplicate method m" +} + +type _ interface { + I + I // ERROR "duplicate method m" +} diff --git a/src/cmd/compile/internal/types2/typexpr.go b/src/cmd/compile/internal/types2/typexpr.go index b758c0f358..b67a35ed30 100644 --- a/src/cmd/compile/internal/types2/typexpr.go +++ b/src/cmd/compile/internal/types2/typexpr.go @@ -943,9 +943,13 @@ func (check *Checker) completeInterface(pos syntax.Pos, ityp *Interface) { check.errorf(pos, "duplicate method %s", m.name) check.errorf(mpos[other.(*Func)], "\tother declaration of %s", m.name) // secondary error, \t indented default: - // check method signatures after all types are computed (issue #33656) + // We have a duplicate method name in an embedded (not explicitly declared) method. + // Check method signatures after all types are computed (issue #33656). + // If we're pre-go1.14 (overlapping embeddings are not permitted), report that + // error here as well (even though we could do it eagerly) because it's the same + // error message. check.atEnd(func() { - if !check.identical(m.typ, other.Type()) { + if !check.allowVersion(m.pkg, 1, 14) || !check.identical(m.typ, other.Type()) { check.errorf(pos, "duplicate method %s", m.name) check.errorf(mpos[other.(*Func)], "\tother declaration of %s", m.name) // secondary error, \t indented } diff --git a/test/run.go b/test/run.go index b1d6fe2414..3ff5d9c1e0 100644 --- a/test/run.go +++ b/test/run.go @@ -1964,7 +1964,6 @@ var excluded = map[string]bool{ "fixedbugs/issue28079b.go": true, // types2 reports follow-on errors "fixedbugs/issue28268.go": true, // types2 reports follow-on errors "fixedbugs/issue33460.go": true, // types2 reports alternative positions in separate error - "fixedbugs/issue34329.go": true, // types2 is missing support for -lang flag "fixedbugs/issue41575.go": true, // types2 reports alternative positions in separate error "fixedbugs/issue42058a.go": true, // types2 doesn't report "channel element type too large" "fixedbugs/issue42058b.go": true, // types2 doesn't report "channel element type too large"