[fidlc] 32 to 64 bits Ordinals: Step #4

This is a mechanical re-gen of the goldens now that fidlc shifts
ord << 32 (gen was already shifted in step 2). No impact on generated
code.

Multiple unrelated changes are being pulled in because topaz goldens get
regenerated less frequently.

FIDL-524 #comment

Change-Id: Id867e3bd48e328f9bac14c861fef0ef3e48daacc
diff --git a/bin/fidlgen_dart/goldens/bits.test.test.fidl.json b/bin/fidlgen_dart/goldens/bits.test.test.fidl.json
index bde9ce8..3a69e93 100644
--- a/bin/fidlgen_dart/goldens/bits.test.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/bits.test.test.fidl.json
@@ -48,7 +48,8 @@
             }
           }
         }
-      ]
+      ],
+      "strict": false
     }
   ],
   "const_declarations": [],
diff --git a/bin/fidlgen_dart/goldens/consts.test.fidl.json b/bin/fidlgen_dart/goldens/consts.test.fidl.json
index 4305aef..8497d51 100644
--- a/bin/fidlgen_dart/goldens/consts.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/consts.test.fidl.json
@@ -297,7 +297,8 @@
             }
           }
         }
-      ]
+      ],
+      "strict": false
     },
     {
       "name": "test.name/BitsType",
@@ -324,7 +325,8 @@
             }
           }
         }
-      ]
+      ],
+      "strict": false
     }
   ],
   "interface_declarations": [],
