summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-12 22:20:30 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-12 22:20:30 +0000
commit77f97946db2be37864798dc0fec5172dd0409272 (patch)
tree28a9c3f2597188d84f187d5dd61f59b16d9a9a40 /libgo
parentbf32a52dd9c045fcb196ecfc1daef63a0c6fbc80 (diff)
downloadgcc-77f97946db2be37864798dc0fec5172dd0409272.tar.gz
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 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234923 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/reflect/all_test.go6
-rw-r--r--libgo/go/reflect/value.go8
2 files changed, 11 insertions, 3 deletions
diff --git a/libgo/go/reflect/all_test.go b/libgo/go/reflect/all_test.go
index 595d6908f7d..b8e7cd883cb 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 0f0eb846fc2..75944a6e532 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