]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: fix TypeName.IsAlias for type parameter names
authorzhouguangyuan <zhouguangyuan.xian@gmail.com>
Fri, 29 Oct 2021 07:24:28 +0000 (15:24 +0800)
committerRobert Findley <rfindley@google.com>
Mon, 1 Nov 2021 16:30:49 +0000 (16:30 +0000)
Fixes #49213

Change-Id: I2bfc151b74b0d14efbd00e5d28584f4180126c5d
Reviewed-on: https://go-review.googlesource.com/c/go/+/359656
Trust: Robert Griesemer <gri@golang.org>
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>

src/go/types/object.go
src/go/types/object_test.go
src/go/types/testdata/fixedbugs/issue45985.go2

index 18015fc9672d406359925e57ff8724c9599b8535..a8bd62a04ef9f5736caeb1391cb7ea5b529e8eef 100644 (file)
@@ -269,6 +269,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 0ff8fdd6fa69bad43ca3a603d6f3d7fe6770d89a..c12af64df7fb359534ee73b321a0c9ee891c5a9f 100644 (file)
@@ -30,6 +30,8 @@ func TestIsAlias(t *testing.T) {
        pkg := NewPackage("p", "p")
        t1 := NewTypeName(0, pkg, "t1", nil)
        n1 := NewNamed(t1, new(Struct), nil)
+       t5 := NewTypeName(0, pkg, "t5", nil)
+       NewTypeParam(t5, nil)
        for _, test := range []struct {
                name  *TypeName
                alias bool
@@ -43,6 +45,7 @@ func TestIsAlias(t *testing.T) {
                {NewTypeName(0, nil, "int32", Typ[Int32]), false},  // type name refers to basic type with same name
                {NewTypeName(0, pkg, "int32", Typ[Int32]), true},   // type name is declared in user-defined package (outside Universe)
                {NewTypeName(0, 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 6e42dbb633969bf92e3df7e0ce084c4de103b7b3..07395911cd17ee490722fdd2b8fb6af5b753f251 100644 (file)
@@ -5,7 +5,7 @@
 package issue45985
 
 // TODO(rFindley): 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)
 }