The gccgo version of the reflect package was incorrectly marking the
results of Value.Call as addressable.  This generally didn't matter,
but it turns out to break a use of the text/template package.  This
patch fixes the problem.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu.  Committed to mainline.

Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE     (revision 234694)
+++ gcc/go/gofrontend/MERGE     (working copy)
@@ -1,4 +1,4 @@
-8edf085a94579bd819a10f50328233812ceeb950
+8e7b5e777333fa4cd070d96e94ea82e3e1132739
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/go/reflect/all_test.go
===================================================================
--- libgo/go/reflect/all_test.go        (revision 234304)
+++ libgo/go/reflect/all_test.go        (working copy)
@@ -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{}
Index: libgo/go/reflect/value.go
===================================================================
--- libgo/go/reflect/value.go   (revision 234304)
+++ libgo/go/reflect/value.go   (working copy)
@@ -433,9 +433,11 @@ func (v Value) call(op string, in []Valu
        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

Reply via email to