diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-04-12 22:20:30 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-04-12 22:20:30 +0000 |
commit | d90936ff88545c9312a0137725a9b1ab0919ad48 (patch) | |
tree | 28a9c3f2597188d84f187d5dd61f59b16d9a9a40 /libgo/go/reflect | |
parent | 8a434ada27c0dfd6f3e8dcdb9bb2e806f14cec99 (diff) | |
download | gcc-d90936ff88545c9312a0137725a9b1ab0919ad48.zip gcc-d90936ff88545c9312a0137725a9b1ab0919ad48.tar.gz gcc-d90936ff88545c9312a0137725a9b1ab0919ad48.tar.bz2 |
reflect: change Value.Call results to not be addressable
Leaving them incorrectly marked as addressable broke a use of the
text/template package, because state.evalField checks CanAddr and takes
the address if it is addressable.
Reviewed-on: https://go-review.googlesource.com/21908
From-SVN: r234923
Diffstat (limited to 'libgo/go/reflect')
-rw-r--r-- | libgo/go/reflect/all_test.go | 6 | ||||
-rw-r--r-- | libgo/go/reflect/value.go | 8 |
2 files changed, 11 insertions, 3 deletions
diff --git a/libgo/go/reflect/all_test.go b/libgo/go/reflect/all_test.go index 595d690..b8e7cd8 100644 --- a/libgo/go/reflect/all_test.go +++ b/libgo/go/reflect/all_test.go @@ -1478,6 +1478,12 @@ func TestFunc(t *testing.T) { if i != 10 || j != 20 || k != 30 || l != (two{40, 50}) || m != 60 || n != 70 || o != 80 { t.Errorf("Call returned %d, %d, %d, %v, %d, %g, %d; want 10, 20, 30, [40, 50], 60, 70, 80", i, j, k, l, m, n, o) } + + for i, v := range ret { + if v.CanAddr() { + t.Errorf("result %d is addressable", i) + } + } } type emptyStruct struct{} diff --git a/libgo/go/reflect/value.go b/libgo/go/reflect/value.go index 0f0eb84..75944a6 100644 --- a/libgo/go/reflect/value.go +++ b/libgo/go/reflect/value.go @@ -433,9 +433,11 @@ func (v Value) call(op string, in []Value) []Value { ret := make([]Value, nout) results := make([]unsafe.Pointer, nout) for i := 0; i < nout; i++ { - v := New(t.Out(i)) - results[i] = unsafe.Pointer(v.Pointer()) - ret[i] = Indirect(v) + tv := t.Out(i) + v := New(tv) + results[i] = v.pointer() + fl := flagIndir | flag(tv.Kind()) + ret[i] = Value{tv.common(), v.pointer(), fl} } var pp *unsafe.Pointer |