From 7f8ffa6719e92309130f1f59d4ed6056b0600919 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Tue, 27 Oct 2020 11:24:04 +0100 Subject: [PATCH] interp: handle explicit nil values in literal composite values Fixes #922. --- _test/composite14.go | 15 +++++++++++++++ interp/run.go | 14 +++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 _test/composite14.go diff --git a/_test/composite14.go b/_test/composite14.go new file mode 100644 index 000000000..cf9e212b8 --- /dev/null +++ b/_test/composite14.go @@ -0,0 +1,15 @@ +package main + +import "fmt" + +type T struct { + b []byte +} + +func main() { + t := T{nil} + fmt.Println(t) +} + +// Output: +// {[]} diff --git a/interp/run.go b/interp/run.go index b209af3a6..03c736387 100644 --- a/interp/run.go +++ b/interp/run.go @@ -2104,16 +2104,20 @@ func doComposite(n *node, hasType bool, keyed bool) { val = c fieldIndex = i } - convertLiteralValue(val, typ.field[fieldIndex].typ.TypeOf()) + ft := typ.field[fieldIndex].typ + rft := ft.TypeOf() + convertLiteralValue(val, rft) switch { + case val.typ.cat == nilT: + values[fieldIndex] = func(*frame) reflect.Value { return reflect.New(rft).Elem() } case val.typ.cat == funcT: values[fieldIndex] = genFunctionWrapper(val) case isArray(val.typ) && val.typ.val != nil && val.typ.val.cat == interfaceT: values[fieldIndex] = genValueInterfaceArray(val) - case isRecursiveType(typ.field[fieldIndex].typ, typ.field[fieldIndex].typ.rtype): - values[fieldIndex] = genValueRecursiveInterface(val, typ.field[fieldIndex].typ.rtype) - case isInterface(typ.field[fieldIndex].typ): - values[fieldIndex] = genInterfaceWrapper(val, typ.field[fieldIndex].typ.rtype) + case isRecursiveType(ft, rft): + values[fieldIndex] = genValueRecursiveInterface(val, rft) + case isInterface(ft): + values[fieldIndex] = genInterfaceWrapper(val, rft) default: values[fieldIndex] = genValue(val) }