]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: fix TypeName.IsAlias for type parameter names
authorRobert Griesemer <gri@golang.org>
Mon, 1 Nov 2021 00:27:12 +0000 (17:27 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 1 Nov 2021 15:55:29 +0000 (15:55 +0000)
This is a port of CL 359656 from go/types to types2.

For #49213.

Change-Id: Ib98f9a344c1397af92e061cafd519ea374fd60bc
Reviewed-on: https://go-review.googlesource.com/c/go/+/360294
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/types2/object.go
src/cmd/compile/internal/types2/object_test.go
src/cmd/compile/internal/types2/testdata/fixedbugs/issue45985.go2

index affeaf61f2c0bc899c9f6b3364c66e9401d41489..c7d6709c26769a5bcd11bf968bcc279f0cd1f588 100644 (file)
@@ -315,6 +315,8 @@ func (obj *TypeName) IsAlias() bool {
                return obj.pkg != nil || t.name != obj.name || t == universeByte || t == universeRune
        case *Named:
                return obj != t.obj
+       case *TypeParam:
+               return obj != t.obj
        default:
                return true
        }
index a86733a5c99a12824f36121d9a8f935910eb8599..ed3c123023da33943fd949e3605de043d03e3b83 100644 (file)
@@ -33,6 +33,8 @@ func TestIsAlias(t *testing.T) {
        pkg := NewPackage("p", "p")
        t1 := NewTypeName(nopos, pkg, "t1", nil)
        n1 := NewNamed(t1, new(Struct), nil)
+       t5 := NewTypeName(nopos, pkg, "t5", nil)
+       NewTypeParam(t5, nil)
        for _, test := range []struct {
                name  *TypeName
                alias bool
@@ -46,6 +48,7 @@ func TestIsAlias(t *testing.T) {
                {NewTypeName(nopos, nil, "int32", Typ[Int32]), false},  // type name refers to basic type with same name
                {NewTypeName(nopos, pkg, "int32", Typ[Int32]), true},   // type name is declared in user-defined package (outside Universe)
                {NewTypeName(nopos, nil, "rune", Typ[Rune]), true},     // type name refers to basic type rune which is an alias already
+               {t5, false}, // type name refers to type parameter and vice versa
        } {
                check(test.name, test.alias)
        }
index f25b9d2b266c45010da8e8d857ad4e4427bc64d8..ee5282d6ef3489fd07ba4f60cba5a72333a6409a 100644 (file)
@@ -5,7 +5,7 @@
 package issue45985
 
 // TODO(gri): this error should be on app[int] below.
-func app[S /* ERROR "type S S does not match" */ interface{ ~[]T }, T any](s S, e T) S {
+func app[S /* ERROR "type S S does not match" */ interface{ ~[]T }, T any](s S, e T) S {
     return append(s, e)
 }