mirror of
https://github.com/golang/go
synced 2024-11-17 23:54:51 -07:00
go/types, types2: better internal comment, added suitable test case
Change-Id: If55cd001ab3d274cd9c61c06f73bb98162aa12a8 Reviewed-on: https://go-review.googlesource.com/c/go/+/471019 Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
35a4d1b3bc
commit
4eb3aea2b5
@ -73,8 +73,25 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
|
|||||||
|
|
||||||
// Substitute type arguments for their respective type parameters in params,
|
// Substitute type arguments for their respective type parameters in params,
|
||||||
// if any. Note that nil targs entries are ignored by check.subst.
|
// if any. Note that nil targs entries are ignored by check.subst.
|
||||||
// TODO(gri) Can we avoid this (we're setting known type arguments below,
|
// We do this for better error messages; it's not needed for correctness.
|
||||||
// but that doesn't impact the isParameterized check for now).
|
// For instance, given:
|
||||||
|
//
|
||||||
|
// func f[P, Q any](P, Q) {}
|
||||||
|
//
|
||||||
|
// func _(s string) {
|
||||||
|
// f[int](s, s) // ERROR
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// With substitution, we get the error:
|
||||||
|
// "cannot use s (variable of type string) as int value in argument to f[int]"
|
||||||
|
//
|
||||||
|
// Without substitution we get the (worse) error:
|
||||||
|
// "type string of s does not match inferred type int for P"
|
||||||
|
// even though the type int was provided (not inferred) for P.
|
||||||
|
//
|
||||||
|
// TODO(gri) We might be able to finesse this in the error message reporting
|
||||||
|
// (which only happens in case of an error) and then avoid doing
|
||||||
|
// the substitution (which always happens).
|
||||||
if params.Len() > 0 {
|
if params.Len() > 0 {
|
||||||
smap := makeSubstMap(tparams, targs)
|
smap := makeSubstMap(tparams, targs)
|
||||||
params = check.subst(nopos, params, smap, nil, check.context()).(*Tuple)
|
params = check.subst(nopos, params, smap, nil, check.context()).(*Tuple)
|
||||||
|
@ -75,8 +75,25 @@ func (check *Checker) infer(posn positioner, tparams []*TypeParam, targs []Type,
|
|||||||
|
|
||||||
// Substitute type arguments for their respective type parameters in params,
|
// Substitute type arguments for their respective type parameters in params,
|
||||||
// if any. Note that nil targs entries are ignored by check.subst.
|
// if any. Note that nil targs entries are ignored by check.subst.
|
||||||
// TODO(gri) Can we avoid this (we're setting known type arguments below,
|
// We do this for better error messages; it's not needed for correctness.
|
||||||
// but that doesn't impact the isParameterized check for now).
|
// For instance, given:
|
||||||
|
//
|
||||||
|
// func f[P, Q any](P, Q) {}
|
||||||
|
//
|
||||||
|
// func _(s string) {
|
||||||
|
// f[int](s, s) // ERROR
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// With substitution, we get the error:
|
||||||
|
// "cannot use s (variable of type string) as int value in argument to f[int]"
|
||||||
|
//
|
||||||
|
// Without substitution we get the (worse) error:
|
||||||
|
// "type string of s does not match inferred type int for P"
|
||||||
|
// even though the type int was provided (not inferred) for P.
|
||||||
|
//
|
||||||
|
// TODO(gri) We might be able to finesse this in the error message reporting
|
||||||
|
// (which only happens in case of an error) and then avoid doing
|
||||||
|
// the substitution (which always happens).
|
||||||
if params.Len() > 0 {
|
if params.Len() > 0 {
|
||||||
smap := makeSubstMap(tparams, targs)
|
smap := makeSubstMap(tparams, targs)
|
||||||
params = check.subst(nopos, params, smap, nil, check.context()).(*Tuple)
|
params = check.subst(nopos, params, smap, nil, check.context()).(*Tuple)
|
||||||
|
@ -102,3 +102,11 @@ func (p *Settable) Set(s string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var _ = FromStrings[Settable]([]string{"1", "2"})
|
var _ = FromStrings[Settable]([]string{"1", "2"})
|
||||||
|
|
||||||
|
// Suitable error message when the type parameter is provided (rather than inferred).
|
||||||
|
|
||||||
|
func f8[P, Q any](P, Q) {}
|
||||||
|
|
||||||
|
func _(s string) {
|
||||||
|
f8[int](s /* ERROR "cannot use s (variable of type string) as int value in argument to f8[int]" */ , s)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user