From 86b0a65b6510d58762f2d5ac10fab2f6d1a2d99b Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Wed, 26 Jun 2013 13:18:31 -0400 Subject: [PATCH] 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 --- ssa/builder.go | 2 +- ssa/emit.go | 3 +-- ssa/interp/testdata/boundmeth.go | 11 +++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ssa/builder.go b/ssa/builder.go index 140969ef..052cb421 100644 --- a/ssa/builder.go +++ b/ssa/builder.go @@ -735,7 +735,7 @@ func (b *builder) expr(fn *Function, e ast.Expr) Value { id := MakeId(e.Sel.Name, fn.Pkg.Types) typ := fn.Pkg.typeOf(e.X) 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. diff --git a/ssa/emit.go b/ssa/emit.go index fdcf6f17..142c2d2a 100644 --- a/ssa/emit.go +++ b/ssa/emit.go @@ -124,8 +124,7 @@ func isValuePreserving(ut_src, ut_dst types.Type) bool { return ok case *types.Signature: - // Conversion between f(T) function and (T) func f() method? - // TODO(adonovan): is this sound? Discuss with gri. + // Conversion from (T) func f() method to f(T) function? _, ok := ut_src.(*types.Signature) return ok } diff --git a/ssa/interp/testdata/boundmeth.go b/ssa/interp/testdata/boundmeth.go index 947737f1..39873858 100644 --- a/ssa/interp/testdata/boundmeth.go +++ b/ssa/interp/testdata/boundmeth.go @@ -79,10 +79,21 @@ func anonStruct() { 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() { valueReceiver() pointerReceiver() addressibleValuePointerReceiver() promotedReceiver() anonStruct() + typeCheck() }