mirror of https://github.com/golang/go.git
[dev.typeparams] cmd/compile/internal/types2: provide valid signature in errors involving method expressions
This is an adjusted port of a similar fix in https://golang.org/cl/324733. Fixes #46583. Change-Id: Ica1410e4de561e64e58b753e3da04b32156cbaf6 Reviewed-on: https://go-review.googlesource.com/c/go/+/325369 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
74d46381b2
commit
0c40cb4a07
|
|
@ -582,13 +582,27 @@ func (check *Checker) selector(x *operand, e *syntax.SelectorExpr) {
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// the receiver type becomes the type of the first function
|
// The receiver type becomes the type of the first function
|
||||||
// argument of the method expression's function type
|
// argument of the method expression's function type.
|
||||||
var params []*Var
|
var params []*Var
|
||||||
if sig.params != nil {
|
if sig.params != nil {
|
||||||
params = sig.params.vars
|
params = sig.params.vars
|
||||||
}
|
}
|
||||||
params = append([]*Var{NewVar(sig.recv.pos, sig.recv.pkg, sig.recv.name, x.typ)}, params...)
|
// Be consistent about named/unnamed parameters. This is not needed
|
||||||
|
// for type-checking, but the newly constructed signature may appear
|
||||||
|
// in an error message and then have mixed named/unnamed parameters.
|
||||||
|
// (An alternative would be to not print parameter names in errors,
|
||||||
|
// but it's useful to see them; this is cheap and method expressions
|
||||||
|
// are rare.)
|
||||||
|
name := ""
|
||||||
|
if len(params) > 0 && params[0].name != "" {
|
||||||
|
// name needed
|
||||||
|
name = sig.recv.name
|
||||||
|
if name == "" {
|
||||||
|
name = "_"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
params = append([]*Var{NewVar(sig.recv.pos, sig.recv.pkg, name, x.typ)}, params...)
|
||||||
x.mode = value
|
x.mode = value
|
||||||
x.typ = &Signature{
|
x.typ = &Signature{
|
||||||
tparams: sig.tparams,
|
tparams: sig.tparams,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
// 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 T1 struct{}
|
||||||
|
func (t T1) m(int) {}
|
||||||
|
var f1 func(T1)
|
||||||
|
|
||||||
|
type T2 struct{}
|
||||||
|
func (t T2) m(x int) {}
|
||||||
|
var f2 func(T2)
|
||||||
|
|
||||||
|
type T3 struct{}
|
||||||
|
func (T3) m(int) {}
|
||||||
|
var f3 func(T3)
|
||||||
|
|
||||||
|
type T4 struct{}
|
||||||
|
func (T4) m(x int) {}
|
||||||
|
var f4 func(T4)
|
||||||
|
|
||||||
|
func _() {
|
||||||
|
f1 = T1 /* ERROR func\(T1, int\) */ .m
|
||||||
|
f2 = T2 /* ERROR func\(t T2, x int\) */ .m
|
||||||
|
f3 = T3 /* ERROR func\(T3, int\) */ .m
|
||||||
|
f4 = T4 /* ERROR func\(_ T4, x int\) */ .m
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue