go.tools/ssa: emit ChangeType when using method as function in f := T.meth.
Previously: typeOf(f).Signature.Recv == T
Now: typeOf(f).Signature.Params.At(0) == T
Added test.
BUG=5781
R=gri
CC=golang-dev
https://golang.org/cl/10622043
This commit is contained in:
parent
b68a029040
commit
86b0a65b65
|
|
@ -735,7 +735,7 @@ func (b *builder) expr(fn *Function, e ast.Expr) Value {
|
||||||
id := MakeId(e.Sel.Name, fn.Pkg.Types)
|
id := MakeId(e.Sel.Name, fn.Pkg.Types)
|
||||||
typ := fn.Pkg.typeOf(e.X)
|
typ := fn.Pkg.typeOf(e.X)
|
||||||
if m := fn.Prog.MethodSet(typ)[id]; m != nil {
|
if m := fn.Prog.MethodSet(typ)[id]; m != nil {
|
||||||
return m
|
return emitConv(fn, m, fn.Pkg.typeOf(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
// T must be an interface; return wrapper.
|
// T must be an interface; return wrapper.
|
||||||
|
|
|
||||||
|
|
@ -124,8 +124,7 @@ func isValuePreserving(ut_src, ut_dst types.Type) bool {
|
||||||
return ok
|
return ok
|
||||||
|
|
||||||
case *types.Signature:
|
case *types.Signature:
|
||||||
// Conversion between f(T) function and (T) func f() method?
|
// Conversion from (T) func f() method to f(T) function?
|
||||||
// TODO(adonovan): is this sound? Discuss with gri.
|
|
||||||
_, ok := ut_src.(*types.Signature)
|
_, ok := ut_src.(*types.Signature)
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,10 +79,21 @@ func anonStruct() {
|
||||||
assert(get() == 3)
|
assert(get() == 3)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func typeCheck() {
|
||||||
|
var i interface{}
|
||||||
|
i = (*S).incr
|
||||||
|
_ = i.(func(*S)) // type assertion: receiver type prepended to params
|
||||||
|
|
||||||
|
var s S
|
||||||
|
i = s.incr
|
||||||
|
_ = i.(func()) // type assertion: receiver type disappears
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
valueReceiver()
|
valueReceiver()
|
||||||
pointerReceiver()
|
pointerReceiver()
|
||||||
addressibleValuePointerReceiver()
|
addressibleValuePointerReceiver()
|
||||||
promotedReceiver()
|
promotedReceiver()
|
||||||
anonStruct()
|
anonStruct()
|
||||||
|
typeCheck()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue