diff --git a/_test/interface27.go b/_test/interface27.go new file mode 100644 index 00000000..34fbe935 --- /dev/null +++ b/_test/interface27.go @@ -0,0 +1,12 @@ +package main + +import "fmt" + +var errs = map[int]error{0: nil} + +func main() { + fmt.Println(errs) +} + +// Output: +// map[0:] diff --git a/_test/interface28.go b/_test/interface28.go new file mode 100644 index 00000000..7bf8ce2c --- /dev/null +++ b/_test/interface28.go @@ -0,0 +1,12 @@ +package main + +import "fmt" + +var errs = []error{nil} + +func main() { + fmt.Println(errs) +} + +// Output: +// [] diff --git a/interp/run.go b/interp/run.go index dfb5d3f1..cd37598a 100644 --- a/interp/run.go +++ b/interp/run.go @@ -2393,14 +2393,16 @@ func recv2(n *node) { } func convertLiteralValue(n *node, t reflect.Type) { - // Skip non-constant values, undefined target type or interface target type. - if !(n.kind == basicLit || n.rval.IsValid()) || t == nil || t.Kind() == reflect.Interface { - return - } - if n.rval.IsValid() { + switch { + case n.typ.cat == nilT: + // Create a zero value of target type. + n.rval = reflect.New(t).Elem() + case !(n.kind == basicLit || n.rval.IsValid()) || t == nil || t.Kind() == reflect.Interface: + // Skip non-constant values, undefined target type or interface target type. + case n.rval.IsValid(): // Convert constant value to target type. n.rval = n.rval.Convert(t) - } else { + default: // Create a zero value of target type. n.rval = reflect.New(t).Elem() }