diff --git a/bin/fidlgen_dart/goldens/doc_comments.test.fidl.json b/bin/fidlgen_dart/goldens/doc_comments.test.fidl.json
index 702286d..5fa3173 100644
--- a/bin/fidlgen_dart/goldens/doc_comments.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/doc_comments.test.fidl.json
@@ -1,6 +1,12 @@
 {
   "version": "0.0.1",
   "name": "test.name",
+  "maybe_attributes": [
+    {
+      "name": "Doc",
+      "value": " library comment #1\n\n library comment #2\n"
+    }
+  ],
   "library_dependencies": [],
   "bits_declarations": [],
   "const_declarations": [
@@ -48,7 +54,7 @@
       ],
       "methods": [
         {
-          "ordinal": 1061382220,
+          "ordinal": 4558601923455877120,
           "generated_ordinal": 4558601923455877120,
           "name": "Method",
           "location": {
@@ -67,11 +73,12 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 325918733,
+          "ordinal": 1399810299388755968,
           "generated_ordinal": 1399810299388755968,
           "name": "OnEvent",
           "location": {
@@ -91,6 +98,7 @@
           "maybe_response_size": 16,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         }
       ]
@@ -187,7 +195,8 @@
       "size": 16,
       "max_out_of_line": 24,
       "alignment": 8,
-      "max_handles": 0
+      "max_handles": 0,
+      "strict": false
     }
   ],
   "union_declarations": [
diff --git a/bin/fidlgen_dart/goldens/goldens.txt b/bin/fidlgen_dart/goldens/goldens.txt
index b1bdb2e..ba431b4 100644
--- a/bin/fidlgen_dart/goldens/goldens.txt
+++ b/bin/fidlgen_dart/goldens/goldens.txt
@@ -22,6 +22,9 @@
 protocols.test.fidl.json
 protocols.test.fidl.json_async.dart.golden
 protocols.test.fidl.json_test.dart.golden
+service.test.fidl.json
+service.test.fidl.json_async.dart.golden
+service.test.fidl.json_test.dart.golden
 tables.test.fidl.json
 tables.test.fidl.json_async.dart.golden
 tables.test.fidl.json_test.dart.golden
diff --git a/bin/fidlgen_dart/goldens/ordinal_switch.test.fidl.json b/bin/fidlgen_dart/goldens/ordinal_switch.test.fidl.json
index d9eae82..41546f5 100644
--- a/bin/fidlgen_dart/goldens/ordinal_switch.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/ordinal_switch.test.fidl.json
@@ -15,7 +15,7 @@
       },
       "methods": [
         {
-          "ordinal": 2005164903,
+          "ordinal": 8612117681472012288,
           "generated_ordinal": 8612117681472012288,
           "name": "OrdinalFive",
           "location": {
@@ -28,11 +28,12 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 667506719,
+          "ordinal": 2866919527965261824,
           "generated_ordinal": 2866919527965261824,
           "name": "OnlyGeneratedOrdinal",
           "location": {
@@ -45,11 +46,12 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 1467258273,
+          "ordinal": 6301826297320439808,
           "generated_ordinal": 6301826297320439808,
           "name": "EventOrdinalFifteen",
           "location": {
@@ -63,10 +65,11 @@
           "maybe_response_size": 16,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 2146190926,
+          "ordinal": 9217819838141956096,
           "generated_ordinal": 9217819838141956096,
           "name": "EventOnlyGeneratedOrdinal",
           "location": {
@@ -80,6 +83,7 @@
           "maybe_response_size": 16,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         }
       ]
diff --git a/bin/fidlgen_dart/goldens/protocol_request.test.fidl.json b/bin/fidlgen_dart/goldens/protocol_request.test.fidl.json
index 96148dc..33cdbe4 100644
--- a/bin/fidlgen_dart/goldens/protocol_request.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/protocol_request.test.fidl.json
@@ -24,7 +24,7 @@
       },
       "methods": [
         {
-          "ordinal": 915586153,
+          "ordinal": 3932412583805452288,
           "generated_ordinal": 3932412583805452288,
           "name": "GetChild",
           "location": {
@@ -37,6 +37,7 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -61,10 +62,11 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 1068158078,
+          "ordinal": 4587704011968217088,
           "generated_ordinal": 4587704011968217088,
           "name": "GetChildRequest",
           "location": {
@@ -77,6 +79,7 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -101,10 +104,11 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 1275478777,
+          "ordinal": 5478139633957076992,
           "generated_ordinal": 5478139633957076992,
           "name": "TakeChild",
           "location": {
@@ -136,11 +140,12 @@
           "maybe_request_size": 24,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 1589872250,
+          "ordinal": 6828449318567936000,
           "generated_ordinal": 6828449318567936000,
           "name": "TakeChildRequest",
           "location": {
@@ -172,6 +177,7 @@
           "maybe_request_size": 24,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         }
diff --git a/bin/fidlgen_dart/goldens/protocols.test.fidl.json b/bin/fidlgen_dart/goldens/protocols.test.fidl.json
index 7400682..10274ed 100644
--- a/bin/fidlgen_dart/goldens/protocols.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/protocols.test.fidl.json
@@ -46,7 +46,8 @@
             }
           }
         }
-      ]
+      ],
+      "strict": false
     }
   ],
   "interface_declarations": [
@@ -59,7 +60,7 @@
       },
       "methods": [
         {
-          "ordinal": 503576693,
+          "ordinal": 2162845427462832128,
           "generated_ordinal": 2162845427462832128,
           "name": "NoRequestNoResponse",
           "location": {
@@ -72,11 +73,12 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 1308023765,
+          "ordinal": 5617919293065789440,
           "generated_ordinal": 5617919293065789440,
           "name": "NoRequestEmptyResponse",
           "location": {
@@ -89,15 +91,17 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [],
           "maybe_response_size": 16,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 107534328,
+          "ordinal": 461856421957337088,
           "generated_ordinal": 461856421957337088,
           "name": "NoRequestWithResponse",
           "location": {
@@ -110,6 +114,7 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -132,11 +137,12 @@
           ],
           "maybe_response_size": 32,
           "maybe_response_alignment": 8,
-          "maybe_response_has_padding": false,
+          "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 432149361,
+          "ordinal": 1856067372482297856,
           "generated_ordinal": 1856067372482297856,
           "name": "WithRequestNoResponse",
           "location": {
@@ -166,12 +172,13 @@
           ],
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
-          "maybe_request_has_padding": false,
+          "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 1995585907,
+          "ordinal": 8570976206923497472,
           "generated_ordinal": 8570976206923497472,
           "name": "WithRequestEmptyResponse",
           "location": {
@@ -201,16 +208,18 @@
           ],
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
-          "maybe_request_has_padding": false,
+          "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [],
           "maybe_response_size": 16,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 426977568,
+          "ordinal": 1833854690685616128,
           "generated_ordinal": 1833854690685616128,
           "name": "WithRequestWithResponse",
           "location": {
@@ -240,7 +249,8 @@
           ],
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
-          "maybe_request_has_padding": false,
+          "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -263,11 +273,12 @@
           ],
           "maybe_response_size": 32,
           "maybe_response_alignment": 8,
-          "maybe_response_has_padding": false,
+          "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 1769985842,
+          "ordinal": 7602031305773023232,
           "generated_ordinal": 7602031305773023232,
           "name": "OnEmptyResponse",
           "location": {
@@ -281,10 +292,11 @@
           "maybe_response_size": 16,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 2051478023,
+          "ordinal": 8811031017247735808,
           "generated_ordinal": 8811031017247735808,
           "name": "OnWithResponse",
           "location": {
@@ -315,7 +327,8 @@
           ],
           "maybe_response_size": 32,
           "maybe_response_alignment": 8,
-          "maybe_response_has_padding": false,
+          "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         }
       ]
@@ -329,7 +342,7 @@
       },
       "methods": [
         {
-          "ordinal": 2069369145,
+          "ordinal": 8887872801126481920,
           "generated_ordinal": 8887872801126481920,
           "name": "ErrorAsPrimitive",
           "location": {
@@ -342,6 +355,7 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -366,10 +380,11 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 1284890143,
+          "ordinal": 5518561143137763328,
           "generated_ordinal": 5518561143137763328,
           "name": "ErrorAsEnum",
           "location": {
@@ -382,6 +397,7 @@
           "maybe_request_size": 16,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -406,6 +422,7 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         }
       ]
@@ -425,7 +442,7 @@
       ],
       "methods": [
         {
-          "ordinal": 1993818253,
+          "ordinal": 8563384190802853888,
           "generated_ordinal": 8563384190802853888,
           "name": "MethodA",
           "location": {
@@ -473,11 +490,12 @@
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 1746007436,
+          "ordinal": 7499044836192813056,
           "generated_ordinal": 7499044836192813056,
           "name": "EventA",
           "location": {
@@ -526,10 +544,11 @@
           "maybe_response_size": 32,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 952134976,
+          "ordinal": 4089388583297744896,
           "generated_ordinal": 4089388583297744896,
           "name": "MethodB",
           "location": {
@@ -577,6 +596,7 @@
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -600,10 +620,11 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 1691201382,
+          "ordinal": 7263654626640003072,
           "generated_ordinal": 7263654626640003072,
           "name": "MutateSocket",
           "location": {
@@ -635,6 +656,7 @@
           "maybe_request_size": 24,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -659,6 +681,7 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         }
       ]
@@ -678,7 +701,7 @@
       ],
       "methods": [
         {
-          "ordinal": 1432785874,
+          "ordinal": 6153768471000776704,
           "generated_ordinal": 6153768471000776704,
           "name": "MethodA",
           "location": {
@@ -726,11 +749,12 @@
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 477676034,
+          "ordinal": 2051602944112984064,
           "generated_ordinal": 2051602944112984064,
           "name": "EventA",
           "location": {
@@ -779,10 +803,11 @@
           "maybe_response_size": 32,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 180770075,
+          "ordinal": 776401560220467200,
           "generated_ordinal": 776401560220467200,
           "name": "MethodB",
           "location": {
@@ -830,6 +855,7 @@
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -853,10 +879,11 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 1258480262,
+          "ordinal": 5405131567951511552,
           "generated_ordinal": 5405131567951511552,
           "name": "MutateSocket",
           "location": {
@@ -888,6 +915,7 @@
           "maybe_request_size": 24,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -912,6 +940,7 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         }
       ]
@@ -931,7 +960,7 @@
       ],
       "methods": [
         {
-          "ordinal": 450577456,
+          "ordinal": 1935215437834878976,
           "generated_ordinal": 1935215437834878976,
           "name": "MethodA",
           "location": {
@@ -979,11 +1008,12 @@
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": false,
           "is_composed": false
         },
         {
-          "ordinal": 1795426833,
+          "ordinal": 7711299530095853568,
           "generated_ordinal": 7711299530095853568,
           "name": "EventA",
           "location": {
@@ -1032,10 +1062,11 @@
           "maybe_response_size": 32,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 1999489700,
+          "ordinal": 8587742870188851200,
           "generated_ordinal": 8587742870188851200,
           "name": "MethodB",
           "location": {
@@ -1083,6 +1114,7 @@
           "maybe_request_size": 32,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -1106,10 +1138,11 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": false,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         },
         {
-          "ordinal": 115851270,
+          "ordinal": 497577415850065920,
           "generated_ordinal": 497577415850065920,
           "name": "MutateSocket",
           "location": {
@@ -1141,6 +1174,7 @@
           "maybe_request_size": 24,
           "maybe_request_alignment": 8,
           "maybe_request_has_padding": true,
+          "experimental_maybe_request_has_flexible_envelope": false,
           "has_response": true,
           "maybe_response": [
             {
@@ -1165,6 +1199,7 @@
           "maybe_response_size": 24,
           "maybe_response_alignment": 8,
           "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
           "is_composed": false
         }
       ]
diff --git a/bin/fidlgen_dart/goldens/service.test.fidl.json b/bin/fidlgen_dart/goldens/service.test.fidl.json
new file mode 100644
index 0000000..7e3deb5
--- /dev/null
+++ b/bin/fidlgen_dart/goldens/service.test.fidl.json
@@ -0,0 +1,182 @@
+{
+  "version": "0.0.1",
+  "name": "test.name",
+  "library_dependencies": [],
+  "bits_declarations": [],
+  "const_declarations": [],
+  "enum_declarations": [],
+  "interface_declarations": [
+    {
+      "name": "test.name/FirstProtocol",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+        "line": 7,
+        "column": 10
+      },
+      "methods": [
+        {
+          "ordinal": 2898251288619778048,
+          "generated_ordinal": 2898251288619778048,
+          "name": "MethodOnFirst",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+            "line": 8,
+            "column": 5
+          },
+          "has_request": true,
+          "maybe_request": [],
+          "maybe_request_size": 16,
+          "maybe_request_alignment": 8,
+          "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
+          "has_response": false,
+          "is_composed": false
+        }
+      ]
+    },
+    {
+      "name": "test.name/SecondProtocol",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+        "line": 15,
+        "column": 10
+      },
+      "methods": [
+        {
+          "ordinal": 939493167940501504,
+          "generated_ordinal": 939493167940501504,
+          "name": "MethodOnSecond",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+            "line": 16,
+            "column": 5
+          },
+          "has_request": true,
+          "maybe_request": [],
+          "maybe_request_size": 16,
+          "maybe_request_alignment": 8,
+          "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
+          "has_response": false,
+          "is_composed": false
+        }
+      ]
+    }
+  ],
+  "service_declarations": [
+    {
+      "name": "test.name/SingleMemberService",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+        "line": 11,
+        "column": 9
+      },
+      "members": [
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/FirstProtocol",
+            "nullable": false
+          },
+          "name": "single_member",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+            "line": 12,
+            "column": 19
+          }
+        }
+      ]
+    },
+    {
+      "name": "test.name/MultiHeterogeneousMemberService",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+        "line": 19,
+        "column": 9
+      },
+      "members": [
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/FirstProtocol",
+            "nullable": false
+          },
+          "name": "first_member",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+            "line": 20,
+            "column": 19
+          }
+        },
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/SecondProtocol",
+            "nullable": false
+          },
+          "name": "second_member",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+            "line": 21,
+            "column": 20
+          }
+        }
+      ]
+    },
+    {
+      "name": "test.name/MultiHomogeneousMemberService",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+        "line": 24,
+        "column": 9
+      },
+      "members": [
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/FirstProtocol",
+            "nullable": false
+          },
+          "name": "first_member",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+            "line": 25,
+            "column": 19
+          }
+        },
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/FirstProtocol",
+            "nullable": false
+          },
+          "name": "second_member",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/service.test.fidl",
+            "line": 26,
+            "column": 19
+          }
+        }
+      ]
+    }
+  ],
+  "struct_declarations": [],
+  "table_declarations": [],
+  "union_declarations": [],
+  "xunion_declarations": [],
+  "type_alias_declarations": [],
+  "declaration_order": [
+    "test.name/SecondProtocol",
+    "test.name/FirstProtocol",
+    "test.name/SingleMemberService",
+    "test.name/MultiHomogeneousMemberService",
+    "test.name/MultiHeterogeneousMemberService"
+  ],
+  "declarations": {
+    "test.name/FirstProtocol": "interface",
+    "test.name/SecondProtocol": "interface",
+    "test.name/SingleMemberService": "service",
+    "test.name/MultiHeterogeneousMemberService": "service",
+    "test.name/MultiHomogeneousMemberService": "service"
+  }
+}
diff --git a/bin/fidlgen_dart/goldens/service.test.fidl.json_async.dart.golden b/bin/fidlgen_dart/goldens/service.test.fidl.json_async.dart.golden
new file mode 100644
index 0000000..9de10e2
--- /dev/null
+++ b/bin/fidlgen_dart/goldens/service.test.fidl.json_async.dart.golden
@@ -0,0 +1,277 @@
+// WARNING: This file is machine generated by fidlgen.
+
+library fidl_test_name_async;
+
+import 'dart:async' as $async;
+import 'dart:core' hide Set;
+import 'dart:developer';
+import 'dart:typed_data';
+
+import 'package:fidl/fidl.dart' as $fidl;
+import 'package:meta/meta.dart';
+import 'package:zircon/zircon.dart' as $zx;
+
+// ignore_for_file: always_specify_types
+// ignore_for_file: avoid_positional_boolean_parameters
+// ignore_for_file: avoid_returning_null
+// ignore_for_file: cascade_invocations
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: one_member_abstracts
+// ignore_for_file: prefer_constructors_over_static_methods
+// ignore_for_file: prefer_single_quotes
+// ignore_for_file: public_member_api_docs
+// ignore_for_file: unused_import
+// ignore_for_file: unused_local_variable
+// ignore_for_file: non_constant_identifier_names
+// ignore_for_file: library_prefixes
+// ignore_for_file: prefer_typing_uninitialized_variables
+// ignore_for_file: avoid_js_rounded_ints
+// ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: always_put_required_named_parameters_first
+// ignore_for_file: prefer_generic_function_type_aliases
+// ignore_for_file: prefer_equal_for_default_values
+// ignore_for_file: avoid_catches_without_on_clauses
+// ignore_for_file: unused_shown_name
+// ignore_for_file: unnecessary_lambdas
+// ignore_for_file: comment_references
+
+// ignore: unused_element, avoid_private_typedef_functions
+typedef _VoidCallback = void Function();
+
+// methodOnFirst: ()
+const int _kFirstProtocol_MethodOnFirst_GenOrdinal = 0x2838a83100000000;
+const $fidl.MethodType _kFirstProtocol_MethodOnFirst_Type = $fidl.MethodType(
+  request: null,
+  response: null,
+  name: r"FirstProtocol.MethodOnFirst",
+);
+
+abstract class FirstProtocol extends $fidl.Service {
+  static const String $serviceName = null;
+  @override
+  $fidl.ServiceData get $serviceData => FirstProtocolData();
+  $async.Future<void> methodOnFirst();
+}
+
+class FirstProtocolData implements $fidl.ServiceData<FirstProtocol> {
+  const FirstProtocolData();
+
+  @override
+  String getName() {
+    return FirstProtocol.$serviceName;
+  }
+
+  @override
+  $fidl.AsyncBinding getBinding() {
+    return FirstProtocolBinding();
+  }
+}
+
+class FirstProtocolProxy extends $fidl.AsyncProxy<FirstProtocol>
+    implements FirstProtocol {
+  FirstProtocolProxy()
+      : super($fidl.AsyncProxyController<FirstProtocol>(
+            $serviceName: null, $interfaceName: r'FirstProtocol')) {
+    ctrl.onResponse = _handleResponse;
+  }
+
+  @override
+  $fidl.ServiceData get $serviceData => FirstProtocolData();
+
+  void _handleEvent($fidl.Message $message) {
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+
+  void _handleResponse($fidl.Message $message) {
+    final int $txid = $message.txid;
+    if ($txid == 0) {
+      _handleEvent($message);
+      return;
+    }
+    final $async.Completer $completer = ctrl.getCompleter($txid);
+    if ($completer == null) {
+      $message.closeHandles();
+      return;
+    }
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+
+  @override
+  $async.Future<void> methodOnFirst() async {
+    if (!ctrl.isBound) {
+      return $async.Future.error(
+          $fidl.FidlStateException('Proxy<${ctrl.$interfaceName}> is closed.'),
+          StackTrace.current);
+    }
+
+    final $fidl.Encoder $encoder = $fidl.Encoder();
+    $encoder.encodeMessageHeader(_kFirstProtocol_MethodOnFirst_GenOrdinal, 0);
+    return $async.Future.sync(() {
+      ctrl.sendMessage($encoder.message);
+    });
+  }
+}
+
+class FirstProtocolBinding extends $fidl.AsyncBinding<FirstProtocol> {
+  FirstProtocolBinding() : super(r"FirstProtocol");
+
+  @override
+  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      case _kFirstProtocol_MethodOnFirst_GenOrdinal:
+        final String _name = _kFirstProtocol_MethodOnFirst_Type.name;
+        try {
+          Timeline.startSync(_name);
+          final List<$fidl.MemberType> $types =
+              _kFirstProtocol_MethodOnFirst_Type.request;
+          $decoder.claimMemory(16);
+          final $async.Future<void> $future = impl.methodOnFirst();
+          // ignore: avoid_catches_without_on_clauses
+        } catch (_e) {
+          close();
+          print('Exception handling method call $_name: $_e');
+          rethrow;
+        } finally {
+          Timeline.finishSync();
+        }
+        break;
+      default:
+        throw $fidl.FidlError(
+            r'Unexpected message name for FirstProtocolBinding');
+    }
+  }
+}
+
+// methodOnSecond: ()
+const int _kSecondProtocol_MethodOnSecond_GenOrdinal = 0xd09c00f00000000;
+const $fidl.MethodType _kSecondProtocol_MethodOnSecond_Type = $fidl.MethodType(
+  request: null,
+  response: null,
+  name: r"SecondProtocol.MethodOnSecond",
+);
+
+abstract class SecondProtocol extends $fidl.Service {
+  static const String $serviceName = null;
+  @override
+  $fidl.ServiceData get $serviceData => SecondProtocolData();
+  $async.Future<void> methodOnSecond();
+}
+
+class SecondProtocolData implements $fidl.ServiceData<SecondProtocol> {
+  const SecondProtocolData();
+
+  @override
+  String getName() {
+    return SecondProtocol.$serviceName;
+  }
+
+  @override
+  $fidl.AsyncBinding getBinding() {
+    return SecondProtocolBinding();
+  }
+}
+
+class SecondProtocolProxy extends $fidl.AsyncProxy<SecondProtocol>
+    implements SecondProtocol {
+  SecondProtocolProxy()
+      : super($fidl.AsyncProxyController<SecondProtocol>(
+            $serviceName: null, $interfaceName: r'SecondProtocol')) {
+    ctrl.onResponse = _handleResponse;
+  }
+
+  @override
+  $fidl.ServiceData get $serviceData => SecondProtocolData();
+
+  void _handleEvent($fidl.Message $message) {
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+
+  void _handleResponse($fidl.Message $message) {
+    final int $txid = $message.txid;
+    if ($txid == 0) {
+      _handleEvent($message);
+      return;
+    }
+    final $async.Completer $completer = ctrl.getCompleter($txid);
+    if ($completer == null) {
+      $message.closeHandles();
+      return;
+    }
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+
+  @override
+  $async.Future<void> methodOnSecond() async {
+    if (!ctrl.isBound) {
+      return $async.Future.error(
+          $fidl.FidlStateException('Proxy<${ctrl.$interfaceName}> is closed.'),
+          StackTrace.current);
+    }
+
+    final $fidl.Encoder $encoder = $fidl.Encoder();
+    $encoder.encodeMessageHeader(_kSecondProtocol_MethodOnSecond_GenOrdinal, 0);
+    return $async.Future.sync(() {
+      ctrl.sendMessage($encoder.message);
+    });
+  }
+}
+
+class SecondProtocolBinding extends $fidl.AsyncBinding<SecondProtocol> {
+  SecondProtocolBinding() : super(r"SecondProtocol");
+
+  @override
+  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      case _kSecondProtocol_MethodOnSecond_GenOrdinal:
+        final String _name = _kSecondProtocol_MethodOnSecond_Type.name;
+        try {
+          Timeline.startSync(_name);
+          final List<$fidl.MemberType> $types =
+              _kSecondProtocol_MethodOnSecond_Type.request;
+          $decoder.claimMemory(16);
+          final $async.Future<void> $future = impl.methodOnSecond();
+          // ignore: avoid_catches_without_on_clauses
+        } catch (_e) {
+          close();
+          print('Exception handling method call $_name: $_e');
+          rethrow;
+        } finally {
+          Timeline.finishSync();
+        }
+        break;
+      default:
+        throw $fidl.FidlError(
+            r'Unexpected message name for SecondProtocolBinding');
+    }
+  }
+}
diff --git a/bin/fidlgen_dart/goldens/service.test.fidl.json_test.dart.golden b/bin/fidlgen_dart/goldens/service.test.fidl.json_test.dart.golden
new file mode 100644
index 0000000..02c48af
--- /dev/null
+++ b/bin/fidlgen_dart/goldens/service.test.fidl.json_test.dart.golden
@@ -0,0 +1,35 @@
+// WARNING: This file is machine generated by fidlgen.
+
+library fidl_test_name_test;
+
+import 'dart:async' as $async;
+import 'dart:core' hide Error, Future, Match, Set, Stream, Type;
+import 'dart:typed_data';
+
+import 'package:fidl/fidl.dart' as $fidl;
+import 'package:meta/meta.dart';
+import 'package:zircon/zircon.dart' as $zx;
+
+import './fidl_async.dart';
+
+// ignore_for_file: always_specify_types
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: one_member_abstracts
+// ignore_for_file: public_member_api_docs
+// ignore_for_file: unused_import
+// ignore_for_file: library_prefixes
+// ignore_for_file: unused_shown_name
+
+class FirstProtocol$TestBase extends FirstProtocol {
+  @override
+  $async.Future<void> methodOnFirst() {
+    return $async.Future.error(UnimplementedError());
+  }
+}
+
+class SecondProtocol$TestBase extends SecondProtocol {
+  @override
+  $async.Future<void> methodOnSecond() {
+    return $async.Future.error(UnimplementedError());
+  }
+}
diff --git a/bin/fidlgen_dart/goldens/tables.test.fidl.json b/bin/fidlgen_dart/goldens/tables.test.fidl.json
index 4b3c991..5468676 100644
--- a/bin/fidlgen_dart/goldens/tables.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/tables.test.fidl.json
@@ -20,7 +20,8 @@
       "size": 16,
       "max_out_of_line": 0,
       "alignment": 8,
