Fix bugs with SetNextStartValueIsOptional and NilValue
Change-Id: I8e62189cb54cdd3634cec8a86fcb36a9a7da6fa0
diff --git a/vdl/pipe.go b/vdl/pipe.go
index 66286b9..8f4df48 100644
--- a/vdl/pipe.go
+++ b/vdl/pipe.go
@@ -209,6 +209,13 @@
}
func (e *pipeEncoder) NilValue(tt *Type) error {
+ switch tt.Kind() {
+ case Any:
+ case Optional:
+ e.SetNextStartValueIsOptional()
+ default:
+ return fmt.Errorf("concrete types disallowed for NilValue (type was %v)", tt)
+ }
if err := e.StartValue(tt); err != nil {
return err
}
diff --git a/vdl/reflect_writer.go b/vdl/reflect_writer.go
index 7ffb27a..236597c 100644
--- a/vdl/reflect_writer.go
+++ b/vdl/reflect_writer.go
@@ -87,7 +87,10 @@
case tt.Kind() == Union && isIface:
// Treat nil Union interface as the zero value of the type at index 0.
return ZeroValue(tt).VDLWrite(enc)
- case tt.Kind() == Optional || tt == AnyType:
+ case tt.Kind() == Optional:
+ enc.SetNextStartValueIsOptional()
+ return enc.NilValue(tt)
+ case tt == AnyType:
return enc.NilValue(tt)
}
return fmt.Errorf("vdl: can't encode nil from non-any non-optional %v", tt)
diff --git a/vdl/value_writer.go b/vdl/value_writer.go
index 4a615e9..63d7d75 100644
--- a/vdl/value_writer.go
+++ b/vdl/value_writer.go
@@ -18,10 +18,10 @@
vv = vv.Elem()
}
if vv.Kind() == Optional {
+ enc.SetNextStartValueIsOptional()
if vv.IsNil() {
return enc.NilValue(vv.Type())
}
- enc.SetNextStartValueIsOptional()
vv = vv.Elem()
}
if err := enc.StartValue(vv.Type()); err != nil {