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