-      "max_handles": 0
+      "max_handles": 0,
+      "strict": false
     },
     {
       "name": "test.name/SimpleTable",
@@ -97,7 +98,8 @@
       "size": 16,
       "max_out_of_line": 48,
       "alignment": 8,
-      "max_handles": 0
+      "max_handles": 0,
+      "strict": false
     },
     {
       "name": "test.name/OlderSimpleTable",
@@ -138,7 +140,8 @@
       "size": 16,
       "max_out_of_line": 24,
       "alignment": 8,
-      "max_handles": 0
+      "max_handles": 0,
+      "strict": false
     },
     {
       "name": "test.name/NewerSimpleTable",
@@ -242,7 +245,8 @@
       "size": 16,
       "max_out_of_line": 72,
       "alignment": 8,
-      "max_handles": 0
+      "max_handles": 0,
+      "strict": false
     }
   ],
   "union_declarations": [],
diff --git a/bin/fidlgen_dart/goldens/xunion.test.fidl.json b/bin/fidlgen_dart/goldens/xunion.test.fidl.json
index 4d25745..51a4796 100644
--- a/bin/fidlgen_dart/goldens/xunion.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/xunion.test.fidl.json
@@ -5,9 +5,120 @@
   "bits_declarations": [],
   "const_declarations": [],
   "enum_declarations": [],
