diff mbox

libgo patch committed: Fix Value.Call results to not be addressable

Message ID CAOyqgcXTTPpfaSF+OBDkpTF5x0B00a3KvXd-tsdUVCpqch97dg@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor April 12, 2016, 10:20 p.m. UTC
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
diff mbox

Patch

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