diff options
-rw-r--r-- | src/cmd/compile/internal/types2/issues_test.go | 17 | ||||
-rw-r--r-- | src/cmd/compile/internal/types2/subst.go | 1 | ||||
-rw-r--r-- | src/cmd/compile/internal/types2/typeset.go | 1 | ||||
-rw-r--r-- | src/go/types/issues_test.go | 17 | ||||
-rw-r--r-- | src/go/types/subst.go | 1 | ||||
-rw-r--r-- | src/go/types/typeset.go | 1 |
6 files changed, 36 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/types2/issues_test.go b/src/cmd/compile/internal/types2/issues_test.go index 3ac345729b..9d0adae8df 100644 --- a/src/cmd/compile/internal/types2/issues_test.go +++ b/src/cmd/compile/internal/types2/issues_test.go @@ -964,3 +964,20 @@ func f[I *T, T any]() { t.Fatalf("types of v and T are not pointer-identical: %p != %p", v.Type().(*TypeParam), T) } } + +func TestIssue64759(t *testing.T) { + const src = ` +//go:build go1.18 +package p + +func f[S ~[]E, E any](S) {} + +func _() { + f([]string{}) +} +` + // Per the go:build directive, the source must typecheck + // even though the (module) Go version is set to go1.17. + conf := Config{GoVersion: "go1.17"} + mustTypecheck(src, &conf, nil) +} diff --git a/src/cmd/compile/internal/types2/subst.go b/src/cmd/compile/internal/types2/subst.go index 74d6294dff..a750403855 100644 --- a/src/cmd/compile/internal/types2/subst.go +++ b/src/cmd/compile/internal/types2/subst.go @@ -169,6 +169,7 @@ func (subst *subster) typ(typ Type) Type { if mcopied || ecopied { iface := subst.check.newInterface() iface.embeddeds = embeddeds + iface.embedPos = t.embedPos iface.implicit = t.implicit iface.complete = t.complete // If we've changed the interface type, we may need to replace its diff --git a/src/cmd/compile/internal/types2/typeset.go b/src/cmd/compile/internal/types2/typeset.go index 70b9e36aef..8d33597ffd 100644 --- a/src/cmd/compile/internal/types2/typeset.go +++ b/src/cmd/compile/internal/types2/typeset.go @@ -304,7 +304,6 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_ // separately. Here we only need to intersect the term lists and comparable bits. allTerms, allComparable = intersectTermLists(allTerms, allComparable, terms, comparable) } - ityp.embedPos = nil // not needed anymore (errors have been reported) ityp.tset.comparable = allComparable if len(allMethods) != 0 { diff --git a/src/go/types/issues_test.go b/src/go/types/issues_test.go index 4a559cbab3..282939d641 100644 --- a/src/go/types/issues_test.go +++ b/src/go/types/issues_test.go @@ -974,3 +974,20 @@ func f[I *T, T any]() { t.Fatalf("types of v and T are not pointer-identical: %p != %p", v.Type().(*TypeParam), T) } } + +func TestIssue64759(t *testing.T) { + const src = ` +//go:build go1.18 +package p + +func f[S ~[]E, E any](S) {} + +func _() { + f([]string{}) +} +` + // Per the go:build directive, the source must typecheck + // even though the (module) Go version is set to go1.17. + conf := Config{GoVersion: "go1.17"} + mustTypecheck(src, &conf, nil) +} diff --git a/src/go/types/subst.go b/src/go/types/subst.go index 30c48e1bad..96bc341a5f 100644 --- a/src/go/types/subst.go +++ b/src/go/types/subst.go @@ -171,6 +171,7 @@ func (subst *subster) typ(typ Type) Type { if mcopied || ecopied { iface := subst.check.newInterface() iface.embeddeds = embeddeds + iface.embedPos = t.embedPos iface.implicit = t.implicit iface.complete = t.complete // If we've changed the interface type, we may need to replace its diff --git a/src/go/types/typeset.go b/src/go/types/typeset.go index 206aa3da08..4cd118a226 100644 --- a/src/go/types/typeset.go +++ b/src/go/types/typeset.go @@ -302,7 +302,6 @@ func computeInterfaceTypeSet(check *Checker, pos token.Pos, ityp *Interface) *_T // separately. Here we only need to intersect the term lists and comparable bits. allTerms, allComparable = intersectTermLists(allTerms, allComparable, terms, comparable) } - ityp.embedPos = nil // not needed anymore (errors have been reported) ityp.tset.comparable = allComparable if len(allMethods) != 0 { |