1
0
mirror of https://github.com/golang/go synced 2024-11-26 09:38:10 -07:00

cmd/compile/internal/types2: review of call.go

The changes between (equivalent, and reviewed) go/types/call.go
and call.go can be seen by comparing patchset 1 and 2. The actual
changes are removing the "// UNREVIEWED" marker, renaming of
sig_params to sigParams, and a couple of comment adjustments.
These additional changes reduce the difference between this
file and the go/types version.

Note that the verification pass using a MethodSet doesn't
exist because there's no MethodSet in types2.

Change-Id: I4d49460e0457401ed705dff5cfd17c9ff259d89f
Reviewed-on: https://go-review.googlesource.com/c/go/+/300998
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2021-03-11 18:23:30 -08:00
parent 7a1e963058
commit 68f8e1af29

View File

@ -1,4 +1,3 @@
// UNREVIEWED
// Copyright 2013 The Go Authors. All rights reserved. // Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -324,8 +323,8 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, args []*o
ddd := call.HasDots ddd := call.HasDots
// set up parameters // set up parameters
sig_params := sig.params // adjusted for variadic functions (may be nil for empty parameter lists!) sigParams := sig.params // adjusted for variadic functions (may be nil for empty parameter lists!)
adjusted := false // indicates if sig_params is different from t.params adjusted := false // indicates if sigParams is different from t.params
if sig.variadic { if sig.variadic {
if ddd { if ddd {
// variadic_func(a, b, c...) // variadic_func(a, b, c...)
@ -348,7 +347,7 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, args []*o
for len(vars) < nargs { for len(vars) < nargs {
vars = append(vars, NewParam(last.pos, last.pkg, last.name, typ)) vars = append(vars, NewParam(last.pos, last.pkg, last.name, typ))
} }
sig_params = NewTuple(vars...) // possibly nil! sigParams = NewTuple(vars...) // possibly nil!
adjusted = true adjusted = true
npars = nargs npars = nargs
} else { } else {
@ -380,7 +379,7 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, args []*o
if len(sig.tparams) > 0 { if len(sig.tparams) > 0 {
// 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, failed := check.infer(sig.tparams, sig_params, args) targs, failed := check.infer(sig.tparams, sigParams, args)
if targs == nil { if targs == nil {
return // error already reported return // error already reported
} }
@ -419,15 +418,15 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, args []*o
// need to compute it from the adjusted list; otherwise we can // need to compute it from the adjusted list; otherwise we can
// simply use the result signature's parameter list. // simply use the result signature's parameter list.
if adjusted { if adjusted {
sig_params = check.subst(call.Pos(), sig_params, makeSubstMap(sig.tparams, targs)).(*Tuple) sigParams = check.subst(call.Pos(), sigParams, makeSubstMap(sig.tparams, targs)).(*Tuple)
} else { } else {
sig_params = rsig.params sigParams = rsig.params
} }
} }
// check arguments // check arguments
for i, a := range args { for i, a := range args {
check.assignment(a, sig_params.vars[i].typ, "argument") check.assignment(a, sigParams.vars[i].typ, "argument")
} }
return return
@ -597,9 +596,9 @@ func (check *Checker) selector(x *operand, e *syntax.SelectorExpr) {
if m, _ := obj.(*Func); m != nil { if m, _ := obj.(*Func); m != nil {
// check.dump("### found method %s", m) // check.dump("### found method %s", m)
check.objDecl(m, nil) check.objDecl(m, nil)
// If m has a parameterized receiver type, infer the type arguments // If m has a parameterized receiver type, infer the type arguments from
// from the actual receiver provided and then substitute the type // the actual receiver provided and then substitute the type parameters in
// parameters accordingly. // the signature accordingly.
// TODO(gri) factor this code out // TODO(gri) factor this code out
sig := m.typ.(*Signature) sig := m.typ.(*Signature)
if len(sig.rparams) > 0 { if len(sig.rparams) > 0 {
@ -610,7 +609,7 @@ func (check *Checker) selector(x *operand, e *syntax.SelectorExpr) {
// Traverse the embedding to find that type (issue #44688). // Traverse the embedding to find that type (issue #44688).
recv := x.typ recv := x.typ
for i := 0; i < len(index)-1; i++ { for i := 0; i < len(index)-1; i++ {
// The embedded type is always a struct or a pointer to // The embedded type is either a struct or a pointer to
// a struct except for the last one (which we don't need). // a struct except for the last one (which we don't need).
recv = asStruct(derefStructPtr(recv)).Field(index[i]).typ recv = asStruct(derefStructPtr(recv)).Field(index[i]).typ
} }
@ -633,7 +632,8 @@ func (check *Checker) selector(x *operand, e *syntax.SelectorExpr) {
if failed >= 0 { if failed >= 0 {
// We may reach here if there were other errors (see issue #40056). // We may reach here if there were other errors (see issue #40056).
// check.infer will report a follow-up error. // check.infer will report a follow-up error.
// TODO(gri) avoid the follow-up error as it is confusing (there's no inference in the source code) // TODO(gri) avoid the follow-up error as it is confusing
// (there's no inference in the source code)
goto Error goto Error
} }
// Don't modify m. Instead - for now - make a copy of m and use that instead. // Don't modify m. Instead - for now - make a copy of m and use that instead.