1
0
mirror of https://github.com/golang/go synced 2024-11-17 03:04:44 -07:00

go/types: don't panic if targs don't match tparams when substituting

Invalid code may produce instances where the number of type arguments
does not match the number of type parameters. Such code will cause an
error, but should not cause a panic when substituting in those invalid
instances.

Fixes #48529

Change-Id: Ie5ff5ace55921540a7224cc5022ef9ff7649361a
Reviewed-on: https://go-review.googlesource.com/c/go/+/351337
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
Robert Findley 2021-09-21 20:20:36 -04:00
parent 051df0d722
commit 7158ae4e32
4 changed files with 26 additions and 2 deletions

View File

@ -332,7 +332,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()
}

View 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)

View File

@ -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 }

View File

@ -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 }