fix: correct convert nil to type pointer (#166)
This commit is contained in:
committed by
Ludovic Fernandez
parent
37f93f0392
commit
e8dfded66b
14
_test/type8.go
Normal file
14
_test/type8.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v := (*time.Time)(nil)
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// <nil>
|
||||||
@@ -1075,10 +1075,10 @@ func (interp *Interpreter) Cfg(root *Node) ([]*Node, error) {
|
|||||||
case n.anc.kind == Field:
|
case n.anc.kind == Field:
|
||||||
// pointer type expression in a field expression (arg or struct field)
|
// pointer type expression in a field expression (arg or struct field)
|
||||||
n.gen = nop
|
n.gen = nop
|
||||||
case n.anc.kind == ParenExpr && n.child[0].sym != nil && n.child[0].sym.kind == Typ:
|
case n.child[0].isType(scope):
|
||||||
// pointer type expression
|
// pointer type expression
|
||||||
n.gen = nop
|
n.gen = nop
|
||||||
n.typ = &Type{cat: PtrT, val: n.child[0].sym.typ}
|
n.typ = &Type{cat: PtrT, val: n.child[0].typ}
|
||||||
default:
|
default:
|
||||||
// dereference expression
|
// dereference expression
|
||||||
wireChild(n)
|
wireChild(n)
|
||||||
|
|||||||
@@ -171,15 +171,25 @@ func typeAssert2(n *Node) {
|
|||||||
|
|
||||||
func convert(n *Node) {
|
func convert(n *Node) {
|
||||||
i := n.findex
|
i := n.findex
|
||||||
var value func(*Frame) reflect.Value
|
c := n.child[1]
|
||||||
if n.child[1].typ.cat == FuncT {
|
|
||||||
value = genNodeWrapper(n.child[1])
|
|
||||||
} else {
|
|
||||||
value = genValue(n.child[1])
|
|
||||||
}
|
|
||||||
typ := n.child[0].typ.TypeOf()
|
typ := n.child[0].typ.TypeOf()
|
||||||
next := getExec(n.tnext)
|
next := getExec(n.tnext)
|
||||||
|
|
||||||
|
if c.kind == BasicLit && c.val == nil { // convert nil to type
|
||||||
|
n.exec = func(f *Frame) Builtin {
|
||||||
|
f.data[i] = reflect.New(typ).Elem()
|
||||||
|
return next
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var value func(*Frame) reflect.Value
|
||||||
|
if c.typ.cat == FuncT {
|
||||||
|
value = genNodeWrapper(c)
|
||||||
|
} else {
|
||||||
|
value = genValue(c)
|
||||||
|
}
|
||||||
|
|
||||||
n.exec = func(f *Frame) Builtin {
|
n.exec = func(f *Frame) Builtin {
|
||||||
f.data[i] = value(f).Convert(typ)
|
f.data[i] = value(f).Convert(typ)
|
||||||
return next
|
return next
|
||||||
|
|||||||
Reference in New Issue
Block a user