-  "interface_declarations": [],
+  "interface_declarations": [
+    {
+      "name": "test.name/TestProtocol",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+        "line": 38,
+        "column": 10
+      },
+      "methods": [
+        {
+          "ordinal": 8188024295608287232,
+          "generated_ordinal": 8188024295608287232,
+          "name": "StrictXUnionHenceResponseMayBeStackAllocated",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+            "line": 39,
+            "column": 5
+          },
+          "has_request": true,
+          "maybe_request": [],
+          "maybe_request_size": 16,
+          "maybe_request_alignment": 8,
+          "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
+          "has_response": true,
+          "maybe_response": [
+            {
+              "type": {
+                "kind": "identifier",
+                "identifier": "test.name/StrictBoundedXUnion",
+                "nullable": false
+              },
+              "name": "xu",
+              "location": {
+                "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+                "line": 39,
+                "column": 76
+              },
+              "size": 24,
+              "max_out_of_line": 32,
+              "alignment": 8,
+              "offset": 16,
+              "max_handles": 0
+            }
+          ],
+          "maybe_response_size": 40,
+          "maybe_response_alignment": 8,
+          "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": false,
+          "is_composed": false
+        },
+        {
+          "ordinal": 4132614547208929280,
+          "generated_ordinal": 4132614547208929280,
+          "name": "FlexibleXUnionHenceResponseMustBeHeapAllocated",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+            "line": 40,
+            "column": 5
+          },
+          "has_request": true,
+          "maybe_request": [],
+          "maybe_request_size": 16,
+          "maybe_request_alignment": 8,
+          "maybe_request_has_padding": false,
+          "experimental_maybe_request_has_flexible_envelope": false,
+          "has_response": true,
+          "maybe_response": [
+            {
+              "type": {
+                "kind": "identifier",
+                "identifier": "test.name/OlderSimpleUnion",
+                "nullable": false
+              },
+              "name": "xu",
+              "location": {
+                "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+                "line": 40,
+                "column": 75
+              },
+              "size": 24,
+              "max_out_of_line": 8,
+              "alignment": 8,
+              "offset": 16,
+              "max_handles": 0
+            }
+          ],
+          "maybe_response_size": 40,
+          "maybe_response_alignment": 8,
+          "maybe_response_has_padding": true,
+          "experimental_maybe_response_has_flexible_envelope": true,
+          "is_composed": false
+        }
+      ]
+    }
+  ],
   "service_declarations": [],
