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:
parent
051df0d722
commit
7158ae4e32
@ -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()
|
||||
}
|
||||
|
@ -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)
|
||||
|
11
src/go/types/testdata/fixedbugs/issue46461.go2
vendored
Normal file
11
src/go/types/testdata/fixedbugs/issue46461.go2
vendored
Normal 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 }
|
11
src/go/types/testdata/fixedbugs/issue48529.go2
vendored
Normal file
11
src/go/types/testdata/fixedbugs/issue48529.go2
vendored
Normal 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 }
|
Loading…
Reference in New Issue
Block a user