summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pkg/reflect/type.go2
-rw-r--r--src/pkg/reflect/value.go5
-rw-r--r--src/pkg/runtime/reflect.cgo6
3 files changed, 12 insertions, 1 deletions
diff --git a/src/pkg/reflect/type.go b/src/pkg/reflect/type.go
index faea24340..a6988d312 100644
--- a/src/pkg/reflect/type.go
+++ b/src/pkg/reflect/type.go
@@ -569,6 +569,8 @@ func (t *StructType) NumField() int { return len(t.fields) }
// Same memory layouts, different method sets.
func toType(i interface{}) Type {
switch v := i.(type) {
+ case nil:
+ return nil
case *runtime.BoolType:
return (*BoolType)(unsafe.Pointer(v))
case *runtime.DotDotDotType:
diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go
index add4c4b03..c71f4dd69 100644
--- a/src/pkg/reflect/value.go
+++ b/src/pkg/reflect/value.go
@@ -906,7 +906,10 @@ func setiface(typ *InterfaceType, x *interface{}, addr addr)
// Set assigns x to v.
func (v *InterfaceValue) Set(x Value) {
- i := x.Interface();
+ var i interface{}
+ if x != nil {
+ i = x.Interface()
+ }
if !v.canSet {
panic(cannotSet)
}
diff --git a/src/pkg/runtime/reflect.cgo b/src/pkg/runtime/reflect.cgo
index 8bef070c5..51222f1c4 100644
--- a/src/pkg/runtime/reflect.cgo
+++ b/src/pkg/runtime/reflect.cgo
@@ -108,5 +108,11 @@ func setiface(typ *byte, x *byte, ret *byte) {
*(Eface*)ret = *(Eface*)x;
return;
}
+ if(((Eface*)x)->type == nil) {
+ // can assign nil to any interface
+ ((Iface*)ret)->tab = nil;
+ ((Iface*)ret)->data = nil;
+ return;
+ }
ifaceE2I((InterfaceType*)gettype(typ), *(Eface*)x, (Iface*)ret);
}