-  "struct_declarations": [],
+  "struct_declarations": [
+    {
+      "name": "test.name/Empty",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+        "line": 25,
+        "column": 8
+      },
+      "anonymous": false,
+      "members": [],
+      "size": 1,
+      "max_out_of_line": 0,
+      "alignment": 1,
+      "max_handles": 0,
+      "has_padding": false
+    }
+  ],
   "table_declarations": [],
   "union_declarations": [],
   "xunion_declarations": [
@@ -29,7 +140,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 4,
-            "column": 9
+            "column": 11
           },
           "size": 8,
           "max_out_of_line": 0,
@@ -46,7 +157,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 5,
-            "column": 11
+            "column": 13
           },
           "size": 4,
           "max_out_of_line": 0,
@@ -78,7 +189,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 11,
-            "column": 9
+            "column": 11
           },
           "size": 8,
           "max_out_of_line": 0,
@@ -95,7 +206,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 13,
-            "column": 10
+            "column": 12
           },
           "size": 16,
           "max_out_of_line": 4294967295,
@@ -116,7 +227,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 14,
-            "column": 18
+            "column": 20
           },
           "size": 16,
           "max_out_of_line": 4294967295,
@@ -148,7 +259,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 20,
-            "column": 9
+            "column": 11
           },
           "size": 4,
           "max_out_of_line": 0,
