]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: don't panic if targs don't match tparams when substituting
authorRobert Griesemer <gri@golang.org>
Wed, 22 Sep 2021 20:38:05 +0000 (13:38 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 22 Sep 2021 20:53:48 +0000 (20:53 +0000)
This is a clean port of CL 351337 from go/types to types2.

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

src/cmd/compile/internal/types2/named.go
src/cmd/compile/internal/types2/subst.go
src/cmd/compile/internal/types2/testdata/fixedbugs/issue46461.go2 [new file with mode: 0644]
src/cmd/compile/internal/types2/testdata/fixedbugs/issue48529.go2 [new file with mode: 0644]

index 1db993afc90271aa959071e610b4953f8932baf7..bc4d4f89c52547d1c084ea0a3ec5c4d8286b73de 100644 (file)
@@ -330,7 +330,7 @@ func (check *Checker) completeMethod(env *Environment, m *Func) {
 // TODO(rfindley): eliminate this function or give it a better name.
 func safeUnderlying(typ Type) Type {
        if t, _ := typ.(*Named); t != nil {
-               return t.resolve(nil).underlying
+               return t.underlying
        }
        return typ.Underlying()
 }
index ee68f226531286d0181365aca8b92e8e53a92f4a..5e057a6f8059fdf83be261b540767369cf265102 100644 (file)
@@ -177,7 +177,9 @@ func (subst *subster) typ(typ Type) Type {
                }
 
                var newTArgs []Type
-               assert(t.targs.Len() == t.orig.TypeParams().Len())
+               if t.targs.Len() != t.orig.TypeParams().Len() {
+                       return Typ[Invalid] // error reported elsewhere
+               }
 
                // already instantiated
                dump(">>> %s already instantiated", t)
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue46461.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue46461.go2
new file mode 100644 (file)
index 0000000..bfeaf3a
--- /dev/null
@@ -0,0 +1,11 @@
+// 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.
+
+package p
+
+type T[U interface{ M() T[U] }] int
+
+type X int
+
+func (X) M() T[X] { return 0 }
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue48529.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue48529.go2
new file mode 100644 (file)
index 0000000..4f92dec
--- /dev/null
@@ -0,0 +1,11 @@
+// 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.
+
+package p
+
+type T[U interface{ M() T /* ERROR "got 2 arguments but 1 type parameters" */ [U, int] }] int
+
+type X int
+
+func (X) M() T[X] { return 0 }