diff --git a/test/fortune/fortune.vdl.go b/test/fortune/fortune.vdl.go
index c983508..f5195a0 100644
--- a/test/fortune/fortune.vdl.go
+++ b/test/fortune/fortune.vdl.go
@@ -42,70 +42,58 @@
 		return err
 	}
 
-	var2 := (m.Str == "")
-	if !var2 {
-		keyTarget3, fieldTarget4, err := fieldsTarget1.StartField("Str")
-		if err != vdl.ErrFieldNoExist && err != nil {
+	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Str")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+		if err := fieldTarget3.FromString(string(m.Str), vdl.StringType); err != nil {
 			return err
 		}
-		if err != vdl.ErrFieldNoExist {
-			if err := fieldTarget4.FromString(string(m.Str), vdl.StringType); err != nil {
-				return err
-			}
-			if err := fieldsTarget1.FinishField(keyTarget3, fieldTarget4); err != nil {
-				return err
-			}
-		}
-	}
-	var5 := (m.Num == int32(0))
-	if !var5 {
-		keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("Num")
-		if err != vdl.ErrFieldNoExist && err != nil {
+		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
 		}
-		if err != vdl.ErrFieldNoExist {
-			if err := fieldTarget7.FromInt(int64(m.Num), vdl.Int32Type); err != nil {
-				return err
-			}
-			if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
-				return err
-			}
-		}
 	}
-	var var8 bool
-	if len(m.List) == 0 {
-		var8 = true
+	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("Num")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
 	}
-	if !var8 {
-		keyTarget9, fieldTarget10, err := fieldsTarget1.StartField("List")
-		if err != vdl.ErrFieldNoExist && err != nil {
+	if err != vdl.ErrFieldNoExist {
+		if err := fieldTarget5.FromInt(int64(m.Num), vdl.Int32Type); err != nil {
 			return err
 		}
-		if err != vdl.ErrFieldNoExist {
+		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
+			return err
+		}
+	}
+	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("List")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
 
-			listTarget11, err := fieldTarget10.StartList(__VDLTypefortune1, len(m.List))
+		listTarget8, err := fieldTarget7.StartList(__VDLTypefortune1, len(m.List))
+		if err != nil {
+			return err
+		}
+		for i, elem10 := range m.List {
+			elemTarget9, err := listTarget8.StartElem(i)
 			if err != nil {
 				return err
 			}
-			for i, elem13 := range m.List {
-				elemTarget12, err := listTarget11.StartElem(i)
-				if err != nil {
-					return err
-				}
-				if err := elemTarget12.FromUint(uint64(elem13), vdl.Uint32Type); err != nil {
-					return err
-				}
-				if err := listTarget11.FinishElem(elemTarget12); err != nil {
-					return err
-				}
-			}
-			if err := fieldTarget10.FinishList(listTarget11); err != nil {
+			if err := elemTarget9.FromUint(uint64(elem10), vdl.Uint32Type); err != nil {
 				return err
 			}
-			if err := fieldsTarget1.FinishField(keyTarget9, fieldTarget10); err != nil {
+			if err := listTarget8.FinishElem(elemTarget9); err != nil {
 				return err
 			}
 		}
+		if err := fieldTarget7.FinishList(listTarget8); err != nil {
+			return err
+		}
+		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
+			return err
+		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
 		return err
@@ -117,21 +105,6 @@
 	return nil
 }
 
-func (m *ComplexErrorParam) IsZero() bool {
-
-	var1 := true
-	var2 := (m.Str == "")
-	var1 = var1 && var2
-	var3 := (m.Num == int32(0))
-	var1 = var1 && var3
-	var var4 bool
-	if len(m.List) == 0 {
-		var4 = true
-	}
-	var1 = var1 && var4
-	return var1
-}
-
 func init() {
 	vdl.Register((*ComplexErrorParam)(nil))
 }
