[fidl][go] Get all GIDL sandwich tests to pass

It mostly boiled down to handling nullable xunions properly. Simplified
and removed duplicated code in the process.

Re-gen of the GIDL conformance tests.

Test: GIDL conformance tests
Change-Id: If001db4dc0880a29ceb4a0520c43e81f77adecc5
diff --git a/src/syscall/zx/fidl/conformance/impl.go b/src/syscall/zx/fidl/conformance/impl.go
index cfd9ae0..df5665f 100644
--- a/src/syscall/zx/fidl/conformance/impl.go
+++ b/src/syscall/zx/fidl/conformance/impl.go
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// GENERATED FILE: Do not edit!
-//
-// To rebuild this file, invoke third_party/go/regen-fidl.
+// Code generated by tools/fidl/gidl-conformance-suite/regen.sh; DO NOT EDIT.
 
 // +build fuchsia
 
+//
+// Code generated by fidlgen; DO NOT EDIT.
+
 package conformance
 
 import (
@@ -15,6 +16,340 @@
 	_bindings "syscall/zx/fidl"
 )
 
+type UnionWithBoundStringStruct struct {
+	_ struct{}             `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	V UnionWithBoundString `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mUnionWithBoundStringStruct = _bindings.CreateLazyMarshaler(UnionWithBoundStringStruct{})
+
+func (msg *UnionWithBoundStringStruct) Marshaler() _bindings.Marshaler {
+	return _mUnionWithBoundStringStruct
+}
+
+type SingleVariantUnionStruct struct {
+	_ struct{}           `fidl:"s,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	U SingleVariantUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mSingleVariantUnionStruct = _bindings.CreateLazyMarshaler(SingleVariantUnionStruct{})
+
+func (msg *SingleVariantUnionStruct) Marshaler() _bindings.Marshaler {
+	return _mSingleVariantUnionStruct
+}
+
+type SandwichUnionSize8Alignment4 struct {
+	_      struct{}             `fidl:"s,16,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before uint32               `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Value  UnionSize8Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After  uint32               `fidl:"12" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+}
+
+var _mSandwichUnionSize8Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize8Alignment4{})
+
+func (msg *SandwichUnionSize8Alignment4) Marshaler() _bindings.Marshaler {
+	return _mSandwichUnionSize8Alignment4
+}
+
+type SandwichUnionSize12Alignment4 struct {
+	_      struct{}              `fidl:"s,20,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Value  UnionSize12Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After  uint32                `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+}
+
+var _mSandwichUnionSize12Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize12Alignment4{})
+
+func (msg *SandwichUnionSize12Alignment4) Marshaler() _bindings.Marshaler {
+	return _mSandwichUnionSize12Alignment4
+}
+
+type StructSize16Alignment8 struct {
+	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	F2 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+}
+
+var _mStructSize16Alignment8 = _bindings.CreateLazyMarshaler(StructSize16Alignment8{})
+
+func (msg *StructSize16Alignment8) Marshaler() _bindings.Marshaler {
+	return _mStructSize16Alignment8
+}
+
+type SandwichUnionSize24Alignment8 struct {
+	_      struct{}              `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Value  UnionSize24Alignment8 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After  uint32                `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+}
+
+var _mSandwichUnionSize24Alignment8 = _bindings.CreateLazyMarshaler(SandwichUnionSize24Alignment8{})
+
+func (msg *SandwichUnionSize24Alignment8) Marshaler() _bindings.Marshaler {
+	return _mSandwichUnionSize24Alignment8
+}
+
+type SandwichUnionSize36Alignment4 struct {
+	_      struct{}              `fidl:"s,44,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Value  UnionSize36Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After  uint32                `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+}
+
+var _mSandwichUnionSize36Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize36Alignment4{})
+
+func (msg *SandwichUnionSize36Alignment4) Marshaler() _bindings.Marshaler {
+	return _mSandwichUnionSize36Alignment4
+}
+
+type Length2StringWrapper struct {
+	_             struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Length2String string   `fidl:"0,2" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mLength2StringWrapper = _bindings.CreateLazyMarshaler(Length2StringWrapper{})
+
+func (msg *Length2StringWrapper) Marshaler() _bindings.Marshaler {
+	return _mLength2StringWrapper
+}
+
+type StringWrapper struct {
+	_   struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Str string   `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStringWrapper = _bindings.CreateLazyMarshaler(StringWrapper{})
+
+func (msg *StringWrapper) Marshaler() _bindings.Marshaler {
+	return _mStringWrapper
+}
+
+type TestXUnionInTable struct {
+	_     struct{}      `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Value XUnionInTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mTestXUnionInTable = _bindings.CreateLazyMarshaler(TestXUnionInTable{})
+
+func (msg *TestXUnionInTable) Marshaler() _bindings.Marshaler {
+	return _mTestXUnionInTable
+}
+
+type InterfaceConfig struct {
+	_               struct{}        `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Name            string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	IpAddressConfig IpAddressConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+}
+
+var _mInterfaceConfig = _bindings.CreateLazyMarshaler(InterfaceConfig{})
+
+func (msg *InterfaceConfig) Marshaler() _bindings.Marshaler {
+	return _mInterfaceConfig
+}
+
+type TestAddEthernetDeviceRequest struct {
+	_                   struct{}        `fidl:"s,72,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
+	TopologicalPath     string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Config              InterfaceConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+	ThisShouldBeAHandle uint32          `fidl:"64" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
+}
+
+var _mTestAddEthernetDeviceRequest = _bindings.CreateLazyMarshaler(TestAddEthernetDeviceRequest{})
+
+func (msg *TestAddEthernetDeviceRequest) Marshaler() _bindings.Marshaler {
+	return _mTestAddEthernetDeviceRequest
+}
+
+type NodeAttributes struct {
+	_                struct{} `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
+	Mode             uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Id               uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	ContentSize      uint64   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+	StorageSize      uint64   `fidl:"24" fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
+	LinkCount        uint64   `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+	CreationTime     uint64   `fidl:"40" fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
+	ModificationTime uint64   `fidl:"48" fidl_offset_v1:"48" fidl_offset_v1_no_ee:"48"`
+}
+
+var _mNodeAttributes = _bindings.CreateLazyMarshaler(NodeAttributes{})
+
+func (msg *NodeAttributes) Marshaler() _bindings.Marshaler {
+	return _mNodeAttributes
+}
+
+type FileGetAttrResponse struct {
+	_          struct{}       `fidl:"s,64,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
+	S          int32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Attributes NodeAttributes `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+}
+
+var _mFileGetAttrResponse = _bindings.CreateLazyMarshaler(FileGetAttrResponse{})
+
+func (msg *FileGetAttrResponse) Marshaler() _bindings.Marshaler {
+	return _mFileGetAttrResponse
+}
+
+type StructOfSimpleTable struct {
+	_     struct{}    `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Table SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStructOfSimpleTable = _bindings.CreateLazyMarshaler(StructOfSimpleTable{})
+
+func (msg *StructOfSimpleTable) Marshaler() _bindings.Marshaler {
+	return _mStructOfSimpleTable
+}
+
+type SimpleTableThenUint64 struct {
+	_      struct{}    `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Table  SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Number uint64      `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+}
+
+var _mSimpleTableThenUint64 = _bindings.CreateLazyMarshaler(SimpleTableThenUint64{})
+
+func (msg *SimpleTableThenUint64) Marshaler() _bindings.Marshaler {
+	return _mSimpleTableThenUint64
+}
+
+type StructOfTableWithStringAndVector struct {
+	_     struct{}                 `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Table TableWithStringAndVector `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStructOfTableWithStringAndVector = _bindings.CreateLazyMarshaler(StructOfTableWithStringAndVector{})
+
+func (msg *StructOfTableWithStringAndVector) Marshaler() _bindings.Marshaler {
+	return _mStructOfTableWithStringAndVector
+}
+
+type Int64Struct struct {
+	_ struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
+	X int64    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mInt64Struct = _bindings.CreateLazyMarshaler(Int64Struct{})
+
+func (msg *Int64Struct) Marshaler() _bindings.Marshaler {
+	return _mInt64Struct
+}
+
+type TestInlineXUnionInStruct struct {
+	_      struct{}     `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
+	Before string       `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Xu     SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+	After  string       `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
+}
+
+var _mTestInlineXUnionInStruct = _bindings.CreateLazyMarshaler(TestInlineXUnionInStruct{})
+
+func (msg *TestInlineXUnionInStruct) Marshaler() _bindings.Marshaler {
+	return _mTestInlineXUnionInStruct
+}
+
+type TestOptionalXUnionInStruct struct {
+	_      struct{}      `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
+	Before string        `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Xu     *SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+	After  string        `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
+}
+
+var _mTestOptionalXUnionInStruct = _bindings.CreateLazyMarshaler(TestOptionalXUnionInStruct{})
+
+func (msg *TestOptionalXUnionInStruct) Marshaler() _bindings.Marshaler {
+	return _mTestOptionalXUnionInStruct
+}
+
+type TestStrictXUnionInStruct struct {
+	_  struct{}           `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Xu SampleStrictXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mTestStrictXUnionInStruct = _bindings.CreateLazyMarshaler(TestStrictXUnionInStruct{})
+
+func (msg *TestStrictXUnionInStruct) Marshaler() _bindings.Marshaler {
+	return _mTestStrictXUnionInStruct
+}
+
+type TestFlexibleXUnionInStruct struct {
+	_  struct{}     `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Xu SampleXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mTestFlexibleXUnionInStruct = _bindings.CreateLazyMarshaler(TestFlexibleXUnionInStruct{})
+
+func (msg *TestFlexibleXUnionInStruct) Marshaler() _bindings.Marshaler {
+	return _mTestFlexibleXUnionInStruct
+}
+
+type StructWithOptionals struct {
+	_   struct{}               `fidl:"s,104,8" fidl_size_v1:"128" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"128" fidl_alignment_v1_no_ee:"8"`
+	S   EmptyStruct            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	S2  *EmptyStruct           `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	T   TableWithEmptyStruct   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+	Xu  XUnionWithEmptyStruct  `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+	Xu2 *XUnionWithEmptyStruct `fidl:"56" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
+	U   UnionWithEmptyStruct   `fidl:"80" fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
+	U2  *UnionWithEmptyStruct  `fidl:"96" fidl_offset_v1:"104" fidl_offset_v1_no_ee:"104"`
+}
+
+var _mStructWithOptionals = _bindings.CreateLazyMarshaler(StructWithOptionals{})
+
+func (msg *StructWithOptionals) Marshaler() _bindings.Marshaler {
+	return _mStructWithOptionals
+}
+
+type EmptyStruct struct {
+	_ struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
+}
+
+var _mEmptyStruct = _bindings.CreateLazyMarshaler(EmptyStruct{})
+
+func (msg *EmptyStruct) Marshaler() _bindings.Marshaler {
+	return _mEmptyStruct
+}
+
+type EmptyStructSandwich struct {
+	_      struct{}    `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before string      `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	Es     EmptyStruct `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+	After  string      `fidl:"24," fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
+}
+
+var _mEmptyStructSandwich = _bindings.CreateLazyMarshaler(EmptyStructSandwich{})
+
+func (msg *EmptyStructSandwich) Marshaler() _bindings.Marshaler {
+	return _mEmptyStructSandwich
+}
+
+type Uint8Uint16Uint32Uint64 struct {
+	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	F1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	F2 uint16   `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
+	F3 uint32   `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
+	F4 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+}
+
+var _mUint8Uint16Uint32Uint64 = _bindings.CreateLazyMarshaler(Uint8Uint16Uint32Uint64{})
+
+func (msg *Uint8Uint16Uint32Uint64) Marshaler() _bindings.Marshaler {
+	return _mUint8Uint16Uint32Uint64
+}
+
+type Uint64Uint32Uint16Uint8 struct {
+	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	F2 uint32   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	F3 uint16   `fidl:"12" fidl_offset_v1:"12" fidl_offset_v1_no_ee:"12"`
+	F4 uint8    `fidl:"14" fidl_offset_v1:"14" fidl_offset_v1_no_ee:"14"`
+}
+
+var _mUint64Uint32Uint16Uint8 = _bindings.CreateLazyMarshaler(Uint64Uint32Uint16Uint8{})
+
+func (msg *Uint64Uint32Uint16Uint8) Marshaler() _bindings.Marshaler {
+	return _mUint64Uint32Uint16Uint8
+}
+
 type ThreeByte struct {
 	_     struct{} `fidl:"s,3,1" fidl_size_v1:"3" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"3" fidl_alignment_v1_no_ee:"1"`
 	Elem1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
@@ -154,88 +489,6 @@
 	return _mStructWithVectors
 }
 
-type TestXUnionInTable struct {
-	_     struct{}      `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	Value XUnionInTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-}
-
-var _mTestXUnionInTable = _bindings.CreateLazyMarshaler(TestXUnionInTable{})
-
-func (msg *TestXUnionInTable) Marshaler() _bindings.Marshaler {
-	return _mTestXUnionInTable
-}
-
-type InterfaceConfig struct {
-	_               struct{}        `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
-	Name            string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	IpAddressConfig IpAddressConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-}
-
-var _mInterfaceConfig = _bindings.CreateLazyMarshaler(InterfaceConfig{})
-
-func (msg *InterfaceConfig) Marshaler() _bindings.Marshaler {
-	return _mInterfaceConfig
-}
-
-type TestAddEthernetDeviceRequest struct {
-	_                   struct{}        `fidl:"s,72,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
-	TopologicalPath     string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Config              InterfaceConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-	ThisShouldBeAHandle uint32          `fidl:"64" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
-}
-
-var _mTestAddEthernetDeviceRequest = _bindings.CreateLazyMarshaler(TestAddEthernetDeviceRequest{})
-
-func (msg *TestAddEthernetDeviceRequest) Marshaler() _bindings.Marshaler {
-	return _mTestAddEthernetDeviceRequest
-}
-
-type NodeAttributes struct {
-	_                struct{} `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
-	Mode             uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Id               uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-	ContentSize      uint64   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-	StorageSize      uint64   `fidl:"24" fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
-	LinkCount        uint64   `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
-	CreationTime     uint64   `fidl:"40" fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
-	ModificationTime uint64   `fidl:"48" fidl_offset_v1:"48" fidl_offset_v1_no_ee:"48"`
-}
-
-var _mNodeAttributes = _bindings.CreateLazyMarshaler(NodeAttributes{})
-
-func (msg *NodeAttributes) Marshaler() _bindings.Marshaler {
-	return _mNodeAttributes
-}
-
-type FileGetAttrResponse struct {
-	_          struct{}       `fidl:"s,64,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
-	S          int32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Attributes NodeAttributes `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-}
-
-var _mFileGetAttrResponse = _bindings.CreateLazyMarshaler(FileGetAttrResponse{})
-
-func (msg *FileGetAttrResponse) Marshaler() _bindings.Marshaler {
-	return _mFileGetAttrResponse
-}
-
-type StructWithOptionals struct {
-	_   struct{}               `fidl:"s,104,8" fidl_size_v1:"128" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"128" fidl_alignment_v1_no_ee:"8"`
-	S   EmptyStruct            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	S2  *EmptyStruct           `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-	T   TableWithEmptyStruct   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-	Xu  XUnionWithEmptyStruct  `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
-	Xu2 *XUnionWithEmptyStruct `fidl:"56" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
-	U   UnionWithEmptyStruct   `fidl:"80" fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
-	U2  *UnionWithEmptyStruct  `fidl:"96" fidl_offset_v1:"104" fidl_offset_v1_no_ee:"104"`
-}
-
-var _mStructWithOptionals = _bindings.CreateLazyMarshaler(StructWithOptionals{})
-
-func (msg *StructWithOptionals) Marshaler() _bindings.Marshaler {
-	return _mStructWithOptionals
-}
-
 type MyBool struct {
 	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
 	Value bool     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
@@ -368,336 +621,327 @@
 	return _mMyFloat64
 }
 
-type Length2StringWrapper struct {
-	_             struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	Length2String string   `fidl:"0,2" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-}
-
-var _mLength2StringWrapper = _bindings.CreateLazyMarshaler(Length2StringWrapper{})
-
-func (msg *Length2StringWrapper) Marshaler() _bindings.Marshaler {
-	return _mLength2StringWrapper
-}
-
-type StringWrapper struct {
-	_   struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	Str string   `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-}
-
-var _mStringWrapper = _bindings.CreateLazyMarshaler(StringWrapper{})
-
-func (msg *StringWrapper) Marshaler() _bindings.Marshaler {
-	return _mStringWrapper
-}
-
-type EmptyStruct struct {
-	_ struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
-}
-
-var _mEmptyStruct = _bindings.CreateLazyMarshaler(EmptyStruct{})
-
-func (msg *EmptyStruct) Marshaler() _bindings.Marshaler {
-	return _mEmptyStruct
-}
-
-type EmptyStructSandwich struct {
-	_      struct{}    `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
-	Before string      `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Es     EmptyStruct `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-	After  string      `fidl:"24," fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
-}
-
-var _mEmptyStructSandwich = _bindings.CreateLazyMarshaler(EmptyStructSandwich{})
-
-func (msg *EmptyStructSandwich) Marshaler() _bindings.Marshaler {
-	return _mEmptyStructSandwich
-}
-
-type Uint8Uint16Uint32Uint64 struct {
-	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	F1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	F2 uint16   `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
-	F3 uint32   `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
-	F4 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-}
-
-var _mUint8Uint16Uint32Uint64 = _bindings.CreateLazyMarshaler(Uint8Uint16Uint32Uint64{})
-
-func (msg *Uint8Uint16Uint32Uint64) Marshaler() _bindings.Marshaler {
-	return _mUint8Uint16Uint32Uint64
-}
-
-type Uint64Uint32Uint16Uint8 struct {
-	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	F2 uint32   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-	F3 uint16   `fidl:"12" fidl_offset_v1:"12" fidl_offset_v1_no_ee:"12"`
-	F4 uint8    `fidl:"14" fidl_offset_v1:"14" fidl_offset_v1_no_ee:"14"`
-}
-
-var _mUint64Uint32Uint16Uint8 = _bindings.CreateLazyMarshaler(Uint64Uint32Uint16Uint8{})
-
-func (msg *Uint64Uint32Uint16Uint8) Marshaler() _bindings.Marshaler {
-	return _mUint64Uint32Uint16Uint8
-}
-
-type StructOfSimpleTable struct {
-	_     struct{}    `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	Table SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-}
-
-var _mStructOfSimpleTable = _bindings.CreateLazyMarshaler(StructOfSimpleTable{})
-
-func (msg *StructOfSimpleTable) Marshaler() _bindings.Marshaler {
-	return _mStructOfSimpleTable
-}
-
-type SimpleTableThenUint64 struct {
-	_      struct{}    `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	Table  SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Number uint64      `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-}
-
-var _mSimpleTableThenUint64 = _bindings.CreateLazyMarshaler(SimpleTableThenUint64{})
-
-func (msg *SimpleTableThenUint64) Marshaler() _bindings.Marshaler {
-	return _mSimpleTableThenUint64
-}
-
-type StructOfTableWithStringAndVector struct {
-	_     struct{}                 `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	Table TableWithStringAndVector `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-}
-
-var _mStructOfTableWithStringAndVector = _bindings.CreateLazyMarshaler(StructOfTableWithStringAndVector{})
-
-func (msg *StructOfTableWithStringAndVector) Marshaler() _bindings.Marshaler {
-	return _mStructOfTableWithStringAndVector
-}
-
-type UnionWithBoundStringStruct struct {
-	_ struct{}             `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	V UnionWithBoundString `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-}
-
-var _mUnionWithBoundStringStruct = _bindings.CreateLazyMarshaler(UnionWithBoundStringStruct{})
-
-func (msg *UnionWithBoundStringStruct) Marshaler() _bindings.Marshaler {
-	return _mUnionWithBoundStringStruct
-}
-
-type SingleVariantUnionStruct struct {
-	_ struct{}           `fidl:"s,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	U SingleVariantUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-}
-
-var _mSingleVariantUnionStruct = _bindings.CreateLazyMarshaler(SingleVariantUnionStruct{})
-
-func (msg *SingleVariantUnionStruct) Marshaler() _bindings.Marshaler {
-	return _mSingleVariantUnionStruct
-}
-
-type SandwichUnionSize8Alignment4 struct {
-	_      struct{}             `fidl:"s,16,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
-	Before uint32               `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Value  UnionSize8Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-	After  uint32               `fidl:"12" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
-}
-
-var _mSandwichUnionSize8Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize8Alignment4{})
-
-func (msg *SandwichUnionSize8Alignment4) Marshaler() _bindings.Marshaler {
-	return _mSandwichUnionSize8Alignment4
-}
-
-type SandwichUnionSize12Alignment4 struct {
-	_      struct{}              `fidl:"s,20,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
-	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Value  UnionSize12Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-	After  uint32                `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
-}
-
-var _mSandwichUnionSize12Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize12Alignment4{})
-
-func (msg *SandwichUnionSize12Alignment4) Marshaler() _bindings.Marshaler {
-	return _mSandwichUnionSize12Alignment4
-}
-
-type StructSize16Alignment8 struct {
+type StructSize16Align8 struct {
 	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
 	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
 	F2 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
 }
 
-var _mStructSize16Alignment8 = _bindings.CreateLazyMarshaler(StructSize16Alignment8{})
+var _mStructSize16Align8 = _bindings.CreateLazyMarshaler(StructSize16Align8{})
 
-func (msg *StructSize16Alignment8) Marshaler() _bindings.Marshaler {
-	return _mStructSize16Alignment8
+func (msg *StructSize16Align8) Marshaler() _bindings.Marshaler {
+	return _mStructSize16Align8
 }
 
-type SandwichUnionSize24Alignment8 struct {
-	_      struct{}              `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
-	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Value  UnionSize24Alignment8 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-	After  uint32                `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+type Sandwich1 struct {
+	_        struct{}         `fidl:"s,16,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before   uint32           `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	TheUnion UnionSize8Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After    uint32           `fidl:"12" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-var _mSandwichUnionSize24Alignment8 = _bindings.CreateLazyMarshaler(SandwichUnionSize24Alignment8{})
+var _mSandwich1 = _bindings.CreateLazyMarshaler(Sandwich1{})
 
-func (msg *SandwichUnionSize24Alignment8) Marshaler() _bindings.Marshaler {
-	return _mSandwichUnionSize24Alignment8
+func (msg *Sandwich1) Marshaler() _bindings.Marshaler {
+	return _mSandwich1
 }
 
-type SandwichUnionSize36Alignment4 struct {
-	_      struct{}              `fidl:"s,44,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
-	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Value  UnionSize36Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
-	After  uint32                `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
+type Sandwich2 struct {
+	_        struct{}          `fidl:"s,20,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	TheUnion UnionSize12Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After    uint32            `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-var _mSandwichUnionSize36Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize36Alignment4{})
+var _mSandwich2 = _bindings.CreateLazyMarshaler(Sandwich2{})
 
-func (msg *SandwichUnionSize36Alignment4) Marshaler() _bindings.Marshaler {
-	return _mSandwichUnionSize36Alignment4
+func (msg *Sandwich2) Marshaler() _bindings.Marshaler {
+	return _mSandwich2
 }
 
-type Int64Struct struct {
-	_ struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
-	X int64    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+type Sandwich3 struct {
+	_        struct{}          `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	TheUnion UnionSize24Align8 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After    uint32            `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-var _mInt64Struct = _bindings.CreateLazyMarshaler(Int64Struct{})
+var _mSandwich3 = _bindings.CreateLazyMarshaler(Sandwich3{})
 
-func (msg *Int64Struct) Marshaler() _bindings.Marshaler {
-	return _mInt64Struct
+func (msg *Sandwich3) Marshaler() _bindings.Marshaler {
+	return _mSandwich3
 }
 
-type TestInlineXUnionInStruct struct {
-	_      struct{}     `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
-	Before string       `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Xu     SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-	After  string       `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
+type Sandwich4 struct {
+	_        struct{}          `fidl:"s,44,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	TheUnion UnionSize36Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After    uint32            `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-var _mTestInlineXUnionInStruct = _bindings.CreateLazyMarshaler(TestInlineXUnionInStruct{})
+var _mSandwich4 = _bindings.CreateLazyMarshaler(Sandwich4{})
 
-func (msg *TestInlineXUnionInStruct) Marshaler() _bindings.Marshaler {
-	return _mTestInlineXUnionInStruct
+func (msg *Sandwich4) Marshaler() _bindings.Marshaler {
+	return _mSandwich4
 }
 
-type TestOptionalXUnionInStruct struct {
-	_      struct{}      `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
-	Before string        `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
-	Xu     *SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
-	After  string        `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
+type Sandwich5 struct {
+	_            struct{}     `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before       uint32       `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	UnionOfUnion UnionOfUnion `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After        uint32       `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-var _mTestOptionalXUnionInStruct = _bindings.CreateLazyMarshaler(TestOptionalXUnionInStruct{})
+var _mSandwich5 = _bindings.CreateLazyMarshaler(Sandwich5{})
 
-func (msg *TestOptionalXUnionInStruct) Marshaler() _bindings.Marshaler {
-	return _mTestOptionalXUnionInStruct
+func (msg *Sandwich5) Marshaler() _bindings.Marshaler {
+	return _mSandwich5
 }
 
-type TestStrictXUnionInStruct struct {
-	_  struct{}           `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	Xu SampleStrictXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+type StructSize3Align1 struct {
+	_          struct{} `fidl:"s,3,1" fidl_size_v1:"3" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"3" fidl_alignment_v1_no_ee:"1"`
+	ThreeBytes [3]uint8 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
 }
 
-var _mTestStrictXUnionInStruct = _bindings.CreateLazyMarshaler(TestStrictXUnionInStruct{})
+var _mStructSize3Align1 = _bindings.CreateLazyMarshaler(StructSize3Align1{})
 
-func (msg *TestStrictXUnionInStruct) Marshaler() _bindings.Marshaler {
-	return _mTestStrictXUnionInStruct
+func (msg *StructSize3Align1) Marshaler() _bindings.Marshaler {
+	return _mStructSize3Align1
 }
 
-type TestFlexibleXUnionInStruct struct {
-	_  struct{}     `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	Xu SampleXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+type StructSize3Align2 struct {
+	_  struct{} `fidl:"s,4,2" fidl_size_v1:"4" fidl_alignment_v1:"2" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"2"`
+	F1 uint16   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	F2 uint8    `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
 }
 
-var _mTestFlexibleXUnionInStruct = _bindings.CreateLazyMarshaler(TestFlexibleXUnionInStruct{})
+var _mStructSize3Align2 = _bindings.CreateLazyMarshaler(StructSize3Align2{})
 
-func (msg *TestFlexibleXUnionInStruct) Marshaler() _bindings.Marshaler {
-	return _mTestFlexibleXUnionInStruct
+func (msg *StructSize3Align2) Marshaler() _bindings.Marshaler {
+	return _mStructSize3Align2
 }
 
-type I_ipAddressConfigTag uint32
-
-const (
-	_ I_ipAddressConfigTag = iota
-	IpAddressConfigPaddingSize24Align4
-	IpAddressConfigDhcp
-)
-
-type IpAddressConfig struct {
-	I_ipAddressConfigTag `fidl:"u,28,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	PaddingSize24Align4  [6]uint32 `fidl:"1"`
-	Dhcp                 bool      `fidl:"2"`
+type Sandwich6 struct {
+	_        struct{}        `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before   uint32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	TheUnion UnionWithVector `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After    uint32          `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-func (u *IpAddressConfig) Which() I_ipAddressConfigTag {
-	return u.I_ipAddressConfigTag
+var _mSandwich6 = _bindings.CreateLazyMarshaler(Sandwich6{})
+
+func (msg *Sandwich6) Marshaler() _bindings.Marshaler {
+	return _mSandwich6
 }
 
-func (u *IpAddressConfig) SetPaddingSize24Align4(paddingSize24Align4 [6]uint32) {
-	u.I_ipAddressConfigTag = IpAddressConfigPaddingSize24Align4
-	u.PaddingSize24Align4 = paddingSize24Align4
+type Sandwich7 struct {
+	_            struct{}   `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Before       uint32     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	OptSandwich1 *Sandwich1 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After        uint32     `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
 }
 
-func IpAddressConfigWithPaddingSize24Align4(paddingSize24Align4 [6]uint32) IpAddressConfig {
-	var _u IpAddressConfig
-	_u.SetPaddingSize24Align4(paddingSize24Align4)
-	return _u
+var _mSandwich7 = _bindings.CreateLazyMarshaler(Sandwich7{})
+
+func (msg *Sandwich7) Marshaler() _bindings.Marshaler {
+	return _mSandwich7
 }
 
-func (u *IpAddressConfig) SetDhcp(dhcp bool) {
-	u.I_ipAddressConfigTag = IpAddressConfigDhcp
-	u.Dhcp = dhcp
+type Sandwich8 struct {
+	_            struct{}     `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Before       uint64       `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	UnionOfUnion UnionOfUnion `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	After        uint32       `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-func IpAddressConfigWithDhcp(dhcp bool) IpAddressConfig {
-	var _u IpAddressConfig
-	_u.SetDhcp(dhcp)
-	return _u
+var _mSandwich8 = _bindings.CreateLazyMarshaler(Sandwich8{})
+
+func (msg *Sandwich8) Marshaler() _bindings.Marshaler {
+	return _mSandwich8
 }
 
-type I_unionWithEmptyStructTag uint32
-
-const (
-	_ I_unionWithEmptyStructTag = iota
-	UnionWithEmptyStructS
-	UnionWithEmptyStructForceAlignmentOf8
-)
-
-type UnionWithEmptyStruct struct {
-	I_unionWithEmptyStructTag `fidl:"u,16,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	S                         EmptyStruct `fidl:"1"`
-	ForceAlignmentOf8         uint64      `fidl:"2"`
+type Regression1 struct {
+	_  struct{} `fidl:"s,32,8" fidl_size_v1:"32" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
+	F1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	F2 uint32   `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
+	F3 uint8    `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
+	F4 uint16   `fidl:"10" fidl_offset_v1:"10" fidl_offset_v1_no_ee:"10"`
+	F5 uint64   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
+	F6 uint8    `fidl:"24" fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
 }
 
-func (u *UnionWithEmptyStruct) Which() I_unionWithEmptyStructTag {
-	return u.I_unionWithEmptyStructTag
+var _mRegression1 = _bindings.CreateLazyMarshaler(Regression1{})
+
+func (msg *Regression1) Marshaler() _bindings.Marshaler {
+	return _mRegression1
 }
 
-func (u *UnionWithEmptyStruct) SetS(s EmptyStruct) {
-	u.I_unionWithEmptyStructTag = UnionWithEmptyStructS
-	u.S = s
+type Regression2 struct {
+	_    struct{}    `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
+	Head Regression1 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	F7   uint8       `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
 }
 
-func UnionWithEmptyStructWithS(s EmptyStruct) UnionWithEmptyStruct {
-	var _u UnionWithEmptyStruct
-	_u.SetS(s)
-	return _u
+var _mRegression2 = _bindings.CreateLazyMarshaler(Regression2{})
+
+func (msg *Regression2) Marshaler() _bindings.Marshaler {
+	return _mRegression2
 }
 
-func (u *UnionWithEmptyStruct) SetForceAlignmentOf8(forceAlignmentOf8 uint64) {
-	u.I_unionWithEmptyStructTag = UnionWithEmptyStructForceAlignmentOf8
-	u.ForceAlignmentOf8 = forceAlignmentOf8
+type Regression3 struct {
+	_        struct{}     `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
+	OptValue *Regression2 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
 }
 
-func UnionWithEmptyStructWithForceAlignmentOf8(forceAlignmentOf8 uint64) UnionWithEmptyStruct {
-	var _u UnionWithEmptyStruct
-	_u.SetForceAlignmentOf8(forceAlignmentOf8)
-	return _u
+var _mRegression3 = _bindings.CreateLazyMarshaler(Regression3{})
+
+func (msg *Regression3) Marshaler() _bindings.Marshaler {
+	return _mRegression3
+}
+
+type TableStructWithReservedSandwichStruct struct {
+	_     struct{}                        `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Table TableStructWithReservedSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mTableStructWithReservedSandwichStruct = _bindings.CreateLazyMarshaler(TableStructWithReservedSandwichStruct{})
+
+func (msg *TableStructWithReservedSandwichStruct) Marshaler() _bindings.Marshaler {
+	return _mTableStructWithReservedSandwichStruct
+}
+
+type TableStructWithUint32SandwichStruct struct {
+	_     struct{}                      `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Table TableStructWithUint32Sandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mTableStructWithUint32SandwichStruct = _bindings.CreateLazyMarshaler(TableStructWithUint32SandwichStruct{})
+
+func (msg *TableStructWithUint32SandwichStruct) Marshaler() _bindings.Marshaler {
+	return _mTableStructWithUint32SandwichStruct
+}
+
+type TableUnionWithVectorReservedSandwichStruct struct {
+	_     struct{}                             `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Table TableUnionWithVectorReservedSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mTableUnionWithVectorReservedSandwichStruct = _bindings.CreateLazyMarshaler(TableUnionWithVectorReservedSandwichStruct{})
+
+func (msg *TableUnionWithVectorReservedSandwichStruct) Marshaler() _bindings.Marshaler {
+	return _mTableUnionWithVectorReservedSandwichStruct
+}
+
+type TableUnionWithVectorStructSandwichStruct struct {
+	_     struct{}                           `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Table TableUnionWithVectorStructSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mTableUnionWithVectorStructSandwichStruct = _bindings.CreateLazyMarshaler(TableUnionWithVectorStructSandwichStruct{})
+
+func (msg *TableUnionWithVectorStructSandwichStruct) Marshaler() _bindings.Marshaler {
+	return _mTableUnionWithVectorStructSandwichStruct
+}
+
+type XUnionWithStructStruct struct {
+	_  struct{}         `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Xu XUnionWithStruct `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mXUnionWithStructStruct = _bindings.CreateLazyMarshaler(XUnionWithStructStruct{})
+
+func (msg *XUnionWithStructStruct) Marshaler() _bindings.Marshaler {
+	return _mXUnionWithStructStruct
+}
+
+type XUnionWithXUnionStruct struct {
+	_  struct{}         `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Xu XUnionWithXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mXUnionWithXUnionStruct = _bindings.CreateLazyMarshaler(XUnionWithXUnionStruct{})
+
+func (msg *XUnionWithXUnionStruct) Marshaler() _bindings.Marshaler {
+	return _mXUnionWithXUnionStruct
+}
+
+type StructSize5Align1 struct {
+	_    struct{} `fidl:"s,5,1" fidl_size_v1:"5" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"5" fidl_alignment_v1_no_ee:"1"`
+	Data [5]uint8 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStructSize5Align1 = _bindings.CreateLazyMarshaler(StructSize5Align1{})
+
+func (msg *StructSize5Align1) Marshaler() _bindings.Marshaler {
+	return _mStructSize5Align1
+}
+
+type StructSize5Align4 struct {
+	_    struct{} `fidl:"s,8,4" fidl_size_v1:"8" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"4"`
+	Four uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	One  uint8    `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
+}
+
+var _mStructSize5Align4 = _bindings.CreateLazyMarshaler(StructSize5Align4{})
+
+func (msg *StructSize5Align4) Marshaler() _bindings.Marshaler {
+	return _mStructSize5Align4
+}
+
+type StructSize5Align1Vector struct {
+	_ struct{}            `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	V []StructSize5Align1 `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStructSize5Align1Vector = _bindings.CreateLazyMarshaler(StructSize5Align1Vector{})
+
+func (msg *StructSize5Align1Vector) Marshaler() _bindings.Marshaler {
+	return _mStructSize5Align1Vector
+}
+
+type StructSize5Align4Vector struct {
+	_ struct{}            `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	V []StructSize5Align4 `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStructSize5Align4Vector = _bindings.CreateLazyMarshaler(StructSize5Align4Vector{})
+
+func (msg *StructSize5Align4Vector) Marshaler() _bindings.Marshaler {
+	return _mStructSize5Align4Vector
+}
+
+type StructSize5Align1Array struct {
+	_ struct{}             `fidl:"s,15,1" fidl_size_v1:"15" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"15" fidl_alignment_v1_no_ee:"1"`
+	A [3]StructSize5Align1 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStructSize5Align1Array = _bindings.CreateLazyMarshaler(StructSize5Align1Array{})
+
+func (msg *StructSize5Align1Array) Marshaler() _bindings.Marshaler {
+	return _mStructSize5Align1Array
+}
+
+type StructSize5Align4Array struct {
+	_ struct{}             `fidl:"s,24,4" fidl_size_v1:"24" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"4"`
+	A [3]StructSize5Align4 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+}
+
+var _mStructSize5Align4Array = _bindings.CreateLazyMarshaler(StructSize5Align4Array{})
+
+func (msg *StructSize5Align4Array) Marshaler() _bindings.Marshaler {
+	return _mStructSize5Align4Array
+}
+
+type ArrayStruct struct {
+	_              struct{}        `fidl:"s,96,8" fidl_size_v1:"144" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"144" fidl_alignment_v1_no_ee:"8"`
+	Unions         [3]StringUnion  `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
+	OptionalUnions [3]*StringUnion `fidl:"72" fidl_offset_v1:"72" fidl_offset_v1_no_ee:"72"`
+}
+
+var _mArrayStruct = _bindings.CreateLazyMarshaler(ArrayStruct{})
+
+func (msg *ArrayStruct) Marshaler() _bindings.Marshaler {
+	return _mArrayStruct
 }
 
 type I_unionWithBoundStringTag uint32
@@ -1005,6 +1249,46 @@
 	return _u
 }
 
+type I_ipAddressConfigTag uint32
+
+const (
+	_ I_ipAddressConfigTag = iota
+	IpAddressConfigPaddingSize24Align4
+	IpAddressConfigDhcp
+)
+
+type IpAddressConfig struct {
+	I_ipAddressConfigTag `fidl:"u,28,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	PaddingSize24Align4  [6]uint32 `fidl:"1"`
+	Dhcp                 bool      `fidl:"2"`
+}
+
+func (u *IpAddressConfig) Which() I_ipAddressConfigTag {
+	return u.I_ipAddressConfigTag
+}
+
+func (u *IpAddressConfig) SetPaddingSize24Align4(paddingSize24Align4 [6]uint32) {
+	u.I_ipAddressConfigTag = IpAddressConfigPaddingSize24Align4
+	u.PaddingSize24Align4 = paddingSize24Align4
+}
+
+func IpAddressConfigWithPaddingSize24Align4(paddingSize24Align4 [6]uint32) IpAddressConfig {
+	var _u IpAddressConfig
+	_u.SetPaddingSize24Align4(paddingSize24Align4)
+	return _u
+}
+
+func (u *IpAddressConfig) SetDhcp(dhcp bool) {
+	u.I_ipAddressConfigTag = IpAddressConfigDhcp
+	u.Dhcp = dhcp
+}
+
+func IpAddressConfigWithDhcp(dhcp bool) IpAddressConfig {
+	var _u IpAddressConfig
+	_u.SetDhcp(dhcp)
+	return _u
+}
+
 type I_simpleUnionTag uint32
 
 const (
@@ -1071,39 +1355,543 @@
 	return _u
 }
 
-type I_xUnionWithEmptyStructTag uint32
+type I_unionWithEmptyStructTag uint32
 
 const (
-	XUnionWithEmptyStruct_unknownData = 0          // 0x00000000
-	XUnionWithEmptyStructS            = 1956241662 // 0x7499e0fe
+	_ I_unionWithEmptyStructTag = iota
+	UnionWithEmptyStructS
+	UnionWithEmptyStructForceAlignmentOf8
 )
 
-type XUnionWithEmptyStruct struct {
-	I_xUnionWithEmptyStructTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
-	I_unknownData              []byte
-	S                          EmptyStruct `fidl:"1956241662"`
+type UnionWithEmptyStruct struct {
+	I_unionWithEmptyStructTag `fidl:"u,16,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	S                         EmptyStruct `fidl:"1"`
+	ForceAlignmentOf8         uint64      `fidl:"2"`
 }
 
-func (_m *XUnionWithEmptyStruct) Which() I_xUnionWithEmptyStructTag {
-	switch _m.I_xUnionWithEmptyStructTag {
-	case 1956241662:
-		return XUnionWithEmptyStructS
-	default:
-		return XUnionWithEmptyStruct_unknownData
-	}
+func (u *UnionWithEmptyStruct) Which() I_unionWithEmptyStructTag {
+	return u.I_unionWithEmptyStructTag
 }
 
-func (_m *XUnionWithEmptyStruct) Ordinal() uint32 {
-	return uint32(_m.I_xUnionWithEmptyStructTag)
+func (u *UnionWithEmptyStruct) SetS(s EmptyStruct) {
+	u.I_unionWithEmptyStructTag = UnionWithEmptyStructS
+	u.S = s
 }
 
-func (_m *XUnionWithEmptyStruct) SetS(s EmptyStruct) {
-	_m.I_xUnionWithEmptyStructTag = XUnionWithEmptyStructS
-	_m.S = s
+func UnionWithEmptyStructWithS(s EmptyStruct) UnionWithEmptyStruct {
+	var _u UnionWithEmptyStruct
+	_u.SetS(s)
+	return _u
 }
 
-func XUnionWithEmptyStructWithS(s EmptyStruct) XUnionWithEmptyStruct {
-	var _u XUnionWithEmptyStruct
+func (u *UnionWithEmptyStruct) SetForceAlignmentOf8(forceAlignmentOf8 uint64) {
+	u.I_unionWithEmptyStructTag = UnionWithEmptyStructForceAlignmentOf8
+	u.ForceAlignmentOf8 = forceAlignmentOf8
+}
+
+func UnionWithEmptyStructWithForceAlignmentOf8(forceAlignmentOf8 uint64) UnionWithEmptyStruct {
+	var _u UnionWithEmptyStruct
+	_u.SetForceAlignmentOf8(forceAlignmentOf8)
+	return _u
+}
+
+type I_unionSize8Align4Tag uint32
+
+const (
+	_ I_unionSize8Align4Tag = iota
+	UnionSize8Align4Unused1
+	UnionSize8Align4Unused2
+	UnionSize8Align4Variant
+)
+
+type UnionSize8Align4 struct {
+	I_unionSize8Align4Tag `fidl:"u,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Unused1               uint8  `fidl:"1"`
+	Unused2               uint8  `fidl:"2"`
+	Variant               uint32 `fidl:"3"`
+}
+
+func (u *UnionSize8Align4) Which() I_unionSize8Align4Tag {
+	return u.I_unionSize8Align4Tag
+}
+
+func (u *UnionSize8Align4) SetUnused1(unused1 uint8) {
+	u.I_unionSize8Align4Tag = UnionSize8Align4Unused1
+	u.Unused1 = unused1
+}
+
+func UnionSize8Align4WithUnused1(unused1 uint8) UnionSize8Align4 {
+	var _u UnionSize8Align4
+	_u.SetUnused1(unused1)
+	return _u
+}
+
+func (u *UnionSize8Align4) SetUnused2(unused2 uint8) {
+	u.I_unionSize8Align4Tag = UnionSize8Align4Unused2
+	u.Unused2 = unused2
+}
+
+func UnionSize8Align4WithUnused2(unused2 uint8) UnionSize8Align4 {
+	var _u UnionSize8Align4
+	_u.SetUnused2(unused2)
+	return _u
+}
+
+func (u *UnionSize8Align4) SetVariant(variant uint32) {
+	u.I_unionSize8Align4Tag = UnionSize8Align4Variant
+	u.Variant = variant
+}
+
+func UnionSize8Align4WithVariant(variant uint32) UnionSize8Align4 {
+	var _u UnionSize8Align4
+	_u.SetVariant(variant)
+	return _u
+}
+
+type I_unionSize12Align4Tag uint32
+
+const (
+	_ I_unionSize12Align4Tag = iota
+	UnionSize12Align4Unused1
+	UnionSize12Align4Unused2
+	UnionSize12Align4Unused3
+	UnionSize12Align4Variant
+)
+
+type UnionSize12Align4 struct {
+	I_unionSize12Align4Tag `fidl:"u,12,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Unused1                uint8    `fidl:"1"`
+	Unused2                uint8    `fidl:"2"`
+	Unused3                uint8    `fidl:"3"`
+	Variant                [6]uint8 `fidl:"4"`
+}
+
+func (u *UnionSize12Align4) Which() I_unionSize12Align4Tag {
+	return u.I_unionSize12Align4Tag
+}
+
+func (u *UnionSize12Align4) SetUnused1(unused1 uint8) {
+	u.I_unionSize12Align4Tag = UnionSize12Align4Unused1
+	u.Unused1 = unused1
+}
+
+func UnionSize12Align4WithUnused1(unused1 uint8) UnionSize12Align4 {
+	var _u UnionSize12Align4
+	_u.SetUnused1(unused1)
+	return _u
+}
+
+func (u *UnionSize12Align4) SetUnused2(unused2 uint8) {
+	u.I_unionSize12Align4Tag = UnionSize12Align4Unused2
+	u.Unused2 = unused2
+}
+
+func UnionSize12Align4WithUnused2(unused2 uint8) UnionSize12Align4 {
+	var _u UnionSize12Align4
+	_u.SetUnused2(unused2)
+	return _u
+}
+
+func (u *UnionSize12Align4) SetUnused3(unused3 uint8) {
+	u.I_unionSize12Align4Tag = UnionSize12Align4Unused3
+	u.Unused3 = unused3
+}
+
+func UnionSize12Align4WithUnused3(unused3 uint8) UnionSize12Align4 {
+	var _u UnionSize12Align4
+	_u.SetUnused3(unused3)
+	return _u
+}
+
+func (u *UnionSize12Align4) SetVariant(variant [6]uint8) {
+	u.I_unionSize12Align4Tag = UnionSize12Align4Variant
+	u.Variant = variant
+}
+
+func UnionSize12Align4WithVariant(variant [6]uint8) UnionSize12Align4 {
+	var _u UnionSize12Align4
+	_u.SetVariant(variant)
+	return _u
+}
+
+type I_unionSize24Align8Tag uint32
+
+const (
+	_ I_unionSize24Align8Tag = iota
+	UnionSize24Align8Unused1
+	UnionSize24Align8Unused2
+	UnionSize24Align8Unused3
+	UnionSize24Align8Variant
+)
+
+type UnionSize24Align8 struct {
+	I_unionSize24Align8Tag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Unused1                uint8              `fidl:"1"`
+	Unused2                uint8              `fidl:"2"`
+	Unused3                uint8              `fidl:"3"`
+	Variant                StructSize16Align8 `fidl:"4"`
+}
+
+func (u *UnionSize24Align8) Which() I_unionSize24Align8Tag {
+	return u.I_unionSize24Align8Tag
+}
+
+func (u *UnionSize24Align8) SetUnused1(unused1 uint8) {
+	u.I_unionSize24Align8Tag = UnionSize24Align8Unused1
+	u.Unused1 = unused1
+}
+
+func UnionSize24Align8WithUnused1(unused1 uint8) UnionSize24Align8 {
+	var _u UnionSize24Align8
+	_u.SetUnused1(unused1)
+	return _u
+}
+
+func (u *UnionSize24Align8) SetUnused2(unused2 uint8) {
+	u.I_unionSize24Align8Tag = UnionSize24Align8Unused2
+	u.Unused2 = unused2
+}
+
+func UnionSize24Align8WithUnused2(unused2 uint8) UnionSize24Align8 {
+	var _u UnionSize24Align8
+	_u.SetUnused2(unused2)
+	return _u
+}
+
+func (u *UnionSize24Align8) SetUnused3(unused3 uint8) {
+	u.I_unionSize24Align8Tag = UnionSize24Align8Unused3
+	u.Unused3 = unused3
+}
+
+func UnionSize24Align8WithUnused3(unused3 uint8) UnionSize24Align8 {
+	var _u UnionSize24Align8
+	_u.SetUnused3(unused3)
+	return _u
+}
+
+func (u *UnionSize24Align8) SetVariant(variant StructSize16Align8) {
+	u.I_unionSize24Align8Tag = UnionSize24Align8Variant
+	u.Variant = variant
+}
+
+func UnionSize24Align8WithVariant(variant StructSize16Align8) UnionSize24Align8 {
+	var _u UnionSize24Align8
+	_u.SetVariant(variant)
+	return _u
+}
+
+type I_unionSize36Align4Tag uint32
+
+const (
+	_ I_unionSize36Align4Tag = iota
+	UnionSize36Align4Unused1
+	UnionSize36Align4Unused2
+	UnionSize36Align4Unused3
+	UnionSize36Align4Variant
+)
+
+type UnionSize36Align4 struct {
+	I_unionSize36Align4Tag `fidl:"u,36,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Unused1                uint8     `fidl:"1"`
+	Unused2                uint8     `fidl:"2"`
+	Unused3                uint8     `fidl:"3"`
+	Variant                [32]uint8 `fidl:"4"`
+}
+
+func (u *UnionSize36Align4) Which() I_unionSize36Align4Tag {
+	return u.I_unionSize36Align4Tag
+}
+
+func (u *UnionSize36Align4) SetUnused1(unused1 uint8) {
+	u.I_unionSize36Align4Tag = UnionSize36Align4Unused1
+	u.Unused1 = unused1
+}
+
+func UnionSize36Align4WithUnused1(unused1 uint8) UnionSize36Align4 {
+	var _u UnionSize36Align4
+	_u.SetUnused1(unused1)
+	return _u
+}
+
+func (u *UnionSize36Align4) SetUnused2(unused2 uint8) {
+	u.I_unionSize36Align4Tag = UnionSize36Align4Unused2
+	u.Unused2 = unused2
+}
+
+func UnionSize36Align4WithUnused2(unused2 uint8) UnionSize36Align4 {
+	var _u UnionSize36Align4
+	_u.SetUnused2(unused2)
+	return _u
+}
+
+func (u *UnionSize36Align4) SetUnused3(unused3 uint8) {
+	u.I_unionSize36Align4Tag = UnionSize36Align4Unused3
+	u.Unused3 = unused3
+}
+
+func UnionSize36Align4WithUnused3(unused3 uint8) UnionSize36Align4 {
+	var _u UnionSize36Align4
+	_u.SetUnused3(unused3)
+	return _u
+}
+
+func (u *UnionSize36Align4) SetVariant(variant [32]uint8) {
+	u.I_unionSize36Align4Tag = UnionSize36Align4Variant
+	u.Variant = variant
+}
+
+func UnionSize36Align4WithVariant(variant [32]uint8) UnionSize36Align4 {
+	var _u UnionSize36Align4
+	_u.SetVariant(variant)
+	return _u
+}
+
+type I_unionOfUnionTag uint32
+
+const (
+	_ I_unionOfUnionTag = iota
+	UnionOfUnionUnused1
+	UnionOfUnionSize8align4
+	UnionOfUnionSize12align4
+	UnionOfUnionUnused2
+	UnionOfUnionSize24align8
+)
+
+type UnionOfUnion struct {
+	I_unionOfUnionTag `fidl:"u,32,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Unused1           uint8             `fidl:"1"`
+	Size8align4       UnionSize8Align4  `fidl:"2"`
+	Size12align4      UnionSize12Align4 `fidl:"3"`
+	Unused2           uint8             `fidl:"4"`
+	Size24align8      UnionSize24Align8 `fidl:"5"`
+}
+
+func (u *UnionOfUnion) Which() I_unionOfUnionTag {
+	return u.I_unionOfUnionTag
+}
+
+func (u *UnionOfUnion) SetUnused1(unused1 uint8) {
+	u.I_unionOfUnionTag = UnionOfUnionUnused1
+	u.Unused1 = unused1
+}
+
+func UnionOfUnionWithUnused1(unused1 uint8) UnionOfUnion {
+	var _u UnionOfUnion
+	_u.SetUnused1(unused1)
+	return _u
+}
+
+func (u *UnionOfUnion) SetSize8align4(size8align4 UnionSize8Align4) {
+	u.I_unionOfUnionTag = UnionOfUnionSize8align4
+	u.Size8align4 = size8align4
+}
+
+func UnionOfUnionWithSize8align4(size8align4 UnionSize8Align4) UnionOfUnion {
+	var _u UnionOfUnion
+	_u.SetSize8align4(size8align4)
+	return _u
+}
+
+func (u *UnionOfUnion) SetSize12align4(size12align4 UnionSize12Align4) {
+	u.I_unionOfUnionTag = UnionOfUnionSize12align4
+	u.Size12align4 = size12align4
+}
+
+func UnionOfUnionWithSize12align4(size12align4 UnionSize12Align4) UnionOfUnion {
+	var _u UnionOfUnion
+	_u.SetSize12align4(size12align4)
+	return _u
+}
+
+func (u *UnionOfUnion) SetUnused2(unused2 uint8) {
+	u.I_unionOfUnionTag = UnionOfUnionUnused2
+	u.Unused2 = unused2
+}
+
+func UnionOfUnionWithUnused2(unused2 uint8) UnionOfUnion {
+	var _u UnionOfUnion
+	_u.SetUnused2(unused2)
+	return _u
+}
+
+func (u *UnionOfUnion) SetSize24align8(size24align8 UnionSize24Align8) {
+	u.I_unionOfUnionTag = UnionOfUnionSize24align8
+	u.Size24align8 = size24align8
+}
+
+func UnionOfUnionWithSize24align8(size24align8 UnionSize24Align8) UnionOfUnion {
+	var _u UnionOfUnion
+	_u.SetSize24align8(size24align8)
+	return _u
+}
+
+type I_unionWithVectorTag uint32
+
+const (
+	_ I_unionWithVectorTag = iota
+	UnionWithVectorUnused
+	UnionWithVectorVectorOfUint8
+	UnionWithVectorString
+	UnionWithVectorVectorS3A1
+	UnionWithVectorVectorS3A2
+	UnionWithVectorHandles
+	UnionWithVectorArrayS3A1
+	UnionWithVectorArrayS3A2
+	UnionWithVectorVectorUnion
+)
+
+type UnionWithVector struct {
+	I_unionWithVectorTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Unused               uint8                `fidl:"1"`
+	VectorOfUint8        []uint8              `fidl:"2,"`
+	String               string               `fidl:"3,"`
+	VectorS3A1           []StructSize3Align1  `fidl:"4,"`
+	VectorS3A2           []StructSize3Align2  `fidl:"5,"`
+	Handles              []uint32             `fidl:"6,"`
+	ArrayS3A1            [2]StructSize3Align1 `fidl:"7"`
+	ArrayS3A2            [2]StructSize3Align2 `fidl:"8"`
+	VectorUnion          []UnionSize8Align4   `fidl:"9,"`
+}
+
+func (u *UnionWithVector) Which() I_unionWithVectorTag {
+	return u.I_unionWithVectorTag
+}
+
+func (u *UnionWithVector) SetUnused(unused uint8) {
+	u.I_unionWithVectorTag = UnionWithVectorUnused
+	u.Unused = unused
+}
+
+func UnionWithVectorWithUnused(unused uint8) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetUnused(unused)
+	return _u
+}
+
+func (u *UnionWithVector) SetVectorOfUint8(vectorOfUint8 []uint8) {
+	u.I_unionWithVectorTag = UnionWithVectorVectorOfUint8
+	u.VectorOfUint8 = vectorOfUint8
+}
+
+func UnionWithVectorWithVectorOfUint8(vectorOfUint8 []uint8) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetVectorOfUint8(vectorOfUint8)
+	return _u
+}
+
+func (u *UnionWithVector) SetString(string_ string) {
+	u.I_unionWithVectorTag = UnionWithVectorString
+	u.String = string_
+}
+
+func UnionWithVectorWithString(string_ string) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetString(string_)
+	return _u
+}
+
+func (u *UnionWithVector) SetVectorS3A1(vectorS3A1 []StructSize3Align1) {
+	u.I_unionWithVectorTag = UnionWithVectorVectorS3A1
+	u.VectorS3A1 = vectorS3A1
+}
+
+func UnionWithVectorWithVectorS3A1(vectorS3A1 []StructSize3Align1) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetVectorS3A1(vectorS3A1)
+	return _u
+}
+
+func (u *UnionWithVector) SetVectorS3A2(vectorS3A2 []StructSize3Align2) {
+	u.I_unionWithVectorTag = UnionWithVectorVectorS3A2
+	u.VectorS3A2 = vectorS3A2
+}
+
+func UnionWithVectorWithVectorS3A2(vectorS3A2 []StructSize3Align2) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetVectorS3A2(vectorS3A2)
+	return _u
+}
+
+func (u *UnionWithVector) SetHandles(handles []uint32) {
+	u.I_unionWithVectorTag = UnionWithVectorHandles
+	u.Handles = handles
+}
+
+func UnionWithVectorWithHandles(handles []uint32) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetHandles(handles)
+	return _u
+}
+
+func (u *UnionWithVector) SetArrayS3A1(arrayS3A1 [2]StructSize3Align1) {
+	u.I_unionWithVectorTag = UnionWithVectorArrayS3A1
+	u.ArrayS3A1 = arrayS3A1
+}
+
+func UnionWithVectorWithArrayS3A1(arrayS3A1 [2]StructSize3Align1) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetArrayS3A1(arrayS3A1)
+	return _u
+}
+
+func (u *UnionWithVector) SetArrayS3A2(arrayS3A2 [2]StructSize3Align2) {
+	u.I_unionWithVectorTag = UnionWithVectorArrayS3A2
+	u.ArrayS3A2 = arrayS3A2
+}
+
+func UnionWithVectorWithArrayS3A2(arrayS3A2 [2]StructSize3Align2) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetArrayS3A2(arrayS3A2)
+	return _u
+}
+
+func (u *UnionWithVector) SetVectorUnion(vectorUnion []UnionSize8Align4) {
+	u.I_unionWithVectorTag = UnionWithVectorVectorUnion
+	u.VectorUnion = vectorUnion
+}
+
+func UnionWithVectorWithVectorUnion(vectorUnion []UnionSize8Align4) UnionWithVector {
+	var _u UnionWithVector
+	_u.SetVectorUnion(vectorUnion)
+	return _u
+}
+
+type I_stringUnionTag uint32
+
+const (
+	_ I_stringUnionTag = iota
+	StringUnionUnused
+	StringUnionS
+)
+
+type StringUnion struct {
+	I_stringUnionTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	Unused           uint8  `fidl:"1"`
+	S                string `fidl:"2,"`
+}
+
+func (u *StringUnion) Which() I_stringUnionTag {
+	return u.I_stringUnionTag
+}
+
+func (u *StringUnion) SetUnused(unused uint8) {
+	u.I_stringUnionTag = StringUnionUnused
+	u.Unused = unused
+}
+
+func StringUnionWithUnused(unused uint8) StringUnion {
+	var _u StringUnion
+	_u.SetUnused(unused)
+	return _u
+}
+
+func (u *StringUnion) SetS(s string) {
+	u.I_stringUnionTag = StringUnionS
+	u.S = s
+}
+
+func StringUnionWithS(s string) StringUnion {
+	var _u StringUnion
 	_u.SetS(s)
 	return _u
 }
@@ -1231,6 +2019,169 @@
 	return _u
 }
 
+type I_xUnionWithEmptyStructTag uint32
+
+const (
+	XUnionWithEmptyStruct_unknownData = 0          // 0x00000000
+	XUnionWithEmptyStructS            = 1956241662 // 0x7499e0fe
+)
+
+type XUnionWithEmptyStruct struct {
+	I_xUnionWithEmptyStructTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	I_unknownData              []byte
+	S                          EmptyStruct `fidl:"1956241662"`
+}
+
+func (_m *XUnionWithEmptyStruct) Which() I_xUnionWithEmptyStructTag {
+	switch _m.I_xUnionWithEmptyStructTag {
+	case 1956241662:
+		return XUnionWithEmptyStructS
+	default:
+		return XUnionWithEmptyStruct_unknownData
+	}
+}
+
+func (_m *XUnionWithEmptyStruct) Ordinal() uint32 {
+	return uint32(_m.I_xUnionWithEmptyStructTag)
+}
+
+func (_m *XUnionWithEmptyStruct) SetS(s EmptyStruct) {
+	_m.I_xUnionWithEmptyStructTag = XUnionWithEmptyStructS
+	_m.S = s
+}
+
+func XUnionWithEmptyStructWithS(s EmptyStruct) XUnionWithEmptyStruct {
+	var _u XUnionWithEmptyStruct
+	_u.SetS(s)
+	return _u
+}
+
+type I_xUnionWithStructTag uint32
+
+const (
+	XUnionWithStruct_unknownData = 0         // 0x00000000
+	XUnionWithStructS            = 423517204 // 0x193e5c14
+)
+
+type XUnionWithStruct struct {
+	I_xUnionWithStructTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	I_unknownData         []byte
+	S                     StructSize3Align1 `fidl:"423517204"`
+}
+
+func (_m *XUnionWithStruct) Which() I_xUnionWithStructTag {
+	switch _m.I_xUnionWithStructTag {
+	case 423517204:
+		return XUnionWithStructS
+	default:
+		return XUnionWithStruct_unknownData
+	}
+}
+
+func (_m *XUnionWithStruct) Ordinal() uint32 {
+	return uint32(_m.I_xUnionWithStructTag)
+}
+
+func (_m *XUnionWithStruct) SetS(s StructSize3Align1) {
+	_m.I_xUnionWithStructTag = XUnionWithStructS
+	_m.S = s
+}
+
+func XUnionWithStructWithS(s StructSize3Align1) XUnionWithStruct {
+	var _u XUnionWithStruct
+	_u.SetS(s)
+	return _u
+}
+
+type I_xUnionWithXUnionTag uint32
+
+const (
+	XUnionWithXUnion_unknownData = 0          // 0x00000000
+	XUnionWithXUnionXu           = 1812359455 // 0x6c06691f
+)
+
+type XUnionWithXUnion struct {
+	I_xUnionWithXUnionTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	I_unknownData         []byte
+	Xu                    XUnionWithStruct `fidl:"1812359455"`
+}
+
+func (_m *XUnionWithXUnion) Which() I_xUnionWithXUnionTag {
+	switch _m.I_xUnionWithXUnionTag {
+	case 1812359455:
+		return XUnionWithXUnionXu
+	default:
+		return XUnionWithXUnion_unknownData
+	}
+}
+
+func (_m *XUnionWithXUnion) Ordinal() uint32 {
+	return uint32(_m.I_xUnionWithXUnionTag)
+}
+
+func (_m *XUnionWithXUnion) SetXu(xu XUnionWithStruct) {
+	_m.I_xUnionWithXUnionTag = XUnionWithXUnionXu
+	_m.Xu = xu
+}
+
+func XUnionWithXUnionWithXu(xu XUnionWithStruct) XUnionWithXUnion {
+	var _u XUnionWithXUnion
+	_u.SetXu(xu)
+	return _u
+}
+
+type I_xUnionWithUnionsTag uint32
+
+const (
+	XUnionWithUnions_unknownData = 0          // 0x00000000
+	XUnionWithUnionsU1           = 684009751  // 0x28c52917
+	XUnionWithUnionsU2           = 1971727256 // 0x75862b98
+)
+
+type XUnionWithUnions struct {
+	I_xUnionWithUnionsTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
+	I_unknownData         []byte
+	U1                    UnionSize8Align4  `fidl:"684009751"`
+	U2                    UnionSize12Align4 `fidl:"1971727256"`
+}
+
+func (_m *XUnionWithUnions) Which() I_xUnionWithUnionsTag {
+	switch _m.I_xUnionWithUnionsTag {
+	case 684009751:
+		return XUnionWithUnionsU1
+	case 1971727256:
+		return XUnionWithUnionsU2
+	default:
+		return XUnionWithUnions_unknownData
+	}
+}
+
+func (_m *XUnionWithUnions) Ordinal() uint32 {
+	return uint32(_m.I_xUnionWithUnionsTag)
+}
+
+func (_m *XUnionWithUnions) SetU1(u1 UnionSize8Align4) {
+	_m.I_xUnionWithUnionsTag = XUnionWithUnionsU1
+	_m.U1 = u1
+}
+
+func XUnionWithUnionsWithU1(u1 UnionSize8Align4) XUnionWithUnions {
+	var _u XUnionWithUnions
+	_u.SetU1(u1)
+	return _u
+}
+
+func (_m *XUnionWithUnions) SetU2(u2 UnionSize12Align4) {
+	_m.I_xUnionWithUnionsTag = XUnionWithUnionsU2
+	_m.U2 = u2
+}
+
+func XUnionWithUnionsWithU2(u2 UnionSize12Align4) XUnionWithUnions {
+	var _u XUnionWithUnions
+	_u.SetU2(u2)
+	return _u
+}
+
 type XUnionInTable struct {
 	_             struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
 	Before        string   `fidl:"1,"`
@@ -1313,36 +2264,6 @@
 	u.AfterPresent = false
 }
 
-type TableWithEmptyStruct struct {
-	_        struct{}    `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
-	S        EmptyStruct `fidl:"1"`
-	SPresent bool
-}
-
-func (u *TableWithEmptyStruct) SetS(s EmptyStruct) {
-	u.S = s
-	u.SPresent = true
-}
-
-func (u *TableWithEmptyStruct) GetS() EmptyStruct {
-	return u.S
-}
-
-func (u *TableWithEmptyStruct) GetSWithDefault(_default EmptyStruct) EmptyStruct {
-	if !u.HasS() {
-		return _default
-	}
-	return u.S
-}
-
-func (u *TableWithEmptyStruct) HasS() bool {
-	return u.SPresent
-}
-
-func (u *TableWithEmptyStruct) ClearS() {
-	u.SPresent = false
-}
-
 type SimpleTable struct {
 	_        struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
 	X        int64    `fidl:"1"`
@@ -1481,6 +2402,312 @@
 	u.BazPresent = false
 }
 
+type TableWithEmptyStruct struct {
+	_        struct{}    `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	S        EmptyStruct `fidl:"1"`
+	SPresent bool
+}
+
+func (u *TableWithEmptyStruct) SetS(s EmptyStruct) {
+	u.S = s
+	u.SPresent = true
+}
+
+func (u *TableWithEmptyStruct) GetS() EmptyStruct {
+	return u.S
+}
+
+func (u *TableWithEmptyStruct) GetSWithDefault(_default EmptyStruct) EmptyStruct {
+	if !u.HasS() {
+		return _default
+	}
+	return u.S
+}
+
+func (u *TableWithEmptyStruct) HasS() bool {
+	return u.SPresent
+}
+
+func (u *TableWithEmptyStruct) ClearS() {
+	u.SPresent = false
+}
+
+type TableStructWithReservedSandwich struct {
+	_         struct{}          `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	S1        StructSize3Align1 `fidl:"2"`
+	S1Present bool
+	S2        StructSize3Align1 `fidl:"3"`
+	S2Present bool
+}
+
+func (u *TableStructWithReservedSandwich) SetS1(s1 StructSize3Align1) {
+	u.S1 = s1
+	u.S1Present = true
+}
+
+func (u *TableStructWithReservedSandwich) GetS1() StructSize3Align1 {
+	return u.S1
+}
+
+func (u *TableStructWithReservedSandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
+	if !u.HasS1() {
+		return _default
+	}
+	return u.S1
+}
+
+func (u *TableStructWithReservedSandwich) HasS1() bool {
+	return u.S1Present
+}
+
+func (u *TableStructWithReservedSandwich) ClearS1() {
+	u.S1Present = false
+}
+
+func (u *TableStructWithReservedSandwich) SetS2(s2 StructSize3Align1) {
+	u.S2 = s2
+	u.S2Present = true
+}
+
+func (u *TableStructWithReservedSandwich) GetS2() StructSize3Align1 {
+	return u.S2
+}
+
+func (u *TableStructWithReservedSandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
+	if !u.HasS2() {
+		return _default
+	}
+	return u.S2
+}
+
+func (u *TableStructWithReservedSandwich) HasS2() bool {
+	return u.S2Present
+}
+
+func (u *TableStructWithReservedSandwich) ClearS2() {
+	u.S2Present = false
+}
+
+type TableStructWithUint32Sandwich struct {
+	_         struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	I         uint32   `fidl:"1"`
+	IPresent  bool
+	S1        StructSize3Align1 `fidl:"2"`
+	S1Present bool
+	S2        StructSize3Align1 `fidl:"3"`
+	S2Present bool
+	I2        uint32 `fidl:"4"`
+	I2Present bool
+}
+
+func (u *TableStructWithUint32Sandwich) SetI(i uint32) {
+	u.I = i
+	u.IPresent = true
+}
+
+func (u *TableStructWithUint32Sandwich) GetI() uint32 {
+	return u.I
+}
+
+func (u *TableStructWithUint32Sandwich) GetIWithDefault(_default uint32) uint32 {
+	if !u.HasI() {
+		return _default
+	}
+	return u.I
+}
+
+func (u *TableStructWithUint32Sandwich) HasI() bool {
+	return u.IPresent
+}
+
+func (u *TableStructWithUint32Sandwich) ClearI() {
+	u.IPresent = false
+}
+
+func (u *TableStructWithUint32Sandwich) SetS1(s1 StructSize3Align1) {
+	u.S1 = s1
+	u.S1Present = true
+}
+
+func (u *TableStructWithUint32Sandwich) GetS1() StructSize3Align1 {
+	return u.S1
+}
+
+func (u *TableStructWithUint32Sandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
+	if !u.HasS1() {
+		return _default
+	}
+	return u.S1
+}
+
+func (u *TableStructWithUint32Sandwich) HasS1() bool {
+	return u.S1Present
+}
+
+func (u *TableStructWithUint32Sandwich) ClearS1() {
+	u.S1Present = false
+}
+
+func (u *TableStructWithUint32Sandwich) SetS2(s2 StructSize3Align1) {
+	u.S2 = s2
+	u.S2Present = true
+}
+
+func (u *TableStructWithUint32Sandwich) GetS2() StructSize3Align1 {
+	return u.S2
+}
+
+func (u *TableStructWithUint32Sandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
+	if !u.HasS2() {
+		return _default
+	}
+	return u.S2
+}
+
+func (u *TableStructWithUint32Sandwich) HasS2() bool {
+	return u.S2Present
+}
+
+func (u *TableStructWithUint32Sandwich) ClearS2() {
+	u.S2Present = false
+}
+
+func (u *TableStructWithUint32Sandwich) SetI2(i2 uint32) {
+	u.I2 = i2
+	u.I2Present = true
+}
+
+func (u *TableStructWithUint32Sandwich) GetI2() uint32 {
+	return u.I2
+}
+
+func (u *TableStructWithUint32Sandwich) GetI2WithDefault(_default uint32) uint32 {
+	if !u.HasI2() {
+		return _default
+	}
+	return u.I2
+}
+
+func (u *TableStructWithUint32Sandwich) HasI2() bool {
+	return u.I2Present
+}
+
+func (u *TableStructWithUint32Sandwich) ClearI2() {
+	u.I2Present = false
+}
+
+type TableUnionWithVectorReservedSandwich struct {
+	_         struct{}        `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	Uv        UnionWithVector `fidl:"2"`
+	UvPresent bool
+}
+
+func (u *TableUnionWithVectorReservedSandwich) SetUv(uv UnionWithVector) {
+	u.Uv = uv
+	u.UvPresent = true
+}
+
+func (u *TableUnionWithVectorReservedSandwich) GetUv() UnionWithVector {
+	return u.Uv
+}
+
+func (u *TableUnionWithVectorReservedSandwich) GetUvWithDefault(_default UnionWithVector) UnionWithVector {
+	if !u.HasUv() {
+		return _default
+	}
+	return u.Uv
+}
+
+func (u *TableUnionWithVectorReservedSandwich) HasUv() bool {
+	return u.UvPresent
+}
+
+func (u *TableUnionWithVectorReservedSandwich) ClearUv() {
+	u.UvPresent = false
+}
+
+type TableUnionWithVectorStructSandwich struct {
+	_         struct{}          `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
+	S1        StructSize3Align1 `fidl:"1"`
+	S1Present bool
+	Uv        UnionWithVector `fidl:"2"`
+	UvPresent bool
+	S2        StructSize3Align1 `fidl:"3"`
+	S2Present bool
+}
+
+func (u *TableUnionWithVectorStructSandwich) SetS1(s1 StructSize3Align1) {
+	u.S1 = s1
+	u.S1Present = true
+}
+
+func (u *TableUnionWithVectorStructSandwich) GetS1() StructSize3Align1 {
+	return u.S1
+}
+
+func (u *TableUnionWithVectorStructSandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
+	if !u.HasS1() {
+		return _default
+	}
+	return u.S1
+}
+
+func (u *TableUnionWithVectorStructSandwich) HasS1() bool {
+	return u.S1Present
+}
+
+func (u *TableUnionWithVectorStructSandwich) ClearS1() {
+	u.S1Present = false
+}
+
+func (u *TableUnionWithVectorStructSandwich) SetUv(uv UnionWithVector) {
+	u.Uv = uv
+	u.UvPresent = true
+}
+
+func (u *TableUnionWithVectorStructSandwich) GetUv() UnionWithVector {
+	return u.Uv
+}
+
+func (u *TableUnionWithVectorStructSandwich) GetUvWithDefault(_default UnionWithVector) UnionWithVector {
+	if !u.HasUv() {
+		return _default
+	}
+	return u.Uv
+}
+
+func (u *TableUnionWithVectorStructSandwich) HasUv() bool {
+	return u.UvPresent
+}
+
+func (u *TableUnionWithVectorStructSandwich) ClearUv() {
+	u.UvPresent = false
+}
+
+func (u *TableUnionWithVectorStructSandwich) SetS2(s2 StructSize3Align1) {
+	u.S2 = s2
+	u.S2Present = true
+}
+
+func (u *TableUnionWithVectorStructSandwich) GetS2() StructSize3Align1 {
+	return u.S2
+}
+
+func (u *TableUnionWithVectorStructSandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
+	if !u.HasS2() {
+		return _default
+	}
+	return u.S2
+}
+
+func (u *TableUnionWithVectorStructSandwich) HasS2() bool {
+	return u.S2Present
+}
+
+func (u *TableUnionWithVectorStructSandwich) ClearS2() {
+	u.S2Present = false
+}
+
 type EthernetDeviceInterface _bindings.ChannelProxy
 
 type EthernetDevice interface {
diff --git a/src/syscall/zx/fidl/encoding_new.go b/src/syscall/zx/fidl/encoding_new.go
index 9e35dd7..650243d 100644
--- a/src/syscall/zx/fidl/encoding_new.go
+++ b/src/syscall/zx/fidl/encoding_new.go
@@ -261,14 +261,16 @@
 			alignmentV1:  alignmentV1,
 		}, nil
 	case unionTag:
-		return mUnion{
+		m := mUnion{
 			fields:       fields,
 			ordinals:     ordinals,
 			sizeOld:      sizeOld,
 			alignmentOld: alignmentOld,
 			sizeV1:       sizeV1,
 			alignmentV1:  alignmentV1,
-		}, nil
+		}
+		m.mXUnion = mUnionToMXUnion(m)
+		return m, nil
 	case xunionTag, strictXunionTag:
 		strictness := strictness(kind == strictXunionTag)
 
@@ -298,6 +300,20 @@
 	}
 }
 
+func mUnionToMXUnion(m mUnion) mXUnion {
+	ordinalToFields := make(map[int]mField)
+	for i := 0; i < len(m.fields); i++ {
+		ordinalToFields[m.ordinals[i]] = m.fields[i]
+	}
+	return mXUnion{
+		fields:        ordinalToFields,
+		unionToXunion: true,
+		sizeV1:        m.sizeV1,
+		alignmentV1:   m.alignmentV1,
+		strictness:    true,
+	}
+}
+
 func readIntTag(field reflect.StructField, tagKey string) (int, error) {
 	content, ok := field.Tag.Lookup(tagKey)
 	if !ok {
@@ -455,19 +471,25 @@
 	case mVector:
 		return mOptVector(m), nil
 	case mEmptyStruct:
-		return mOptStructUnion{
+		return mPointer{
 			Marshaler: m,
 			elemTyp:   typ,
 		}, nil
 	case mStruct:
-		return mOptStructUnion{
+		return mPointer{
 			Marshaler: m,
 			elemTyp:   typ,
 		}, nil
 	case mUnion:
-		return mOptStructUnion{
-			Marshaler: m,
-			elemTyp:   typ,
+		return mOptUnion{
+			mPointer: mPointer{
+				Marshaler: m,
+				elemTyp:   typ,
+			},
+			mOptXUnion: mOptXUnion{
+				mXUnion: m.mXUnion,
+				typ:     typ,
+			},
 		}, nil
 	case mXUnion:
 		return mOptXUnion{
@@ -506,7 +528,8 @@
 	mXUnion{},
 	mOptXUnion{},
 	mTable{},
-	mOptStructUnion{},
+	mPointer{},
+	mOptUnion{},
 	mArray{},
 	mVector{},
 	mOptVector{},
@@ -633,6 +656,8 @@
 	ordinals              []int
 	sizeOld, alignmentOld int
 	sizeV1, alignmentV1   int
+
+	mXUnion
 }
 
 func (m mUnion) getMarshalSize(ctx MarshalerContext) int {
@@ -665,7 +690,7 @@
 
 func (m mUnion) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
 	if ctx.EncodeUnionsAsXUnionBytes {
-		return m.marshalAsXUnion(ctx, v, out)
+		return m.mXUnion.marshal(ctx, v, out)
 	}
 
 	// Kind.
@@ -692,38 +717,9 @@
 	return nil
 }
 
-func (m mUnion) marshalAsXUnion(ctx MarshalerContext, v reflect.Value, out *encoder) error {
-	// Ordinal.
-	fieldTag := int(v.Field(0).Uint())
-	ordinal, err := strconv.ParseInt(v.Type().Field(fieldTag).Tag.Get("fidl"), 0, 64)
-	if err != nil {
-		return errors.New("error parsing ordinal from tag: " + err.Error())
-	}
-	out.writeUint(uint64(ordinal), 8)
-	// Field.
-	field := m.fields[fieldTag-1]
-	if err := marshalEnvelopePresent(ctx, field, v.Field(field.index), out); err != nil {
-		return err
-	}
-	return nil
-}
-
 func (m mUnion) unmarshal(ctx MarshalerContext, in *decoder, v reflect.Value) error {
 	if ctx.DecodeUnionsFromXUnionBytes {
-		ordinalToFields := make(map[int]mField)
-		for i := 0; i < len(m.fields); i++ {
-			ordinalToFields[m.ordinals[i]] = m.fields[i]
-		}
-		// Just use the xunion unmarshaler because the layout of union and xunion
-		// is the same in go.
-		xunion := mXUnion{
-			fields:        ordinalToFields,
-			unionToXunion: true,
-			sizeV1:        m.sizeV1,
-			alignmentV1:   m.alignmentV1,
-			strictness:    true,
-		}
-		return xunion.unmarshal(ctx, in, v)
+		return m.mXUnion.unmarshal(ctx, in, v)
 	}
 
 	// Save the head for proper padding.
@@ -1211,20 +1207,20 @@
 	return nil
 }
 
-type mOptStructUnion struct {
+type mPointer struct {
 	Marshaler
 	elemTyp reflect.Type
 }
 
-func (m mOptStructUnion) getMarshalSize(ctx MarshalerContext) int {
+func (m mPointer) getMarshalSize(ctx MarshalerContext) int {
 	return 8
 }
 
-func (m mOptStructUnion) getUnmarshalSize(ctx MarshalerContext) int {
+func (m mPointer) getUnmarshalSize(ctx MarshalerContext) int {
 	return 8
 }
 
-func (m mOptStructUnion) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
+func (m mPointer) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
 	// Nil?
 	if v.IsNil() {
 		out.writeUint(noAlloc, 8)
@@ -1249,7 +1245,7 @@
 	return nil
 }
 
-func (m mOptStructUnion) unmarshal(ctx MarshalerContext, in *decoder, v reflect.Value) error {
+func (m mPointer) unmarshal(ctx MarshalerContext, in *decoder, v reflect.Value) error {
 	// Nil?
 	ptr, err := in.readUint(8)
 	if err != nil {
@@ -1284,6 +1280,41 @@
 	return nil
 }
 
+type mOptUnion struct {
+	mPointer
+	mOptXUnion
+}
+
+func (m mOptUnion) getMarshalSize(ctx MarshalerContext) int {
+	if ctx.EncodeUnionsAsXUnionBytes {
+		return 24
+	}
+	return 8
+}
+
+func (m mOptUnion) getUnmarshalSize(ctx MarshalerContext) int {
+	if ctx.DecodeUnionsFromXUnionBytes {
+		return 24
+	}
+	return 8
+}
+
+func (m mOptUnion) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
+	if ctx.EncodeUnionsAsXUnionBytes {
+		return m.mOptXUnion.marshal(ctx, v, out)
+	} else {
+		return m.mPointer.marshal(ctx, v, out)
+	}
+}
+
+func (m mOptUnion) unmarshal(ctx MarshalerContext, in *decoder, v reflect.Value) error {
+	if ctx.DecodeUnionsFromXUnionBytes {
+		return m.mOptXUnion.unmarshal(ctx, in, v)
+	} else {
+		return m.mPointer.unmarshal(ctx, in, v)
+	}
+}
+
 type mArray struct {
 	Marshaler
 	size int
diff --git a/src/syscall/zx/fidl/fidl_test/conformance_test.go b/src/syscall/zx/fidl/fidl_test/conformance_test.go
index 5246cd5..ba494c7 100644
--- a/src/syscall/zx/fidl/fidl_test/conformance_test.go
+++ b/src/syscall/zx/fidl/fidl_test/conformance_test.go
@@ -1574,6 +1574,1917 @@
 	}
 
 	{
+		v1 := conformance.Sandwich1{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize8Align4{}
+		var v4 uint32 = 202050057
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		encodeSuccessCase{
+			name: "Sandwich1Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x07, 0x08,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich1{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize8Align4{}
+		var v4 uint32 = 202050057
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		encodeSuccessCase{
+			name: "Sandwich1Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich2{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize12Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := [6]uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVariant(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		encodeSuccessCase{
+			name: "Sandwich2Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich2{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize12Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := [6]uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVariant(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		encodeSuccessCase{
+			name: "Sandwich2Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich3{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize24Align8{}
+		v4 := conformance.StructSize16Align8{}
+		var v5 uint64 = 12080525177006498208
+		v4.F1 = v5
+		var v6 uint64 = 12659246559711111592
+		v4.F2 = v6
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		encodeSuccessCase{
+			name: "Sandwich3Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich3{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize24Align8{}
+		v4 := conformance.StructSize16Align8{}
+		var v5 uint64 = 12080525177006498208
+		v4.F1 = v5
+		var v6 uint64 = 12659246559711111592
+		v4.F2 = v6
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		encodeSuccessCase{
+			name: "Sandwich3Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich4{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize36Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		var v10 uint8 = 166
+		var v11 uint8 = 167
+		var v12 uint8 = 168
+		var v13 uint8 = 169
+		var v14 uint8 = 170
+		var v15 uint8 = 171
+		var v16 uint8 = 172
+		var v17 uint8 = 173
+		var v18 uint8 = 174
+		var v19 uint8 = 175
+		var v20 uint8 = 176
+		var v21 uint8 = 177
+		var v22 uint8 = 178
+		var v23 uint8 = 179
+		var v24 uint8 = 180
+		var v25 uint8 = 181
+		var v26 uint8 = 182
+		var v27 uint8 = 183
+		var v28 uint8 = 184
+		var v29 uint8 = 185
+		var v30 uint8 = 186
+		var v31 uint8 = 187
+		var v32 uint8 = 188
+		var v33 uint8 = 189
+		var v34 uint8 = 190
+		var v35 uint8 = 191
+		v36 := [32]uint8{v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35}
+		v3.SetVariant(v36)
+		v1.TheUnion = v3
+		var v37 uint32 = 134678021
+		v1.After = v37
+
+		encodeSuccessCase{
+			name: "Sandwich4Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+				0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich4{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize36Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		var v10 uint8 = 166
+		var v11 uint8 = 167
+		var v12 uint8 = 168
+		var v13 uint8 = 169
+		var v14 uint8 = 170
+		var v15 uint8 = 171
+		var v16 uint8 = 172
+		var v17 uint8 = 173
+		var v18 uint8 = 174
+		var v19 uint8 = 175
+		var v20 uint8 = 176
+		var v21 uint8 = 177
+		var v22 uint8 = 178
+		var v23 uint8 = 179
+		var v24 uint8 = 180
+		var v25 uint8 = 181
+		var v26 uint8 = 182
+		var v27 uint8 = 183
+		var v28 uint8 = 184
+		var v29 uint8 = 185
+		var v30 uint8 = 186
+		var v31 uint8 = 187
+		var v32 uint8 = 188
+		var v33 uint8 = 189
+		var v34 uint8 = 190
+		var v35 uint8 = 191
+		v36 := [32]uint8{v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35}
+		v3.SetVariant(v36)
+		v1.TheUnion = v3
+		var v37 uint32 = 134678021
+		v1.After = v37
+
+		encodeSuccessCase{
+			name: "Sandwich4Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+				0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v3.SetSize8align4(v4)
+		v1.UnionOfUnion = v3
+		var v6 uint32 = 134678021
+		v1.After = v6
+
+		encodeSuccessCase{
+			name: "Sandwich5Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x09, 0x0a, 0x0b, 0x0c,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v3.SetSize8align4(v4)
+		v1.UnionOfUnion = v3
+		var v6 uint32 = 134678021
+		v1.After = v6
+
+		encodeSuccessCase{
+			name: "Sandwich5Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize24Align8{}
+		v5 := conformance.StructSize16Align8{}
+		var v6 uint64 = 12080525177006498208
+		v5.F1 = v6
+		var v7 uint64 = 12659246559711111592
+		v5.F2 = v7
+		v4.SetVariant(v5)
+		v3.SetSize24align8(v4)
+		v1.UnionOfUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		encodeSuccessCase{
+			name: "Sandwich5Case2",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize24Align8{}
+		v5 := conformance.StructSize16Align8{}
+		var v6 uint64 = 12080525177006498208
+		v5.F1 = v6
+		var v7 uint64 = 12659246559711111592
+		v5.F2 = v7
+		v4.SetVariant(v5)
+		v3.SetSize24align8(v4)
+		v1.UnionOfUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		encodeSuccessCase{
+			name: "Sandwich5Case2_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := []uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVectorOfUint8(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		encodeSuccessCase{
+			name: "Sandwich6Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := []uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVectorOfUint8(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		encodeSuccessCase{
+			name: "Sandwich6Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := []uint8{}
+		v3.SetVectorOfUint8(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		encodeSuccessCase{
+			name: "Sandwich6Case1AbsentVector",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := []uint8{}
+		v3.SetVectorOfUint8(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		encodeSuccessCase{
+			name: "Sandwich6Case1AbsentVector_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := "soft migrations rock!"
+		v3.SetString(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		encodeSuccessCase{
+			name: "Sandwich6Case2",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x73, 0x6f, 0x66, 0x74, 0x20, 0x6d, 0x69, 0x67,
+				0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+				0x72, 0x6f, 0x63, 0x6b, 0x21, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := "soft migrations rock!"
+		v3.SetString(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		encodeSuccessCase{
+			name: "Sandwich6Case2_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x6f, 0x66, 0x74, 0x20, 0x6d, 0x69, 0x67,
+				0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+				0x72, 0x6f, 0x63, 0x6b, 0x21, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 115
+		var v6 uint8 = 111
+		var v7 uint8 = 102
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 32
+		var v11 uint8 = 109
+		var v12 uint8 = 105
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := conformance.StructSize3Align1{}
+		var v15 uint8 = 114
+		var v16 uint8 = 97
+		var v17 uint8 = 116
+		v18 := [3]uint8{v15, v16, v17}
+		v14.ThreeBytes = v18
+		v19 := []conformance.StructSize3Align1{v4, v9, v14}
+		v3.SetVectorS3A1(v19)
+		v1.TheUnion = v3
+		var v20 uint32 = 134678021
+		v1.After = v20
+
+		encodeSuccessCase{
+			name: "Sandwich6Case3",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x73, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x72, 0x61,
+				0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 115
+		var v6 uint8 = 111
+		var v7 uint8 = 102
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 32
+		var v11 uint8 = 109
+		var v12 uint8 = 105
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := conformance.StructSize3Align1{}
+		var v15 uint8 = 114
+		var v16 uint8 = 97
+		var v17 uint8 = 116
+		v18 := [3]uint8{v15, v16, v17}
+		v14.ThreeBytes = v18
+		v19 := []conformance.StructSize3Align1{v4, v9, v14}
+		v3.SetVectorS3A1(v19)
+		v1.TheUnion = v3
+		var v20 uint32 = 134678021
+		v1.After = v20
+
+		encodeSuccessCase{
+			name: "Sandwich6Case3_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x72, 0x61,
+				0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 28531
+		v4.F1 = v5
+		var v6 uint8 = 102
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 27936
+		v7.F1 = v8
+		var v9 uint8 = 105
+		v7.F2 = v9
+		v10 := conformance.StructSize3Align2{}
+		var v11 uint16 = 24946
+		v10.F1 = v11
+		var v12 uint8 = 116
+		v10.F2 = v12
+		v13 := []conformance.StructSize3Align2{v4, v7, v10}
+		v3.SetVectorS3A2(v13)
+		v1.TheUnion = v3
+		var v14 uint32 = 134678021
+		v1.After = v14
+
+		encodeSuccessCase{
+			name: "Sandwich6Case4",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x73, 0x6f, 0x66, 0x00, 0x20, 0x6d, 0x69, 0x00,
+				0x72, 0x61, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 28531
+		v4.F1 = v5
+		var v6 uint8 = 102
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 27936
+		v7.F1 = v8
+		var v9 uint8 = 105
+		v7.F2 = v9
+		v10 := conformance.StructSize3Align2{}
+		var v11 uint16 = 24946
+		v10.F1 = v11
+		var v12 uint8 = 116
+		v10.F2 = v12
+		v13 := []conformance.StructSize3Align2{v4, v7, v10}
+		v3.SetVectorS3A2(v13)
+		v1.TheUnion = v3
+		var v14 uint32 = 134678021
+		v1.After = v14
+
+		encodeSuccessCase{
+			name: "Sandwich6Case4_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x6f, 0x66, 0x00, 0x20, 0x6d, 0x69, 0x00,
+				0x72, 0x61, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint32 = 4294967295
+		var v5 uint32 = 4294967295
+		var v6 uint32 = 4294967295
+		v7 := []uint32{v4, v5, v6}
+		v3.SetHandles(v7)
+		v1.TheUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		encodeSuccessCase{
+			name: "Sandwich6Case5",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint32 = 4294967295
+		var v5 uint32 = 4294967295
+		var v6 uint32 = 4294967295
+		v7 := []uint32{v4, v5, v6}
+		v3.SetHandles(v7)
+		v1.TheUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		encodeSuccessCase{
+			name: "Sandwich6Case5_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 164
+		var v11 uint8 = 165
+		var v12 uint8 = 166
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := [2]conformance.StructSize3Align1{v4, v9}
+		v3.SetArrayS3A1(v14)
+		v1.TheUnion = v3
+		var v15 uint32 = 134678021
+		v1.After = v15
+
+		encodeSuccessCase{
+			name: "Sandwich6Case6",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 164
+		var v11 uint8 = 165
+		var v12 uint8 = 166
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := [2]conformance.StructSize3Align1{v4, v9}
+		v3.SetArrayS3A1(v14)
+		v1.TheUnion = v3
+		var v15 uint32 = 134678021
+		v1.After = v15
+
+		encodeSuccessCase{
+			name: "Sandwich6Case6_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 41633
+		v4.F1 = v5
+		var v6 uint8 = 163
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 42404
+		v7.F1 = v8
+		var v9 uint8 = 166
+		v7.F2 = v9
+		v10 := [2]conformance.StructSize3Align2{v4, v7}
+		v3.SetArrayS3A2(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		encodeSuccessCase{
+			name: "Sandwich6Case7",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0x00, 0xa4, 0xa5, 0xa6, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 41633
+		v4.F1 = v5
+		var v6 uint8 = 163
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 42404
+		v7.F1 = v8
+		var v9 uint8 = 166
+		v7.F2 = v9
+		v10 := [2]conformance.StructSize3Align2{v4, v7}
+		v3.SetArrayS3A2(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		encodeSuccessCase{
+			name: "Sandwich6Case7_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0x00, 0xa4, 0xa5, 0xa6, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v6 := []conformance.UnionSize8Align4{v4}
+		v3.SetVectorUnion(v6)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		encodeSuccessCase{
+			name: "Sandwich6Case8",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x09, 0x0a, 0x0b, 0x0c,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v6 := []conformance.UnionSize8Align4{v4}
+		v3.SetVectorUnion(v6)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		encodeSuccessCase{
+			name: "Sandwich6Case8_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithReservedSandwichStruct{}
+		v2 := conformance.TableStructWithReservedSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 9
+		var v5 uint8 = 10
+		var v6 uint8 = 11
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.StructSize3Align1{}
+		var v9 uint8 = 25
+		var v10 uint8 = 26
+		var v11 uint8 = 27
+		v12 := [3]uint8{v9, v10, v11}
+		v8.ThreeBytes = v12
+		v2.SetS2(v8)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_StructWithReservedSandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithReservedSandwichStruct{}
+		v2 := conformance.TableStructWithReservedSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 9
+		var v5 uint8 = 10
+		var v6 uint8 = 11
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.StructSize3Align1{}
+		var v9 uint8 = 25
+		var v10 uint8 = 26
+		var v11 uint8 = 27
+		v12 := [3]uint8{v9, v10, v11}
+		v8.ThreeBytes = v12
+		v2.SetS2(v8)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_StructWithReservedSandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithUint32SandwichStruct{}
+		v2 := conformance.TableStructWithUint32Sandwich{}
+		var v3 uint32 = 67305985
+		v2.SetI(v3)
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 9
+		var v6 uint8 = 10
+		var v7 uint8 = 11
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v2.SetS1(v4)
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 25
+		var v11 uint8 = 26
+		var v12 uint8 = 27
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v2.SetS2(v9)
+		var v14 uint32 = 218893066
+		v2.SetI2(v14)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_StructWithUint32Sandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithUint32SandwichStruct{}
+		v2 := conformance.TableStructWithUint32Sandwich{}
+		var v3 uint32 = 67305985
+		v2.SetI(v3)
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 9
+		var v6 uint8 = 10
+		var v7 uint8 = 11
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v2.SetS1(v4)
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 25
+		var v11 uint8 = 26
+		var v12 uint8 = 27
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v2.SetS2(v9)
+		var v14 uint32 = 218893066
+		v2.SetI2(v14)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_StructWithUint32Sandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorReservedSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorReservedSandwich{}
+		v3 := conformance.UnionWithVector{}
+		v4 := "hello"
+		v3.SetString(v4)
+		v2.SetUv(v3)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_UnionWithVector_ReservedSandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorReservedSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorReservedSandwich{}
+		v3 := conformance.UnionWithVector{}
+		v4 := "hello"
+		v3.SetString(v4)
+		v2.SetUv(v3)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_UnionWithVector_ReservedSandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorStructSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorStructSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.UnionWithVector{}
+		v9 := "hello"
+		v8.SetString(v9)
+		v2.SetUv(v8)
+		v10 := conformance.StructSize3Align1{}
+		var v11 uint8 = 4
+		var v12 uint8 = 5
+		var v13 uint8 = 6
+		v14 := [3]uint8{v11, v12, v13}
+		v10.ThreeBytes = v14
+		v2.SetS2(v10)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_UnionWithVector_StructSandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+				0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorStructSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorStructSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.UnionWithVector{}
+		v9 := "hello"
+		v8.SetString(v9)
+		v2.SetUv(v8)
+		v10 := conformance.StructSize3Align1{}
+		var v11 uint8 = 4
+		var v12 uint8 = 5
+		var v13 uint8 = 6
+		v14 := [3]uint8{v11, v12, v13}
+		v10.ThreeBytes = v14
+		v2.SetS2(v10)
+		v1.Table = v2
+
+		encodeSuccessCase{
+			name: "Table_UnionWithVector_StructSandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+				0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.XUnionWithStructStruct{}
+		v2 := conformance.XUnionWithStruct{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS(v3)
+		v1.Xu = v2
+
+		encodeSuccessCase{
+			name: "XUnionWithStruct",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x14, 0x5c, 0x3e, 0x19, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.XUnionWithStructStruct{}
+		v2 := conformance.XUnionWithStruct{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS(v3)
+		v1.Xu = v2
+
+		encodeSuccessCase{
+			name: "XUnionWithStruct_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x14, 0x5c, 0x3e, 0x19, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.ArrayStruct{}
+		v2 := conformance.StringUnion{}
+		v3 := "one"
+		v2.SetS(v3)
+		v4 := conformance.StringUnion{}
+		v5 := "two"
+		v4.SetS(v5)
+		v6 := conformance.StringUnion{}
+		v7 := "three"
+		v6.SetS(v7)
+		v8 := [3]conformance.StringUnion{v2, v4, v6}
+		v1.Unions = v8
+		v9 := &conformance.StringUnion{}
+		v10 := "four"
+		v9.SetS(v10)
+		v11 := &conformance.StringUnion{}
+		v12 := "five"
+		v11.SetS(v12)
+		v13 := &conformance.StringUnion{}
+		v14 := "six"
+		v13.SetS(v14)
+		v15 := [3]*conformance.StringUnion{v9, v11, v13}
+		v1.OptionalUnions = v15
+
+		encodeSuccessCase{
+			name: "ArrayStruct",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x6f, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x74, 0x77, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x6f, 0x75, 0x72, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x69, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.ArrayStruct{}
+		v2 := conformance.StringUnion{}
+		v3 := "one"
+		v2.SetS(v3)
+		v4 := conformance.StringUnion{}
+		v5 := "two"
+		v4.SetS(v5)
+		v6 := conformance.StringUnion{}
+		v7 := "three"
+		v6.SetS(v7)
+		v8 := [3]conformance.StringUnion{v2, v4, v6}
+		v1.Unions = v8
+		v9 := &conformance.StringUnion{}
+		v10 := "four"
+		v9.SetS(v10)
+		v11 := &conformance.StringUnion{}
+		v12 := "five"
+		v11.SetS(v12)
+		v13 := &conformance.StringUnion{}
+		v14 := "six"
+		v13.SetS(v14)
+		v15 := [3]*conformance.StringUnion{v9, v11, v13}
+		v1.OptionalUnions = v15
+
+		encodeSuccessCase{
+			name: "ArrayStruct_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x6f, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x74, 0x77, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x6f, 0x75, 0x72, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x69, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression1{}
+		var v2 uint8 = 1
+		v1.F1 = v2
+		var v3 uint32 = 2
+		v1.F2 = v3
+		var v4 uint8 = 3
+		v1.F3 = v4
+		var v5 uint16 = 4
+		v1.F4 = v5
+		var v6 uint64 = 5
+		v1.F5 = v6
+		var v7 uint8 = 6
+		v1.F6 = v7
+
+		encodeSuccessCase{
+			name: "Regression1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression1{}
+		var v2 uint8 = 1
+		v1.F1 = v2
+		var v3 uint32 = 2
+		v1.F2 = v3
+		var v4 uint8 = 3
+		v1.F3 = v4
+		var v5 uint16 = 4
+		v1.F4 = v5
+		var v6 uint64 = 5
+		v1.F5 = v6
+		var v7 uint8 = 6
+		v1.F6 = v7
+
+		encodeSuccessCase{
+			name: "Regression1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression2{}
+		v2 := conformance.Regression1{}
+		var v3 uint8 = 1
+		v2.F1 = v3
+		var v4 uint32 = 2
+		v2.F2 = v4
+		var v5 uint8 = 3
+		v2.F3 = v5
+		var v6 uint16 = 4
+		v2.F4 = v6
+		var v7 uint64 = 5
+		v2.F5 = v7
+		var v8 uint8 = 6
+		v2.F6 = v8
+		v1.Head = v2
+		var v9 uint8 = 7
+		v1.F7 = v9
+
+		encodeSuccessCase{
+			name: "Regression2",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression2{}
+		v2 := conformance.Regression1{}
+		var v3 uint8 = 1
+		v2.F1 = v3
+		var v4 uint32 = 2
+		v2.F2 = v4
+		var v5 uint8 = 3
+		v2.F3 = v5
+		var v6 uint16 = 4
+		v2.F4 = v6
+		var v7 uint64 = 5
+		v2.F5 = v7
+		var v8 uint8 = 6
+		v2.F6 = v8
+		v1.Head = v2
+		var v9 uint8 = 7
+		v1.F7 = v9
+
+		encodeSuccessCase{
+			name: "Regression2_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+
+		encodeSuccessCase{
+			name: "Regression3Absent",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+
+		encodeSuccessCase{
+			name: "Regression3Absent_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+		v2 := &conformance.Regression2{}
+		v3 := conformance.Regression1{}
+		var v4 uint8 = 1
+		v3.F1 = v4
+		var v5 uint32 = 2
+		v3.F2 = v5
+		var v6 uint8 = 3
+		v3.F3 = v6
+		var v7 uint16 = 4
+		v3.F4 = v7
+		var v8 uint64 = 5
+		v3.F5 = v8
+		var v9 uint8 = 6
+		v3.F6 = v9
+		v2.Head = v3
+		var v10 uint8 = 7
+		v2.F7 = v10
+		v1.OptValue = v2
+
+		encodeSuccessCase{
+			name: "Regression3Present",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+		v2 := &conformance.Regression2{}
+		v3 := conformance.Regression1{}
+		var v4 uint8 = 1
+		v3.F1 = v4
+		var v5 uint32 = 2
+		v3.F2 = v5
+		var v6 uint8 = 3
+		v3.F3 = v6
+		var v7 uint16 = 4
+		v3.F4 = v7
+		var v8 uint64 = 5
+		v3.F5 = v8
+		var v9 uint8 = 6
+		v3.F6 = v9
+		v2.Head = v3
+		var v10 uint8 = 7
+		v2.F7 = v10
+		v1.OptValue = v2
+
+		encodeSuccessCase{
+			name: "Regression3Present_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
 		v1 := conformance.UnionWithBoundStringStruct{}
 		v2 := conformance.UnionWithBoundString{}
 		v3 := "abcd"
@@ -3510,6 +5421,1917 @@
 	}
 
 	{
+		v1 := conformance.Sandwich1{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize8Align4{}
+		var v4 uint32 = 202050057
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		decodeSuccessCase{
+			name: "Sandwich1Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x07, 0x08,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich1{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize8Align4{}
+		var v4 uint32 = 202050057
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		decodeSuccessCase{
+			name: "Sandwich1Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich2{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize12Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := [6]uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVariant(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		decodeSuccessCase{
+			name: "Sandwich2Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich2{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize12Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := [6]uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVariant(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		decodeSuccessCase{
+			name: "Sandwich2Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich3{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize24Align8{}
+		v4 := conformance.StructSize16Align8{}
+		var v5 uint64 = 12080525177006498208
+		v4.F1 = v5
+		var v6 uint64 = 12659246559711111592
+		v4.F2 = v6
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		decodeSuccessCase{
+			name: "Sandwich3Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich3{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize24Align8{}
+		v4 := conformance.StructSize16Align8{}
+		var v5 uint64 = 12080525177006498208
+		v4.F1 = v5
+		var v6 uint64 = 12659246559711111592
+		v4.F2 = v6
+		v3.SetVariant(v4)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		decodeSuccessCase{
+			name: "Sandwich3Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich4{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize36Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		var v10 uint8 = 166
+		var v11 uint8 = 167
+		var v12 uint8 = 168
+		var v13 uint8 = 169
+		var v14 uint8 = 170
+		var v15 uint8 = 171
+		var v16 uint8 = 172
+		var v17 uint8 = 173
+		var v18 uint8 = 174
+		var v19 uint8 = 175
+		var v20 uint8 = 176
+		var v21 uint8 = 177
+		var v22 uint8 = 178
+		var v23 uint8 = 179
+		var v24 uint8 = 180
+		var v25 uint8 = 181
+		var v26 uint8 = 182
+		var v27 uint8 = 183
+		var v28 uint8 = 184
+		var v29 uint8 = 185
+		var v30 uint8 = 186
+		var v31 uint8 = 187
+		var v32 uint8 = 188
+		var v33 uint8 = 189
+		var v34 uint8 = 190
+		var v35 uint8 = 191
+		v36 := [32]uint8{v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35}
+		v3.SetVariant(v36)
+		v1.TheUnion = v3
+		var v37 uint32 = 134678021
+		v1.After = v37
+
+		decodeSuccessCase{
+			name: "Sandwich4Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+				0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich4{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionSize36Align4{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		var v10 uint8 = 166
+		var v11 uint8 = 167
+		var v12 uint8 = 168
+		var v13 uint8 = 169
+		var v14 uint8 = 170
+		var v15 uint8 = 171
+		var v16 uint8 = 172
+		var v17 uint8 = 173
+		var v18 uint8 = 174
+		var v19 uint8 = 175
+		var v20 uint8 = 176
+		var v21 uint8 = 177
+		var v22 uint8 = 178
+		var v23 uint8 = 179
+		var v24 uint8 = 180
+		var v25 uint8 = 181
+		var v26 uint8 = 182
+		var v27 uint8 = 183
+		var v28 uint8 = 184
+		var v29 uint8 = 185
+		var v30 uint8 = 186
+		var v31 uint8 = 187
+		var v32 uint8 = 188
+		var v33 uint8 = 189
+		var v34 uint8 = 190
+		var v35 uint8 = 191
+		v36 := [32]uint8{v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35}
+		v3.SetVariant(v36)
+		v1.TheUnion = v3
+		var v37 uint32 = 134678021
+		v1.After = v37
+
+		decodeSuccessCase{
+			name: "Sandwich4Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+				0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v3.SetSize8align4(v4)
+		v1.UnionOfUnion = v3
+		var v6 uint32 = 134678021
+		v1.After = v6
+
+		decodeSuccessCase{
+			name: "Sandwich5Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x09, 0x0a, 0x0b, 0x0c,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v3.SetSize8align4(v4)
+		v1.UnionOfUnion = v3
+		var v6 uint32 = 134678021
+		v1.After = v6
+
+		decodeSuccessCase{
+			name: "Sandwich5Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize24Align8{}
+		v5 := conformance.StructSize16Align8{}
+		var v6 uint64 = 12080525177006498208
+		v5.F1 = v6
+		var v7 uint64 = 12659246559711111592
+		v5.F2 = v7
+		v4.SetVariant(v5)
+		v3.SetSize24align8(v4)
+		v1.UnionOfUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		decodeSuccessCase{
+			name: "Sandwich5Case2",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich5{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionOfUnion{}
+		v4 := conformance.UnionSize24Align8{}
+		v5 := conformance.StructSize16Align8{}
+		var v6 uint64 = 12080525177006498208
+		v5.F1 = v6
+		var v7 uint64 = 12659246559711111592
+		v5.F2 = v7
+		v4.SetVariant(v5)
+		v3.SetSize24align8(v4)
+		v1.UnionOfUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		decodeSuccessCase{
+			name: "Sandwich5Case2_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+				0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := []uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVectorOfUint8(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		decodeSuccessCase{
+			name: "Sandwich6Case1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint8 = 160
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		var v8 uint8 = 164
+		var v9 uint8 = 165
+		v10 := []uint8{v4, v5, v6, v7, v8, v9}
+		v3.SetVectorOfUint8(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		decodeSuccessCase{
+			name: "Sandwich6Case1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := []uint8{}
+		v3.SetVectorOfUint8(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		decodeSuccessCase{
+			name: "Sandwich6Case1AbsentVector",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := []uint8{}
+		v3.SetVectorOfUint8(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		decodeSuccessCase{
+			name: "Sandwich6Case1AbsentVector_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := "soft migrations rock!"
+		v3.SetString(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		decodeSuccessCase{
+			name: "Sandwich6Case2",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x73, 0x6f, 0x66, 0x74, 0x20, 0x6d, 0x69, 0x67,
+				0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+				0x72, 0x6f, 0x63, 0x6b, 0x21, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := "soft migrations rock!"
+		v3.SetString(v4)
+		v1.TheUnion = v3
+		var v5 uint32 = 134678021
+		v1.After = v5
+
+		decodeSuccessCase{
+			name: "Sandwich6Case2_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x6f, 0x66, 0x74, 0x20, 0x6d, 0x69, 0x67,
+				0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+				0x72, 0x6f, 0x63, 0x6b, 0x21, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 115
+		var v6 uint8 = 111
+		var v7 uint8 = 102
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 32
+		var v11 uint8 = 109
+		var v12 uint8 = 105
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := conformance.StructSize3Align1{}
+		var v15 uint8 = 114
+		var v16 uint8 = 97
+		var v17 uint8 = 116
+		v18 := [3]uint8{v15, v16, v17}
+		v14.ThreeBytes = v18
+		v19 := []conformance.StructSize3Align1{v4, v9, v14}
+		v3.SetVectorS3A1(v19)
+		v1.TheUnion = v3
+		var v20 uint32 = 134678021
+		v1.After = v20
+
+		decodeSuccessCase{
+			name: "Sandwich6Case3",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x73, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x72, 0x61,
+				0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 115
+		var v6 uint8 = 111
+		var v7 uint8 = 102
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 32
+		var v11 uint8 = 109
+		var v12 uint8 = 105
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := conformance.StructSize3Align1{}
+		var v15 uint8 = 114
+		var v16 uint8 = 97
+		var v17 uint8 = 116
+		v18 := [3]uint8{v15, v16, v17}
+		v14.ThreeBytes = v18
+		v19 := []conformance.StructSize3Align1{v4, v9, v14}
+		v3.SetVectorS3A1(v19)
+		v1.TheUnion = v3
+		var v20 uint32 = 134678021
+		v1.After = v20
+
+		decodeSuccessCase{
+			name: "Sandwich6Case3_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x72, 0x61,
+				0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 28531
+		v4.F1 = v5
+		var v6 uint8 = 102
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 27936
+		v7.F1 = v8
+		var v9 uint8 = 105
+		v7.F2 = v9
+		v10 := conformance.StructSize3Align2{}
+		var v11 uint16 = 24946
+		v10.F1 = v11
+		var v12 uint8 = 116
+		v10.F2 = v12
+		v13 := []conformance.StructSize3Align2{v4, v7, v10}
+		v3.SetVectorS3A2(v13)
+		v1.TheUnion = v3
+		var v14 uint32 = 134678021
+		v1.After = v14
+
+		decodeSuccessCase{
+			name: "Sandwich6Case4",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x73, 0x6f, 0x66, 0x00, 0x20, 0x6d, 0x69, 0x00,
+				0x72, 0x61, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 28531
+		v4.F1 = v5
+		var v6 uint8 = 102
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 27936
+		v7.F1 = v8
+		var v9 uint8 = 105
+		v7.F2 = v9
+		v10 := conformance.StructSize3Align2{}
+		var v11 uint16 = 24946
+		v10.F1 = v11
+		var v12 uint8 = 116
+		v10.F2 = v12
+		v13 := []conformance.StructSize3Align2{v4, v7, v10}
+		v3.SetVectorS3A2(v13)
+		v1.TheUnion = v3
+		var v14 uint32 = 134678021
+		v1.After = v14
+
+		decodeSuccessCase{
+			name: "Sandwich6Case4_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x6f, 0x66, 0x00, 0x20, 0x6d, 0x69, 0x00,
+				0x72, 0x61, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint32 = 4294967295
+		var v5 uint32 = 4294967295
+		var v6 uint32 = 4294967295
+		v7 := []uint32{v4, v5, v6}
+		v3.SetHandles(v7)
+		v1.TheUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		decodeSuccessCase{
+			name: "Sandwich6Case5",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		var v4 uint32 = 4294967295
+		var v5 uint32 = 4294967295
+		var v6 uint32 = 4294967295
+		v7 := []uint32{v4, v5, v6}
+		v3.SetHandles(v7)
+		v1.TheUnion = v3
+		var v8 uint32 = 134678021
+		v1.After = v8
+
+		decodeSuccessCase{
+			name: "Sandwich6Case5_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 164
+		var v11 uint8 = 165
+		var v12 uint8 = 166
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := [2]conformance.StructSize3Align1{v4, v9}
+		v3.SetArrayS3A1(v14)
+		v1.TheUnion = v3
+		var v15 uint32 = 134678021
+		v1.After = v15
+
+		decodeSuccessCase{
+			name: "Sandwich6Case6",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 161
+		var v6 uint8 = 162
+		var v7 uint8 = 163
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 164
+		var v11 uint8 = 165
+		var v12 uint8 = 166
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v14 := [2]conformance.StructSize3Align1{v4, v9}
+		v3.SetArrayS3A1(v14)
+		v1.TheUnion = v3
+		var v15 uint32 = 134678021
+		v1.After = v15
+
+		decodeSuccessCase{
+			name: "Sandwich6Case6_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 41633
+		v4.F1 = v5
+		var v6 uint8 = 163
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 42404
+		v7.F1 = v8
+		var v9 uint8 = 166
+		v7.F2 = v9
+		v10 := [2]conformance.StructSize3Align2{v4, v7}
+		v3.SetArrayS3A2(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		decodeSuccessCase{
+			name: "Sandwich6Case7",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0x00, 0xa4, 0xa5, 0xa6, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.StructSize3Align2{}
+		var v5 uint16 = 41633
+		v4.F1 = v5
+		var v6 uint8 = 163
+		v4.F2 = v6
+		v7 := conformance.StructSize3Align2{}
+		var v8 uint16 = 42404
+		v7.F1 = v8
+		var v9 uint8 = 166
+		v7.F2 = v9
+		v10 := [2]conformance.StructSize3Align2{v4, v7}
+		v3.SetArrayS3A2(v10)
+		v1.TheUnion = v3
+		var v11 uint32 = 134678021
+		v1.After = v11
+
+		decodeSuccessCase{
+			name: "Sandwich6Case7_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0xa1, 0xa2, 0xa3, 0x00, 0xa4, 0xa5, 0xa6, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v6 := []conformance.UnionSize8Align4{v4}
+		v3.SetVectorUnion(v6)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		decodeSuccessCase{
+			name: "Sandwich6Case8",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x09, 0x0a, 0x0b, 0x0c,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Sandwich6{}
+		var v2 uint32 = 67305985
+		v1.Before = v2
+		v3 := conformance.UnionWithVector{}
+		v4 := conformance.UnionSize8Align4{}
+		var v5 uint32 = 202050057
+		v4.SetVariant(v5)
+		v6 := []conformance.UnionSize8Align4{v4}
+		v3.SetVectorUnion(v6)
+		v1.TheUnion = v3
+		var v7 uint32 = 134678021
+		v1.After = v7
+
+		decodeSuccessCase{
+			name: "Sandwich6Case8_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithReservedSandwichStruct{}
+		v2 := conformance.TableStructWithReservedSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 9
+		var v5 uint8 = 10
+		var v6 uint8 = 11
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.StructSize3Align1{}
+		var v9 uint8 = 25
+		var v10 uint8 = 26
+		var v11 uint8 = 27
+		v12 := [3]uint8{v9, v10, v11}
+		v8.ThreeBytes = v12
+		v2.SetS2(v8)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_StructWithReservedSandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithReservedSandwichStruct{}
+		v2 := conformance.TableStructWithReservedSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 9
+		var v5 uint8 = 10
+		var v6 uint8 = 11
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.StructSize3Align1{}
+		var v9 uint8 = 25
+		var v10 uint8 = 26
+		var v11 uint8 = 27
+		v12 := [3]uint8{v9, v10, v11}
+		v8.ThreeBytes = v12
+		v2.SetS2(v8)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_StructWithReservedSandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithUint32SandwichStruct{}
+		v2 := conformance.TableStructWithUint32Sandwich{}
+		var v3 uint32 = 67305985
+		v2.SetI(v3)
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 9
+		var v6 uint8 = 10
+		var v7 uint8 = 11
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v2.SetS1(v4)
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 25
+		var v11 uint8 = 26
+		var v12 uint8 = 27
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v2.SetS2(v9)
+		var v14 uint32 = 218893066
+		v2.SetI2(v14)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_StructWithUint32Sandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableStructWithUint32SandwichStruct{}
+		v2 := conformance.TableStructWithUint32Sandwich{}
+		var v3 uint32 = 67305985
+		v2.SetI(v3)
+		v4 := conformance.StructSize3Align1{}
+		var v5 uint8 = 9
+		var v6 uint8 = 10
+		var v7 uint8 = 11
+		v8 := [3]uint8{v5, v6, v7}
+		v4.ThreeBytes = v8
+		v2.SetS1(v4)
+		v9 := conformance.StructSize3Align1{}
+		var v10 uint8 = 25
+		var v11 uint8 = 26
+		var v12 uint8 = 27
+		v13 := [3]uint8{v10, v11, v12}
+		v9.ThreeBytes = v13
+		v2.SetS2(v9)
+		var v14 uint32 = 218893066
+		v2.SetI2(v14)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_StructWithUint32Sandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
+				0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorReservedSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorReservedSandwich{}
+		v3 := conformance.UnionWithVector{}
+		v4 := "hello"
+		v3.SetString(v4)
+		v2.SetUv(v3)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_UnionWithVector_ReservedSandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorReservedSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorReservedSandwich{}
+		v3 := conformance.UnionWithVector{}
+		v4 := "hello"
+		v3.SetString(v4)
+		v2.SetUv(v3)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_UnionWithVector_ReservedSandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorStructSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorStructSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.UnionWithVector{}
+		v9 := "hello"
+		v8.SetString(v9)
+		v2.SetUv(v8)
+		v10 := conformance.StructSize3Align1{}
+		var v11 uint8 = 4
+		var v12 uint8 = 5
+		var v13 uint8 = 6
+		v14 := [3]uint8{v11, v12, v13}
+		v10.ThreeBytes = v14
+		v2.SetS2(v10)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_UnionWithVector_StructSandwich",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+				0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.TableUnionWithVectorStructSandwichStruct{}
+		v2 := conformance.TableUnionWithVectorStructSandwich{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS1(v3)
+		v8 := conformance.UnionWithVector{}
+		v9 := "hello"
+		v8.SetString(v9)
+		v2.SetUv(v8)
+		v10 := conformance.StructSize3Align1{}
+		var v11 uint8 = 4
+		var v12 uint8 = 5
+		var v13 uint8 = 6
+		v14 := [3]uint8{v11, v12, v13}
+		v10.ThreeBytes = v14
+		v2.SetS2(v10)
+		v1.Table = v2
+
+		decodeSuccessCase{
+			name: "Table_UnionWithVector_StructSandwich_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00,
+				0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.XUnionWithStructStruct{}
+		v2 := conformance.XUnionWithStruct{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS(v3)
+		v1.Xu = v2
+
+		decodeSuccessCase{
+			name: "XUnionWithStruct",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x14, 0x5c, 0x3e, 0x19, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.XUnionWithStructStruct{}
+		v2 := conformance.XUnionWithStruct{}
+		v3 := conformance.StructSize3Align1{}
+		var v4 uint8 = 1
+		var v5 uint8 = 2
+		var v6 uint8 = 3
+		v7 := [3]uint8{v4, v5, v6}
+		v3.ThreeBytes = v7
+		v2.SetS(v3)
+		v1.Xu = v2
+
+		decodeSuccessCase{
+			name: "XUnionWithStruct_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x14, 0x5c, 0x3e, 0x19, 0x00, 0x00, 0x00, 0x00,
+				0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.ArrayStruct{}
+		v2 := conformance.StringUnion{}
+		v3 := "one"
+		v2.SetS(v3)
+		v4 := conformance.StringUnion{}
+		v5 := "two"
+		v4.SetS(v5)
+		v6 := conformance.StringUnion{}
+		v7 := "three"
+		v6.SetS(v7)
+		v8 := [3]conformance.StringUnion{v2, v4, v6}
+		v1.Unions = v8
+		v9 := &conformance.StringUnion{}
+		v10 := "four"
+		v9.SetS(v10)
+		v11 := &conformance.StringUnion{}
+		v12 := "five"
+		v11.SetS(v12)
+		v13 := &conformance.StringUnion{}
+		v14 := "six"
+		v13.SetS(v14)
+		v15 := [3]*conformance.StringUnion{v9, v11, v13}
+		v1.OptionalUnions = v15
+
+		decodeSuccessCase{
+			name: "ArrayStruct",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x6f, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x74, 0x77, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x6f, 0x75, 0x72, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x00,
+				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x69, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.ArrayStruct{}
+		v2 := conformance.StringUnion{}
+		v3 := "one"
+		v2.SetS(v3)
+		v4 := conformance.StringUnion{}
+		v5 := "two"
+		v4.SetS(v5)
+		v6 := conformance.StringUnion{}
+		v7 := "three"
+		v6.SetS(v7)
+		v8 := [3]conformance.StringUnion{v2, v4, v6}
+		v1.Unions = v8
+		v9 := &conformance.StringUnion{}
+		v10 := "four"
+		v9.SetS(v10)
+		v11 := &conformance.StringUnion{}
+		v12 := "five"
+		v11.SetS(v12)
+		v13 := &conformance.StringUnion{}
+		v14 := "six"
+		v13.SetS(v14)
+		v15 := [3]*conformance.StringUnion{v9, v11, v13}
+		v1.OptionalUnions = v15
+
+		decodeSuccessCase{
+			name: "ArrayStruct_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x6f, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x74, 0x77, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x6f, 0x75, 0x72, 0x00, 0x00, 0x00, 0x00,
+				0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x66, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x73, 0x69, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression1{}
+		var v2 uint8 = 1
+		v1.F1 = v2
+		var v3 uint32 = 2
+		v1.F2 = v3
+		var v4 uint8 = 3
+		v1.F3 = v4
+		var v5 uint16 = 4
+		v1.F4 = v5
+		var v6 uint64 = 5
+		v1.F5 = v6
+		var v7 uint8 = 6
+		v1.F6 = v7
+
+		decodeSuccessCase{
+			name: "Regression1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression1{}
+		var v2 uint8 = 1
+		v1.F1 = v2
+		var v3 uint32 = 2
+		v1.F2 = v3
+		var v4 uint8 = 3
+		v1.F3 = v4
+		var v5 uint16 = 4
+		v1.F4 = v5
+		var v6 uint64 = 5
+		v1.F5 = v6
+		var v7 uint8 = 6
+		v1.F6 = v7
+
+		decodeSuccessCase{
+			name: "Regression1_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression2{}
+		v2 := conformance.Regression1{}
+		var v3 uint8 = 1
+		v2.F1 = v3
+		var v4 uint32 = 2
+		v2.F2 = v4
+		var v5 uint8 = 3
+		v2.F3 = v5
+		var v6 uint16 = 4
+		v2.F4 = v6
+		var v7 uint64 = 5
+		v2.F5 = v7
+		var v8 uint8 = 6
+		v2.F6 = v8
+		v1.Head = v2
+		var v9 uint8 = 7
+		v1.F7 = v9
+
+		decodeSuccessCase{
+			name: "Regression2",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression2{}
+		v2 := conformance.Regression1{}
+		var v3 uint8 = 1
+		v2.F1 = v3
+		var v4 uint32 = 2
+		v2.F2 = v4
+		var v5 uint8 = 3
+		v2.F3 = v5
+		var v6 uint16 = 4
+		v2.F4 = v6
+		var v7 uint64 = 5
+		v2.F5 = v7
+		var v8 uint8 = 6
+		v2.F6 = v8
+		v1.Head = v2
+		var v9 uint8 = 7
+		v1.F7 = v9
+
+		decodeSuccessCase{
+			name: "Regression2_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+
+		decodeSuccessCase{
+			name: "Regression3Absent",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+
+		decodeSuccessCase{
+			name: "Regression3Absent_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+		v2 := &conformance.Regression2{}
+		v3 := conformance.Regression1{}
+		var v4 uint8 = 1
+		v3.F1 = v4
+		var v5 uint32 = 2
+		v3.F2 = v5
+		var v6 uint8 = 3
+		v3.F3 = v6
+		var v7 uint16 = 4
+		v3.F4 = v7
+		var v8 uint64 = 5
+		v3.F5 = v8
+		var v9 uint8 = 6
+		v3.F6 = v9
+		v2.Head = v3
+		var v10 uint8 = 7
+		v2.F7 = v10
+		v1.OptValue = v2
+
+		decodeSuccessCase{
+			name: "Regression3Present",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: false,
+				EncodeUnionsAsXUnionBytes:   false,
+			},
+			input: &v1,
+			bytes: []byte{
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
+		v1 := conformance.Regression3{}
+		v2 := &conformance.Regression2{}
+		v3 := conformance.Regression1{}
+		var v4 uint8 = 1
+		v3.F1 = v4
+		var v5 uint32 = 2
+		v3.F2 = v5
+		var v6 uint8 = 3
+		v3.F3 = v6
+		var v7 uint16 = 4
+		v3.F4 = v7
+		var v8 uint64 = 5
+		v3.F5 = v8
+		var v9 uint8 = 6
+		v3.F6 = v9
+		v2.Head = v3
+		var v10 uint8 = 7
+		v2.F7 = v10
+		v1.OptValue = v2
+
+		decodeSuccessCase{
+			name: "Regression3Present_v1",
+			context: fidl.MarshalerContext{
+				DecodeUnionsFromXUnionBytes: true,
+				EncodeUnionsAsXUnionBytes:   true,
+			},
+			input: &v1,
+			bytes: []byte{
+				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+				0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+				0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			},
+		}.check(t)
+	}
+
+	{
 		v1 := conformance.UnionWithBoundStringStruct{}
 		v2 := conformance.UnionWithBoundString{}
 		v3 := "abcd"