Skip to content

Commit

Permalink
go/types, types2: explicitly look for nil type arguments in infer
Browse files Browse the repository at this point in the history
Don't assume we have all type arguments if the number of type arguments
matches the number of type parameters. Instead, look explicitly for nil
type arguments in the provided targs.

Preparation for type inference with type arguments provided for type
parameters of generic function arguments passed to other functions.

For #59338.

Change-Id: I00918cd5ed06ae3277b4e41a3641063e0f53fef0
Reviewed-on: https://go-review.googlesource.com/c/go/+/494115
Reviewed-by: Robert Griesemer <[email protected]>
Run-TryBot: Robert Griesemer <[email protected]>
Reviewed-by: Robert Findley <[email protected]>
Auto-Submit: Robert Griesemer <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
  • Loading branch information
griesemer authored and gopherbot committed May 10, 2023
1 parent 607a045 commit d9dce0c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 14 deletions.
20 changes: 13 additions & 7 deletions src/cmd/compile/internal/types2/infer.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,7 @@ const enableReverseTypeInference = true // disable for debugging
func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type, params *Tuple, args []*operand) (inferred []Type) {
if debug {
defer func() {
assert(inferred == nil || len(inferred) == len(tparams))
for _, targ := range inferred {
assert(targ != nil)
}
assert(inferred == nil || len(inferred) == len(tparams) && !containsNil(inferred))
}()
}

Expand All @@ -47,14 +44,13 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
n := len(tparams)
assert(n > 0 && len(targs) <= n)

// Function parameters and arguments must match in number.
// Parameters and arguments must match in number.
assert(params.Len() == len(args))

// If we already have all type arguments, we're done.
if len(targs) == n {
if len(targs) == n && !containsNil(targs) {
return targs
}
// len(targs) < n

// Make sure we have a "full" list of type arguments, some of which may
// be nil (unknown). Make a copy so as to not clobber the incoming slice.
Expand Down Expand Up @@ -440,6 +436,16 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
return
}

// containsNil reports whether list contains a nil entry.
func containsNil(list []Type) bool {
for _, t := range list {
if t == nil {
return true
}
}
return false
}

// renameTParams renames the type parameters in the given type such that each type
// parameter is given a new identity. renameTParams returns the new type parameters
// and updated type. If the result type is unchanged from the argument type, none
Expand Down
20 changes: 13 additions & 7 deletions src/go/types/infer.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit d9dce0c

Please sign in to comment.