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 {