From 29e1777d820d30f3c04b08d8fdde49b2400b4810 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 16 Apr 2020 12:24:04 +0200 Subject: [PATCH] fix: assign composite literal by reference --- _test/composite8.go | 16 ++++++++++++++++ interp/run.go | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 _test/composite8.go diff --git a/_test/composite8.go b/_test/composite8.go new file mode 100644 index 00000000..f69cdc88 --- /dev/null +++ b/_test/composite8.go @@ -0,0 +1,16 @@ +package main + +type T struct{ I int } + +func main() { + t := []*T{} + s := []int{1, 2} + for _, e := range s { + x := &T{e} + t = append(t, x) + } + println(t[0].I, t[1].I) +} + +// Output: +// 1 2 diff --git a/interp/run.go b/interp/run.go index 48b0f04d..6b2b4fc9 100644 --- a/interp/run.go +++ b/interp/run.go @@ -1732,6 +1732,7 @@ func doCompositeLit(n *node, hasType bool) { } } + i := n.findex n.exec = func(f *frame) bltn { a := reflect.New(n.typ.TypeOf()).Elem() for i, v := range values { @@ -1743,7 +1744,7 @@ func doCompositeLit(n *node, hasType bool) { case destInterface: d.Set(reflect.ValueOf(valueInterface{n, a})) default: - d.Set(a) + f.data[i] = a } return next }