mirror of
https://github.com/golang/go
synced 2024-11-17 05:54:46 -07:00
cmd/compile/internal/types2: remove report parameter from infer and inferB
This is a clean port of CL 350049 from go/types to types2. Change-Id: Ifc8551a772535f7b8e943bfbd9febbb78333fa68 Reviewed-on: https://go-review.googlesource.com/c/go/+/351169 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
2f70ce36d7
commit
1367a60b06
@ -41,7 +41,7 @@ func (check *Checker) funcInst(x *operand, inst *syntax.IndexExpr) {
|
|||||||
// if we don't have enough type arguments, try type inference
|
// if we don't have enough type arguments, try type inference
|
||||||
inferred := false
|
inferred := false
|
||||||
if got < want {
|
if got < want {
|
||||||
targs = check.infer(inst.Pos(), sig.TypeParams().list(), targs, nil, nil, true)
|
targs = check.infer(inst.Pos(), sig.TypeParams().list(), targs, nil, nil)
|
||||||
if targs == nil {
|
if targs == nil {
|
||||||
// error was already reported
|
// error was already reported
|
||||||
x.mode = invalid
|
x.mode = invalid
|
||||||
@ -338,7 +338,7 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, targs []T
|
|||||||
}
|
}
|
||||||
// TODO(gri) provide position information for targs so we can feed
|
// TODO(gri) provide position information for targs so we can feed
|
||||||
// it to the instantiate call for better error reporting
|
// it to the instantiate call for better error reporting
|
||||||
targs := check.infer(call.Pos(), sig.TypeParams().list(), targs, sigParams, args, true)
|
targs := check.infer(call.Pos(), sig.TypeParams().list(), targs, sigParams, args)
|
||||||
if targs == nil {
|
if targs == nil {
|
||||||
return // error already reported
|
return // error already reported
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,7 @@ const useConstraintTypeInference = true
|
|||||||
// 3) Infer type arguments from untyped function arguments.
|
// 3) Infer type arguments from untyped function arguments.
|
||||||
//
|
//
|
||||||
// Constraint type inference is used after each step to expand the set of type arguments.
|
// Constraint type inference is used after each step to expand the set of type arguments.
|
||||||
//
|
func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type, params *Tuple, args []*operand) (result []Type) {
|
||||||
// TODO(gri): remove the report parameter: is no longer needed.
|
|
||||||
func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type, params *Tuple, args []*operand, report bool) (result []Type) {
|
|
||||||
if debug {
|
if debug {
|
||||||
defer func() {
|
defer func() {
|
||||||
assert(result == nil || len(result) == len(tparams))
|
assert(result == nil || len(result) == len(tparams))
|
||||||
@ -62,7 +60,7 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
|
|||||||
// If we have type arguments, see how far we get with constraint type inference.
|
// If we have type arguments, see how far we get with constraint type inference.
|
||||||
if len(targs) > 0 && useConstraintTypeInference {
|
if len(targs) > 0 && useConstraintTypeInference {
|
||||||
var index int
|
var index int
|
||||||
targs, index = check.inferB(tparams, targs, report)
|
targs, index = check.inferB(tparams, targs)
|
||||||
if targs == nil || index < 0 {
|
if targs == nil || index < 0 {
|
||||||
return targs
|
return targs
|
||||||
}
|
}
|
||||||
@ -107,9 +105,6 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
errorf := func(kind string, tpar, targ Type, arg *operand) {
|
errorf := func(kind string, tpar, targ Type, arg *operand) {
|
||||||
if !report {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// provide a better error message if we can
|
// provide a better error message if we can
|
||||||
targs, index := u.x.types()
|
targs, index := u.x.types()
|
||||||
if index == 0 {
|
if index == 0 {
|
||||||
@ -176,7 +171,7 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
|
|||||||
// Note that even if we don't have any type arguments, constraint type inference
|
// Note that even if we don't have any type arguments, constraint type inference
|
||||||
// may produce results for constraints that explicitly specify a type.
|
// may produce results for constraints that explicitly specify a type.
|
||||||
if useConstraintTypeInference {
|
if useConstraintTypeInference {
|
||||||
targs, index = check.inferB(tparams, targs, report)
|
targs, index = check.inferB(tparams, targs)
|
||||||
if targs == nil || index < 0 {
|
if targs == nil || index < 0 {
|
||||||
return targs
|
return targs
|
||||||
}
|
}
|
||||||
@ -214,7 +209,7 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
|
|||||||
|
|
||||||
// Again, follow up with constraint type inference.
|
// Again, follow up with constraint type inference.
|
||||||
if useConstraintTypeInference {
|
if useConstraintTypeInference {
|
||||||
targs, index = check.inferB(tparams, targs, report)
|
targs, index = check.inferB(tparams, targs)
|
||||||
if targs == nil || index < 0 {
|
if targs == nil || index < 0 {
|
||||||
return targs
|
return targs
|
||||||
}
|
}
|
||||||
@ -223,9 +218,7 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
|
|||||||
// At least one type argument couldn't be inferred.
|
// At least one type argument couldn't be inferred.
|
||||||
assert(targs != nil && index >= 0 && targs[index] == nil)
|
assert(targs != nil && index >= 0 && targs[index] == nil)
|
||||||
tpar := tparams[index]
|
tpar := tparams[index]
|
||||||
if report {
|
check.errorf(pos, "cannot infer %s (%s) (%s)", tpar.obj.name, tpar.obj.pos, targs)
|
||||||
check.errorf(pos, "cannot infer %s (%s) (%s)", tpar.obj.name, tpar.obj.pos, targs)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -367,7 +360,7 @@ func (w *tpWalker) isParameterizedTypeList(list []Type) bool {
|
|||||||
// first type argument in that list that couldn't be inferred (and thus is nil). If all
|
// first type argument in that list that couldn't be inferred (and thus is nil). If all
|
||||||
// type arguments were inferred successfully, index is < 0. The number of type arguments
|
// type arguments were inferred successfully, index is < 0. The number of type arguments
|
||||||
// provided may be less than the number of type parameters, but there must be at least one.
|
// provided may be less than the number of type parameters, but there must be at least one.
|
||||||
func (check *Checker) inferB(tparams []*TypeParam, targs []Type, report bool) (types []Type, index int) {
|
func (check *Checker) inferB(tparams []*TypeParam, targs []Type) (types []Type, index int) {
|
||||||
assert(len(tparams) >= len(targs) && len(targs) > 0)
|
assert(len(tparams) >= len(targs) && len(targs) > 0)
|
||||||
|
|
||||||
// Setup bidirectional unification between those structural bounds
|
// Setup bidirectional unification between those structural bounds
|
||||||
@ -389,9 +382,7 @@ func (check *Checker) inferB(tparams []*TypeParam, targs []Type, report bool) (t
|
|||||||
sbound := typ.structuralType()
|
sbound := typ.structuralType()
|
||||||
if sbound != nil {
|
if sbound != nil {
|
||||||
if !u.unify(typ, sbound) {
|
if !u.unify(typ, sbound) {
|
||||||
if report {
|
check.errorf(tpar.obj, "%s does not match %s", tpar.obj, sbound)
|
||||||
check.errorf(tpar.obj, "%s does not match %s", tpar.obj, sbound)
|
|
||||||
}
|
|
||||||
return nil, 0
|
return nil, 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user