@@ -165,7 +276,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 21,
-            "column": 11
+            "column": 13
           },
           "size": 4,
           "max_out_of_line": 0,
@@ -182,7 +293,7 @@
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
             "line": 22,
-            "column": 10
+            "column": 12
           },
           "size": 16,
           "max_out_of_line": 4294967295,
@@ -195,17 +306,95 @@
       "alignment": 8,
       "max_handles": 0,
       "strict": true
+    },
+    {
+      "name": "test.name/XUnionContainingEmptyStruct",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+        "line": 28,
+        "column": 8
+      },
+      "members": [
+        {
+          "ordinal": 424858069,
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/Empty",
+            "nullable": false
+          },
+          "name": "empty",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+            "line": 31,
+            "column": 11
+          },
+          "size": 1,
+          "max_out_of_line": 0,
+          "alignment": 1,
+          "offset": 0
+        }
+      ],
+      "size": 24,
+      "max_out_of_line": 8,
+      "alignment": 8,
+      "max_handles": 0,
+      "strict": false
+    },
+    {
+      "name": "test.name/StrictBoundedXUnion",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+        "line": 34,
+        "column": 15
+      },
+      "members": [
+        {
+          "ordinal": 2024555624,
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint8"
+            },
+            "maybe_element_count": 10,
+            "nullable": false
+          },
+          "name": "v",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/xunion.test.fidl",
+            "line": 35,
+            "column": 22
+          },
+          "size": 16,
+          "max_out_of_line": 16,
+          "alignment": 8,
+          "offset": 0
+        }
+      ],
+      "size": 24,
+      "max_out_of_line": 32,
+      "alignment": 8,
+      "max_handles": 0,
+      "strict": true
     }
   ],
   "type_alias_declarations": [],
   "declaration_order": [
     "test.name/StrictSimpleXUnion",
+    "test.name/StrictBoundedXUnion",
     "test.name/OlderSimpleUnion",
-    "test.name/NewerSimpleUnion"
+    "test.name/TestProtocol",
+    "test.name/NewerSimpleUnion",
+    "test.name/Empty",
+    "test.name/XUnionContainingEmptyStruct"
   ],
   "declarations": {
+    "test.name/TestProtocol": "interface",
+    "test.name/Empty": "struct",
     "test.name/OlderSimpleUnion": "xunion",
     "test.name/NewerSimpleUnion": "xunion",
-    "test.name/StrictSimpleXUnion": "xunion"
+    "test.name/StrictSimpleXUnion": "xunion",
+    "test.name/XUnionContainingEmptyStruct": "xunion",
+    "test.name/StrictBoundedXUnion": "xunion"
   }
 }
diff --git a/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden b/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden
index 643c6e7..53c68be 100644
--- a/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden
+++ b/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden
@@ -336,5 +336,460 @@
   nullable: true,
 );
 
+enum XUnionContainingEmptyStructTag {
+  empty, // 0x1952d1d5
+}
+
+const Map<int, XUnionContainingEmptyStructTag>
+    _XUnionContainingEmptyStructTag_map = {
+  424858069: XUnionContainingEmptyStructTag.empty,
+};
+
+class XUnionContainingEmptyStruct extends $fidl.XUnion {
+  const XUnionContainingEmptyStruct.withEmpty(Empty value)
+      : _ordinal = 424858069,
+        _data = value;
+
+  XUnionContainingEmptyStruct._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  XUnionContainingEmptyStructTag get $tag =>
+      _XUnionContainingEmptyStructTag_map[_ordinal];
+
+  Empty get empty {
+    if (_ordinal != 424858069) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 424858069:
+        return 'XUnionContainingEmptyStruct.empty($empty)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static XUnionContainingEmptyStruct _ctor(int ordinal, Object data) {
+    return XUnionContainingEmptyStruct._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<XUnionContainingEmptyStruct>
+    kXUnionContainingEmptyStruct_Type =
+    $fidl.XUnionType<XUnionContainingEmptyStruct>(
+  encodedSize: 24,
+  members: <int, $fidl.FidlType>{
+    424858069: kEmpty_Type,
+  },
+  ctor: XUnionContainingEmptyStruct._ctor,
+);
+const $fidl.XUnionType<XUnionContainingEmptyStruct>
+    kXUnionContainingEmptyStruct_OptType =
+    $fidl.XUnionType<XUnionContainingEmptyStruct>(
+  encodedSize: 24,
+  members: <int, $fidl.FidlType>{
+    424858069: kEmpty_Type,
+  },
+  ctor: XUnionContainingEmptyStruct._ctor,
+  nullable: true,
+);
+
+enum StrictBoundedXUnionTag {
+  v, // 0x78ac4468
+}
+
+const Map<int, StrictBoundedXUnionTag> _StrictBoundedXUnionTag_map = {
+  2024555624: StrictBoundedXUnionTag.v,
+};
+
+class StrictBoundedXUnion extends $fidl.XUnion {
+  const StrictBoundedXUnion.withV(Uint8List value)
+      : _ordinal = 2024555624,
+        _data = value;
+
+  StrictBoundedXUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  StrictBoundedXUnionTag get $tag => _StrictBoundedXUnionTag_map[_ordinal];
+
+  Uint8List get v {
+    if (_ordinal != 2024555624) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 2024555624:
+        return 'StrictBoundedXUnion.v($v)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static StrictBoundedXUnion _ctor(int ordinal, Object data) {
+    return StrictBoundedXUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<StrictBoundedXUnion> kStrictBoundedXUnion_Type =
+    $fidl.XUnionType<StrictBoundedXUnion>(
+  encodedSize: 24,
+  members: <int, $fidl.FidlType>{
+    2024555624: $fidl.VectorType<Uint8List>(
+        element: $fidl.Uint8Type(), maybeElementCount: 10, nullable: false),
+  },
+  ctor: StrictBoundedXUnion._ctor,
+);
+const $fidl.XUnionType<StrictBoundedXUnion> kStrictBoundedXUnion_OptType =
+    $fidl.XUnionType<StrictBoundedXUnion>(
+  encodedSize: 24,
+  members: <int, $fidl.FidlType>{
+    2024555624: $fidl.VectorType<Uint8List>(
+        element: $fidl.Uint8Type(), maybeElementCount: 10, nullable: false),
+  },
+  ctor: StrictBoundedXUnion._ctor,
+  nullable: true,
+);
+
+class Empty extends $fidl.Struct {
+  const Empty({
+    this.reserved: 0x0,
+  });
+  Empty.clone(
+    Empty $orig, {
+    int reserved,
+  }) : this(
+          reserved: reserved ?? $orig.reserved,
+        );
+
+  Empty._(List<Object> argv) : reserved = argv[0];
+  final int reserved;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      reserved,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Empty' r'(reserved: ' + reserved.toString() + r')';
+  }
+
+  static Empty _ctor(List<Object> argv) => Empty._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Empty> kEmpty_Type = $fidl.StructType<Empty>(
+  encodedSize: 1,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offset: 0),
+  ],
+  ctor: Empty._ctor,
+);
+
 // ignore: unused_element, avoid_private_typedef_functions
 typedef _VoidCallback = void Function();
+
+// strictXUnionHenceResponseMayBeStackAllocated: () -> (StrictBoundedXUnion xu)
+const int
+    _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_GenOrdinal =
+    0x71a1b4b700000000;
+const $fidl.MethodType
+    _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_Type =
+    $fidl.MethodType(
+  request: null,
+  response: <$fidl.MemberType>[
+    $fidl.MemberType<StrictBoundedXUnion>(
+        type: kStrictBoundedXUnion_Type, offset: 16),
+  ],
+  name: r"TestProtocol.StrictXUnionHenceResponseMayBeStackAllocated",
+);
+// flexibleXUnionHenceResponseMustBeHeapAllocated: () -> (OlderSimpleUnion xu)
+const int
+    _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_GenOrdinal =
+    0x3959ff0900000000;
+const $fidl.MethodType
+    _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_Type =
+    $fidl.MethodType(
+  request: null,
+  response: <$fidl.MemberType>[
+    $fidl.MemberType<OlderSimpleUnion>(
+        type: kOlderSimpleUnion_Type, offset: 16),
+  ],
+  name: r"TestProtocol.FlexibleXUnionHenceResponseMustBeHeapAllocated",
+);
+
+abstract class TestProtocol extends $fidl.Service {
+  static const String $serviceName = null;
+  @override
+  $fidl.ServiceData get $serviceData => TestProtocolData();
+  $async.Future<StrictBoundedXUnion>
+      strictXUnionHenceResponseMayBeStackAllocated();
+  $async.Future<OlderSimpleUnion>
+      flexibleXUnionHenceResponseMustBeHeapAllocated();
+}
+
+class TestProtocolData implements $fidl.ServiceData<TestProtocol> {
+  const TestProtocolData();
+
+  @override
+  String getName() {
+    return TestProtocol.$serviceName;
+  }
+
+  @override
+  $fidl.AsyncBinding getBinding() {
+    return TestProtocolBinding();
+  }
+}
+
+class TestProtocolProxy extends $fidl.AsyncProxy<TestProtocol>
+    implements TestProtocol {
+  TestProtocolProxy()
+      : super($fidl.AsyncProxyController<TestProtocol>(
+            $serviceName: null, $interfaceName: r'TestProtocol')) {
+    ctrl.onResponse = _handleResponse;
+  }
+
+  @override
+  $fidl.ServiceData get $serviceData => TestProtocolData();
+
+  void _handleEvent($fidl.Message $message) {
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+
+  void _handleResponse($fidl.Message $message) {
+    final int $txid = $message.txid;
+    if ($txid == 0) {
+      _handleEvent($message);
+      return;
+    }
+    final $async.Completer $completer = ctrl.getCompleter($txid);
+    if ($completer == null) {
+      $message.closeHandles();
+      return;
+    }
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      case _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_GenOrdinal:
+        final String _name =
+            _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_Type
+                .name;
+        try {
+          Timeline.startSync(_name);
+          final List<$fidl.MemberType> $types =
+              _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_Type
+                  .response;
+          $decoder.claimMemory(40);
+          // ignore: prefer_const_declarations
+          final $response = $types[0].decode($decoder, 0);
+
+          $completer.complete($response);
+
+          // ignore: avoid_catches_without_on_clauses
+        } catch (_e) {
+          ctrl.proxyError($fidl.FidlError(
+              'Exception handling method response $_name: $_e'));
+          ctrl.close();
+          rethrow;
+        } finally {
+          Timeline.finishSync();
+        }
+        break;
+      case _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_GenOrdinal:
+        final String _name =
+            _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_Type
+                .name;
+        try {
+          Timeline.startSync(_name);
+          final List<$fidl.MemberType> $types =
+              _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_Type
+                  .response;
+          $decoder.claimMemory(40);
+          // ignore: prefer_const_declarations
+          final $response = $types[0].decode($decoder, 0);
+
+          $completer.complete($response);
+
+          // ignore: avoid_catches_without_on_clauses
+        } catch (_e) {
+          ctrl.proxyError($fidl.FidlError(
+              'Exception handling method response $_name: $_e'));
+          ctrl.close();
+          rethrow;
+        } finally {
+          Timeline.finishSync();
+        }
+        break;
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+
+  @override
+  $async.Future<StrictBoundedXUnion>
+      strictXUnionHenceResponseMayBeStackAllocated() async {
+    if (!ctrl.isBound) {
+      return $async.Future.error(
+          $fidl.FidlStateException('Proxy<${ctrl.$interfaceName}> is closed.'),
+          StackTrace.current);
+    }
+
+    final $fidl.Encoder $encoder = $fidl.Encoder();
+    $encoder.encodeMessageHeader(
+        _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_GenOrdinal,
+        0);
+    final $completer = $async.Completer<StrictBoundedXUnion>();
+    ctrl.sendMessageWithResponse($encoder.message, $completer);
+    return $completer.future;
+  }
+
+  @override
+  $async.Future<OlderSimpleUnion>
+      flexibleXUnionHenceResponseMustBeHeapAllocated() async {
+    if (!ctrl.isBound) {
+      return $async.Future.error(
+          $fidl.FidlStateException('Proxy<${ctrl.$interfaceName}> is closed.'),
+          StackTrace.current);
+    }
+
+    final $fidl.Encoder $encoder = $fidl.Encoder();
+    $encoder.encodeMessageHeader(
+        _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_GenOrdinal,
+        0);
+    final $completer = $async.Completer<OlderSimpleUnion>();
+    ctrl.sendMessageWithResponse($encoder.message, $completer);
+    return $completer.future;
+  }
+}
+
+class TestProtocolBinding extends $fidl.AsyncBinding<TestProtocol> {
+  TestProtocolBinding() : super(r"TestProtocol");
+
+  @override
+  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
+    final $fidl.Decoder $decoder = $fidl.Decoder($message);
+    switch ($message.ordinal) {
+      case _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_GenOrdinal:
+        final String _name =
+            _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_Type
+                .name;
+        try {
+          Timeline.startSync(_name);
+          final List<$fidl.MemberType> $types =
+              _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_Type
+                  .request;
+          $decoder.claimMemory(16);
+          final $async.Future<StrictBoundedXUnion> $future =
+              impl.strictXUnionHenceResponseMayBeStackAllocated();
+          $future.then(($response) {
+            final $fidl.Encoder $encoder = $fidl.Encoder();
+            $encoder.encodeMessageHeader(
+                _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_GenOrdinal,
+                $message.txid);
+            $encoder.alloc(40 - $fidl.kMessageHeaderSize);
+            final List<$fidl.MemberType> $types =
+                _kTestProtocol_StrictXUnionHenceResponseMayBeStackAllocated_Type
+                    .response;
+            $types[0].encode($encoder, $response, 0);
+            $respond($encoder.message);
+          }, onError: (_e) {
+            close();
+            print('Exception handling method call $_name: $_e');
+          });
+          // ignore: avoid_catches_without_on_clauses
+        } catch (_e) {
+          close();
+          print('Exception handling method call $_name: $_e');
+          rethrow;
+        } finally {
+          Timeline.finishSync();
+        }
+        break;
+      case _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_GenOrdinal:
+        final String _name =
+            _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_Type
+                .name;
+        try {
+          Timeline.startSync(_name);
+          final List<$fidl.MemberType> $types =
+              _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_Type
+                  .request;
+          $decoder.claimMemory(16);
+          final $async.Future<OlderSimpleUnion> $future =
+              impl.flexibleXUnionHenceResponseMustBeHeapAllocated();
+          $future.then(($response) {
+            final $fidl.Encoder $encoder = $fidl.Encoder();
+            $encoder.encodeMessageHeader(
+                _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_GenOrdinal,
+                $message.txid);
+            $encoder.alloc(40 - $fidl.kMessageHeaderSize);
+            final List<$fidl.MemberType> $types =
+                _kTestProtocol_FlexibleXUnionHenceResponseMustBeHeapAllocated_Type
+                    .response;
+            $types[0].encode($encoder, $response, 0);
+            $respond($encoder.message);
+          }, onError: (_e) {
+            close();
+            print('Exception handling method call $_name: $_e');
+          });
+          // ignore: avoid_catches_without_on_clauses
+        } catch (_e) {
+          close();
+          print('Exception handling method call $_name: $_e');
+          rethrow;
+        } finally {
+          Timeline.finishSync();
+        }
+        break;
+      default:
+        throw $fidl.FidlError(
+            r'Unexpected message name for TestProtocolBinding');
+    }
+  }
+}
diff --git a/bin/fidlgen_dart/goldens/xunion.test.fidl.json_test.dart.golden b/bin/fidlgen_dart/goldens/xunion.test.fidl.json_test.dart.golden
index a3eabaa..e7bca15 100644
--- a/bin/fidlgen_dart/goldens/xunion.test.fidl.json_test.dart.golden
+++ b/bin/fidlgen_dart/goldens/xunion.test.fidl.json_test.dart.golden
@@ -19,3 +19,17 @@
 // ignore_for_file: unused_import
 // ignore_for_file: library_prefixes
 // ignore_for_file: unused_shown_name
+
+class TestProtocol$TestBase extends TestProtocol {
+  @override
+  $async.Future<StrictBoundedXUnion>
+      strictXUnionHenceResponseMayBeStackAllocated() {
+    return $async.Future.error(UnimplementedError());
+  }
+
+  @override
+  $async.Future<OlderSimpleUnion>
+      flexibleXUnionHenceResponseMustBeHeapAllocated() {
+    return $async.Future.error(UnimplementedError());
+  }
+}