[fidlc] Add experimental_maybe_from_type_alias.test.fidl to goldens

Ths experimental_maybe_from_type_alias.test.fidl golden test verifies
that the "experimental_maybe_from_type_alias" field (currently missing
from the schema) is rendered properly.

Test: fidldev regen fidlc && fidldev test fidlc
Bug: 74400
Change-Id: I91bb7a5868b462cf2e86811d9ac700759a2bf0d9
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/517847
Commit-Queue: Alex Zaslavsky <azaslavsky@google.com>
Reviewed-by: Pascal Perez <pascallouis@google.com>
Fuchsia-Auto-Submit: Pascal Perez <pascallouis@google.com>
diff --git a/tools/fidl/fidlc/goldens/experimental_maybe_from_type_alias.json.golden b/tools/fidl/fidlc/goldens/experimental_maybe_from_type_alias.json.golden
new file mode 100644
index 0000000..f2a4b6b
--- /dev/null
+++ b/tools/fidl/fidlc/goldens/experimental_maybe_from_type_alias.json.golden
@@ -0,0 +1,1097 @@
+{
+  "version": "0.0.1",
+  "name": "fidl.test.experimentalmaybefromtypealias",
+  "library_dependencies": [],
+  "bits_declarations": [],
+  "const_declarations": [],
+  "enum_declarations": [],
+  "experimental_resource_declarations": [],
+  "interface_declarations": [
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 3,
+        "column": 10,
+        "length": 10
+      },
+      "methods": []
+    }
+  ],
+  "service_declarations": [],
+  "struct_declarations": [
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/Testing",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 17,
+        "column": 17,
+        "length": 7
+      },
+      "anonymous": false,
+      "members": [
+        {
+          "type": {
+            "kind": "primitive",
+            "subtype": "uint64"
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/U64",
+            "args": [],
+            "nullable": false
+          },
+          "name": "u1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 18,
+            "column": 9,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 0,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint64"
+            },
+            "maybe_element_count": 1,
+            "nullable": false
+          },
+          "name": "u2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 19,
+            "column": 19,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 8,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint64"
+            },
+            "element_count": 1
+          },
+          "name": "u3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 20,
+            "column": 18,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 24,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "maybe_element_count": 1,
+              "nullable": false
+            },
+            "nullable": false
+          },
+          "name": "u4",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 21,
+            "column": 27,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 32,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "array",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "element_count": 1
+            },
+            "nullable": false
+          },
+          "name": "u5",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 22,
+            "column": 26,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 48,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "maybe_element_count": 1,
+              "nullable": false
+            },
+            "element_count": 4
+          },
+          "name": "u6",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 23,
+            "column": 28,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 64,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "array",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "element_count": 1
+            },
+            "element_count": 4
+          },
+          "name": "u7",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 24,
+            "column": 27,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 128,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint64"
+            },
+            "nullable": true
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/Vector",
+            "args": [],
+            "nullable": false
+          },
+          "name": "v1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 26,
+            "column": 12,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 160,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "nullable": true
+            },
+            "nullable": false
+          },
+          "name": "v2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 27,
+            "column": 20,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 176,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "nullable": true
+            },
+            "element_count": 4
+          },
+          "name": "v3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 28,
+            "column": 21,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 192,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint64"
+            },
+            "element_count": 1
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/AliasOfArray",
+            "args": [],
+            "nullable": false
+          },
+          "name": "a1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 30,
+            "column": 18,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 256,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "array",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "element_count": 1
+            },
+            "nullable": false
+          },
+          "name": "a2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 31,
+            "column": 26,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 264,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "array",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "element_count": 1
+            },
+            "element_count": 4
+          },
+          "name": "a3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 32,
+            "column": 27,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 280,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "request",
+            "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+            "nullable": false
+          },
+          "name": "p1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 34,
+            "column": 30,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 312,
+            "padding": 4
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "request",
+              "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+              "nullable": false
+            },
+            "nullable": false
+          },
+          "name": "p2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 35,
+            "column": 38,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 320,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "request",
+              "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+              "nullable": false
+            },
+            "element_count": 4
+          },
+          "name": "p3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 36,
+            "column": 39,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 336,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "request",
+            "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+            "nullable": true
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/AliasOfRequest",
+            "args": [],
+            "nullable": false
+          },
+          "name": "r1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 38,
+            "column": 20,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 352,
+            "padding": 4
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "request",
+              "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+              "nullable": true
+            },
+            "nullable": false
+          },
+          "name": "r2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 39,
+            "column": 28,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 360,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "request",
+              "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+              "nullable": true
+            },
+            "element_count": 4
+          },
+          "name": "r3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 40,
+            "column": 29,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 376,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint8"
+            },
+            "nullable": false
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/AliasOfBytes",
+            "args": [],
+            "nullable": false
+          },
+          "name": "b1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 42,
+            "column": 18,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 392,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint8"
+              },
+              "nullable": false
+            },
+            "nullable": false
+          },
+          "name": "b2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 43,
+            "column": 26,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 408,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint8"
+              },
+              "nullable": false
+            },
+            "element_count": 4
+          },
+          "name": "b3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 44,
+            "column": 27,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 424,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "string",
+            "nullable": false
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/AliasOfString",
+            "args": [],
+            "nullable": false
+          },
+          "name": "s1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 46,
+            "column": 19,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 488,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "string",
+              "nullable": false
+            },
+            "nullable": false
+          },
+          "name": "s2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 47,
+            "column": 27,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 504,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "string",
+              "nullable": false
+            },
+            "element_count": 4
+          },
+          "name": "s3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 48,
+            "column": 28,
+            "length": 2
+          },
+          "field_shape_v1": {
+            "offset": 520,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint64"
+            },
+            "maybe_element_count": 2,
+            "nullable": false
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/AliasOfVectorContainingAliasOfVector",
+            "args": [],
+            "nullable": false
+          },
+          "name": "vv1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 50,
+            "column": 42,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 584,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "maybe_element_count": 2,
+              "nullable": false
+            },
+            "maybe_element_count": 3,
+            "nullable": false
+          },
+          "name": "vv2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 51,
+            "column": 52,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 600,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "vector",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "maybe_element_count": 2,
+              "nullable": false
+            },
+            "element_count": 3
+          },
+          "name": "vv3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 52,
+            "column": 51,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 616,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "primitive",
+              "subtype": "uint64"
+            },
+            "element_count": 2
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/AliasOfArrayContainingAliasOfArray",
+            "args": [],
+            "nullable": false
+          },
+          "name": "aa1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 54,
+            "column": 40,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 664,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "array",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "element_count": 2
+            },
+            "maybe_element_count": 3,
+            "nullable": false
+          },
+          "name": "aa2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 55,
+            "column": 50,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 680,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "array",
+              "element_type": {
+                "kind": "primitive",
+                "subtype": "uint64"
+              },
+              "element_count": 2
+            },
+            "element_count": 3
+          },
+          "name": "aa3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 56,
+            "column": 49,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 696,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "request",
+            "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+            "nullable": false
+          },
+          "experimental_maybe_from_type_alias": {
+            "name": "fidl.test.experimentalmaybefromtypealias/AliasOfRequestContainingAliasOfProtocol",
+            "args": [],
+            "nullable": false
+          },
+          "name": "rr1",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 58,
+            "column": 45,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 744,
+            "padding": 4
+          }
+        },
+        {
+          "type": {
+            "kind": "vector",
+            "element_type": {
+              "kind": "request",
+              "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+              "nullable": false
+            },
+            "maybe_element_count": 3,
+            "nullable": false
+          },
+          "name": "rr2",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 59,
+            "column": 55,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 752,
+            "padding": 0
+          }
+        },
+        {
+          "type": {
+            "kind": "array",
+            "element_type": {
+              "kind": "request",
+              "subtype": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+              "nullable": false
+            },
+            "element_count": 3
+          },
+          "name": "rr3",
+          "location": {
+            "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+            "line": 60,
+            "column": 54,
+            "length": 3
+          },
+          "field_shape_v1": {
+            "offset": 768,
+            "padding": 4
+          }
+        }
+      ],
+      "resource": true,
+      "type_shape_v1": {
+        "inline_size": 784,
+        "alignment": 8,
+        "depth": 2,
+        "max_handles": 4294967295,
+        "max_out_of_line": 4294967295,
+        "has_padding": true,
+        "has_flexible_envelope": false
+      }
+    }
+  ],
+  "table_declarations": [],
+  "union_declarations": [],
+  "type_alias_declarations": [
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfBytes",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 6,
+        "column": 7,
+        "length": 12
+      },
+      "partial_type_ctor": {
+        "name": "vector",
+        "args": [],
+        "nullable": false
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfString",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 7,
+        "column": 7,
+        "length": 13
+      },
+      "partial_type_ctor": {
+        "name": "string",
+        "args": [],
+        "nullable": false
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/U64",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 8,
+        "column": 7,
+        "length": 3
+      },
+      "partial_type_ctor": {
+        "name": "uint64",
+        "args": [],
+        "nullable": false
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfProtocol",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 9,
+        "column": 7,
+        "length": 15
+      },
+      "partial_type_ctor": {
+        "name": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+        "args": [],
+        "nullable": false
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/Vector",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 10,
+        "column": 7,
+        "length": 6
+      },
+      "partial_type_ctor": {
+        "name": "vector",
+        "args": [
+          {
+            "name": "uint64",
+            "args": [],
+            "nullable": false
+          }
+        ],
+        "nullable": true
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfArray",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 11,
+        "column": 7,
+        "length": 12
+      },
+      "partial_type_ctor": {
+        "name": "array",
+        "args": [
+          {
+            "name": "uint64",
+            "args": [],
+            "nullable": false
+          }
+        ],
+        "nullable": false,
+        "maybe_size": {
+          "kind": "literal",
+          "value": "1",
+          "expression": "1",
+          "literal": {
+            "kind": "numeric",
+            "value": "1",
+            "expression": "1"
+          }
+        }
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfRequest",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 12,
+        "column": 7,
+        "length": 14
+      },
+      "partial_type_ctor": {
+        "name": "request",
+        "args": [
+          {
+            "name": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+            "args": [],
+            "nullable": true
+          }
+        ],
+        "nullable": true
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfVectorContainingAliasOfVector",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 13,
+        "column": 7,
+        "length": 36
+      },
+      "partial_type_ctor": {
+        "name": "vector",
+        "args": [
+          {
+            "name": "uint64",
+            "args": [],
+            "nullable": false
+          }
+        ],
+        "nullable": false,
+        "maybe_size": {
+          "kind": "literal",
+          "value": "2",
+          "expression": "2",
+          "literal": {
+            "kind": "numeric",
+            "value": "2",
+            "expression": "2"
+          }
+        }
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfArrayContainingAliasOfArray",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 14,
+        "column": 7,
+        "length": 34
+      },
+      "partial_type_ctor": {
+        "name": "array",
+        "args": [
+          {
+            "name": "uint64",
+            "args": [],
+            "nullable": false
+          }
+        ],
+        "nullable": false,
+        "maybe_size": {
+          "kind": "literal",
+          "value": "2",
+          "expression": "2",
+          "literal": {
+            "kind": "numeric",
+            "value": "2",
+            "expression": "2"
+          }
+        }
+      }
+    },
+    {
+      "name": "fidl.test.experimentalmaybefromtypealias/AliasOfRequestContainingAliasOfProtocol",
+      "location": {
+        "filename": "../../tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl",
+        "line": 15,
+        "column": 7,
+        "length": 39
+      },
+      "partial_type_ctor": {
+        "name": "request",
+        "args": [
+          {
+            "name": "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+            "args": [],
+            "nullable": false
+          }
+        ],
+        "nullable": false
+      }
+    }
+  ],
+  "declaration_order": [
+    "fidl.test.experimentalmaybefromtypealias/Vector",
+    "fidl.test.experimentalmaybefromtypealias/U64",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfVectorContainingAliasOfVector",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfArrayContainingAliasOfArray",
+    "fidl.test.experimentalmaybefromtypealias/MyProtocol",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfString",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfRequestContainingAliasOfProtocol",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfRequest",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfProtocol",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfBytes",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfArray",
+    "fidl.test.experimentalmaybefromtypealias/Testing"
+  ],
+  "declarations": {
+    "fidl.test.experimentalmaybefromtypealias/MyProtocol": "interface",
+    "fidl.test.experimentalmaybefromtypealias/Testing": "struct",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfBytes": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfString": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/U64": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfProtocol": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/Vector": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfArray": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfRequest": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfVectorContainingAliasOfVector": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfArrayContainingAliasOfArray": "type_alias",
+    "fidl.test.experimentalmaybefromtypealias/AliasOfRequestContainingAliasOfProtocol": "type_alias"
+  }
+}
diff --git a/tools/fidl/fidlc/goldens/experimental_maybe_from_type_alias.tables.c.golden b/tools/fidl/fidlc/goldens/experimental_maybe_from_type_alias.tables.c.golden
new file mode 100644
index 0000000..f3e12e1
--- /dev/null
+++ b/tools/fidl/fidlc/goldens/experimental_maybe_from_type_alias.tables.c.golden
@@ -0,0 +1,102 @@
+// WARNING: This file is machine generated by fidlc.
+
+#include <lib/fidl/internal.h>
+
+
+extern const struct FidlCodedStruct fidl_test_experimentalmaybefromtypealias_TestingTable;
+
+
+static const struct FidlCodedVector Vector1nonnullable6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&fidl_internal_kUint64Table), .max_count=1u, .element_size=8u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array8_6uint64Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&fidl_internal_kUint64Table), .array_size=8u, .element_size=8u};
+
+static const struct FidlCodedVector Vector4294967295nonnullable25Vector1nonnullable6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Vector1nonnullable6uint64Table), .max_count=4294967295u, .element_size=16u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedVector Vector4294967295nonnullable14Array8_6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Array8_6uint64Table), .max_count=4294967295u, .element_size=8u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array64_25Vector1nonnullable6uint64Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Vector1nonnullable6uint64Table), .array_size=64u, .element_size=16u};
+
+static const struct FidlCodedArray Array32_14Array8_6uint64Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Array8_6uint64Table), .array_size=32u, .element_size=8u};
+
+static const struct FidlCodedVector Vector4294967295nullable6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&fidl_internal_kUint64Table), .max_count=4294967295u, .element_size=8u, .nullable=kFidlNullability_Nullable};
+
+static const struct FidlCodedVector Vector4294967295nonnullable31Vector4294967295nullable6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Vector4294967295nullable6uint64Table), .max_count=4294967295u, .element_size=16u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array64_31Vector4294967295nullable6uint64Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Vector4294967295nullable6uint64Table), .array_size=64u, .element_size=16u};
+
+static const struct FidlCodedHandle Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable = {.tag=kFidlTypeHandle, .handle_subtype=ZX_OBJ_TYPE_CHANNEL, .handle_rights=ZX_DEFAULT_CHANNEL_RIGHTS, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedVector Vector4294967295nonnullable71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable), .max_count=4294967295u, .element_size=4u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array16_71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable), .array_size=16u, .element_size=4u};
+
+static const struct FidlCodedHandle Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable = {.tag=kFidlTypeHandle, .handle_subtype=ZX_OBJ_TYPE_CHANNEL, .handle_rights=ZX_DEFAULT_CHANNEL_RIGHTS, .nullable=kFidlNullability_Nullable};
+
+static const struct FidlCodedVector Vector4294967295nonnullable68Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable), .max_count=4294967295u, .element_size=4u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array16_68Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable), .array_size=16u, .element_size=4u};
+
+static const struct FidlCodedVector Vector4294967295nonnullable5uint8Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&fidl_internal_kUint8Table), .max_count=4294967295u, .element_size=1u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedVector Vector4294967295nonnullable33Vector4294967295nonnullable5uint8Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Vector4294967295nonnullable5uint8Table), .max_count=4294967295u, .element_size=16u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array64_33Vector4294967295nonnullable5uint8Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Vector4294967295nonnullable5uint8Table), .array_size=64u, .element_size=16u};
+
+static const struct FidlCodedString String4294967295nonnullableTable = {.tag=kFidlTypeString, .max_size=4294967295u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedVector Vector4294967295nonnullable27String4294967295nonnullableTable = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&String4294967295nonnullableTable), .max_count=4294967295u, .element_size=16u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array64_27String4294967295nonnullableTable __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&String4294967295nonnullableTable), .array_size=64u, .element_size=16u};
+
+static const struct FidlCodedVector Vector2nonnullable6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&fidl_internal_kUint64Table), .max_count=2u, .element_size=8u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedVector Vector3nonnullable25Vector2nonnullable6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Vector2nonnullable6uint64Table), .max_count=3u, .element_size=16u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array48_25Vector2nonnullable6uint64Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Vector2nonnullable6uint64Table), .array_size=48u, .element_size=16u};
+
+static const struct FidlCodedArray Array16_6uint64Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&fidl_internal_kUint64Table), .array_size=16u, .element_size=8u};
+
+static const struct FidlCodedVector Vector3nonnullable15Array16_6uint64Table = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Array16_6uint64Table), .max_count=3u, .element_size=16u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array48_15Array16_6uint64Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Array16_6uint64Table), .array_size=48u, .element_size=16u};
+
+static const struct FidlCodedVector Vector3nonnullable71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable = {.tag=kFidlTypeVector, .element=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable), .max_count=3u, .element_size=4u, .nullable=kFidlNullability_Nonnullable};
+
+static const struct FidlCodedArray Array12_71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable), .array_size=12u, .element_size=4u};
+
+
+static const struct FidlStructElement Fields48fidl_test_experimentalmaybefromtypealias_Testing[] = {
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=8u, .field_type=(fidl_type_t*)(&Vector1nonnullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=32u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable25Vector1nonnullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=48u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable14Array8_6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=64u, .field_type=(fidl_type_t*)(&Array64_25Vector1nonnullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=160u, .field_type=(fidl_type_t*)(&Vector4294967295nullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=176u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable31Vector4294967295nullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=192u, .field_type=(fidl_type_t*)(&Array64_31Vector4294967295nullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=264u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable14Array8_6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=312u, .field_type=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable)}},
+    /*FidlStructPadding*/{.padding=/*FidlStructPadding*/{.offset=316u, .header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Padding32,.is_resource=kFidlIsResource_NotResource},.mask_32=4294967295u}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=320u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=336u, .field_type=(fidl_type_t*)(&Array16_71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=352u, .field_type=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable)}},
+    /*FidlStructPadding*/{.padding=/*FidlStructPadding*/{.offset=356u, .header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Padding32,.is_resource=kFidlIsResource_NotResource},.mask_32=4294967295u}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=360u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable68Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=376u, .field_type=(fidl_type_t*)(&Array16_68Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=392u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable5uint8Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=408u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable33Vector4294967295nonnullable5uint8Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=424u, .field_type=(fidl_type_t*)(&Array64_33Vector4294967295nonnullable5uint8Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=488u, .field_type=(fidl_type_t*)(&String4294967295nonnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=504u, .field_type=(fidl_type_t*)(&Vector4294967295nonnullable27String4294967295nonnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=520u, .field_type=(fidl_type_t*)(&Array64_27String4294967295nonnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=584u, .field_type=(fidl_type_t*)(&Vector2nonnullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=600u, .field_type=(fidl_type_t*)(&Vector3nonnullable25Vector2nonnullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=616u, .field_type=(fidl_type_t*)(&Array48_25Vector2nonnullable6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=680u, .field_type=(fidl_type_t*)(&Vector3nonnullable15Array16_6uint64Table)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=744u, .field_type=(fidl_type_t*)(&Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable)}},
+    /*FidlStructPadding*/{.padding=/*FidlStructPadding*/{.offset=748u, .header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Padding32,.is_resource=kFidlIsResource_NotResource},.mask_32=4294967295u}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=752u, .field_type=(fidl_type_t*)(&Vector3nonnullable71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable)}},
+    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_Resource},.offset=768u, .field_type=(fidl_type_t*)(&Array12_71Request51fidl_test_experimentalmaybefromtypealias_MyProtocolnonnullableTable)}},
+    /*FidlStructPadding*/{.padding=/*FidlStructPadding*/{.offset=780u, .header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Padding32,.is_resource=kFidlIsResource_NotResource},.mask_32=4294967295u}}
+};
+const struct FidlCodedStruct fidl_test_experimentalmaybefromtypealias_TestingTable = {.tag=kFidlTypeStruct, .elements=Fields48fidl_test_experimentalmaybefromtypealias_Testing, .element_count=31u, .size=784u, .name="fidl.test.experimentalmaybefromtypealias/Testing"};
+
diff --git a/tools/fidl/fidlc/goldens/goldens.txt b/tools/fidl/fidlc/goldens/goldens.txt
index d6f32736..d8c2fea 100644
--- a/tools/fidl/fidlc/goldens/goldens.txt
+++ b/tools/fidl/fidlc/goldens/goldens.txt
@@ -24,6 +24,8 @@
 error.tables.c.golden
 escaping.json.golden
 escaping.tables.c.golden
+experimental_maybe_from_type_alias.json.golden
+experimental_maybe_from_type_alias.tables.c.golden
 foreign_type_in_response_used_through_compose.json.golden
 foreign_type_in_response_used_through_compose.tables.c.golden
 handles.json.golden
diff --git a/tools/fidl/fidlc/testdata/BUILD.gn b/tools/fidl/fidlc/testdata/BUILD.gn
index db5a750..85d06e5 100644
--- a/tools/fidl/fidlc/testdata/BUILD.gn
+++ b/tools/fidl/fidlc/testdata/BUILD.gn
@@ -18,6 +18,7 @@
   "enum.test.fidl",
   "error.test.fidl",
   "escaping.test.fidl",
+  "experimental_maybe_from_type_alias.test.fidl",
   "handles.test.fidl",
   "handles_in_types.test.fidl",
   "inheritance.test.fidl",
diff --git a/tools/fidl/fidlc/testdata/info.gni b/tools/fidl/fidlc/testdata/info.gni
index 6aad7fb..0db8a8b 100644
--- a/tools/fidl/fidlc/testdata/info.gni
+++ b/tools/fidl/fidlc/testdata/info.gni
@@ -203,6 +203,17 @@
     ]
   },
   {
+    name = "experimental_maybe_from_type_alias"
+    target = "//tools/fidl/fidlc/testdata/type_aliases:fidl.test.experimentalmaybefromtypealias"
+    denylist = [
+      # TODO(fxbug.dev/62533): Fix many issues.
+      "fidlgen_hlcpp",
+      "fidlgen_cpp",
+      "fidlgen_libfuzzer",
+      "fidlgen_llcpp",
+    ]
+  },
+  {
     name = "foreign_type_in_response_used_through_compose"
     target = "//tools/fidl/fidlc/testdata/foreign_type_in_response_used_through_compose:fidl.test.foreigntypeinresponseusedthroughcompose"
     host_build_denylist = [
diff --git a/tools/fidl/fidlc/testdata/type_aliases/BUILD.gn b/tools/fidl/fidlc/testdata/type_aliases/BUILD.gn
index 5997c56..187c788 100644
--- a/tools/fidl/fidlc/testdata/type_aliases/BUILD.gn
+++ b/tools/fidl/fidlc/testdata/type_aliases/BUILD.gn
@@ -11,6 +11,12 @@
   host_llcpp = true
 }
 
+fidl("fidl.test.experimentalmaybefromtypealias") {
+  testonly = true
+  sources = [ "experimental_maybe_from_type_alias.test.fidl" ]
+  host_llcpp = true
+}
+
 fidl("someotherlibrary") {
   testonly = true
   sources = [ "someotherlibrary.test.fidl" ]
diff --git a/tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl b/tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl
new file mode 100644
index 0000000..4ea4868
--- /dev/null
+++ b/tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl
@@ -0,0 +1,61 @@
+library fidl.test.experimentalmaybefromtypealias;
+
+protocol MyProtocol {
+};
+
+alias AliasOfBytes = bytes;
+alias AliasOfString = string;
+alias U64 = uint64;
+alias AliasOfProtocol = MyProtocol;
+alias Vector = vector<uint64>?;
+alias AliasOfArray = array<uint64>:1;
+alias AliasOfRequest = request<MyProtocol?>?;
+alias AliasOfVectorContainingAliasOfVector = vector<U64>:2;
+alias AliasOfArrayContainingAliasOfArray = array<U64>:2;
+alias AliasOfRequestContainingAliasOfProtocol = request<AliasOfProtocol>;
+
+resource struct Testing {
+    U64 u1;
+    vector<U64>:1 u2;
+    array<U64>:1 u3;
+    vector<vector<U64>:1> u4;
+    vector<array<U64>:1> u5;
+    array<vector<U64>:1>:4 u6;
+    array<array<U64>:1>:4 u7;
+
+    Vector v1;
+    vector<Vector> v2;
+    array<Vector>:4 v3;
+
+    AliasOfArray a1;
+    vector<AliasOfArray> a2;
+    array<AliasOfArray>:4 a3;
+
+    request<AliasOfProtocol> p1;
+    vector<request<AliasOfProtocol>> p2;
+    array<request<AliasOfProtocol>>:4 p3;
+
+    AliasOfRequest r1;
+    vector<AliasOfRequest> r2;
+    array<AliasOfRequest>:4 r3;
+
+    AliasOfBytes b1;
+    vector<AliasOfBytes> b2;
+    array<AliasOfBytes>:4 b3;
+
+    AliasOfString s1;
+    vector<AliasOfString> s2;
+    array<AliasOfString>:4 s3;
+
+    AliasOfVectorContainingAliasOfVector vv1;
+    vector<AliasOfVectorContainingAliasOfVector>:3 vv2;
+    array<AliasOfVectorContainingAliasOfVector>:3 vv3;
+
+    AliasOfArrayContainingAliasOfArray aa1;
+    vector<AliasOfArrayContainingAliasOfArray>:3 aa2;
+    array<AliasOfArrayContainingAliasOfArray>:3 aa3;
+
+    AliasOfRequestContainingAliasOfProtocol rr1;
+    vector<AliasOfRequestContainingAliasOfProtocol>:3 rr2;
+    array<AliasOfRequestContainingAliasOfProtocol>:3 rr3;
+};
diff --git a/tools/fidl/fidldoc/goldens/README.md.golden b/tools/fidl/fidldoc/goldens/README.md.golden
index b0ac296..ac1e95d 100644
--- a/tools/fidl/fidldoc/goldens/README.md.golden
+++ b/tools/fidl/fidldoc/goldens/README.md.golden
@@ -60,6 +60,10 @@
     <td></td>
 </tr>
 <tr>
+    <td><a href="fidl.test.experimentalmaybefromtypealias/index">fidl.test.experimentalmaybefromtypealias</a></td>
+    <td></td>
+</tr>
+<tr>
     <td><a href="fidl.test.foreigntypeinresponseusedthroughcompose/index">fidl.test.foreigntypeinresponseusedthroughcompose</a></td>
     <td></td>
 </tr>
diff --git a/tools/fidl/fidldoc/goldens/_toc.yaml.golden b/tools/fidl/fidldoc/goldens/_toc.yaml.golden
index aa828c7..615c278 100644
--- a/tools/fidl/fidldoc/goldens/_toc.yaml.golden
+++ b/tools/fidl/fidldoc/goldens/_toc.yaml.golden
@@ -29,6 +29,8 @@
     path: /fidl.test.error
   - title: fidl.test.escaping
     path: /fidl.test.escaping
+  - title: fidl.test.experimentalmaybefromtypealias
+    path: /fidl.test.experimentalmaybefromtypealias
   - title: fidl.test.foreigntypeinresponseusedthroughcompose
     path: /fidl.test.foreigntypeinresponseusedthroughcompose
   - title: fidl.test.handles
diff --git a/tools/fidl/fidldoc/goldens/experimental_maybe_from_type_alias.md.golden b/tools/fidl/fidldoc/goldens/experimental_maybe_from_type_alias.md.golden
new file mode 100644
index 0000000..f000a9b
--- /dev/null
+++ b/tools/fidl/fidldoc/goldens/experimental_maybe_from_type_alias.md.golden
@@ -0,0 +1,329 @@
+[TOC]
+
+# fidl.test.experimentalmaybefromtypealias
+
+
+## **PROTOCOLS**
+
+## MyProtocol {#MyProtocol}
+*Defined in [fidl.test.experimentalmaybefromtypealias/experimental_maybe_from_type_alias.test.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=3)*
+
+
+
+
+## **STRUCTS**
+
+### Testing {#Testing}
+*Defined in [fidl.test.experimentalmaybefromtypealias/experimental_maybe_from_type_alias.test.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=17)*
+
+
+
+<table>
+    <tr><th>Name</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="Testing.u1">
+            <td><code>u1</code></td>
+            <td>
+                <code><a class='link' href='#U64'>U64</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.u2">
+            <td><code>u2</code></td>
+            <td>
+                <code>vector&lt;uint64&gt;[1]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.u3">
+            <td><code>u3</code></td>
+            <td>
+                <code>uint64[1]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.u4">
+            <td><code>u4</code></td>
+            <td>
+                <code>vector&lt;vector&lt;uint64&gt;&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.u5">
+            <td><code>u5</code></td>
+            <td>
+                <code>vector&lt;array&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.u6">
+            <td><code>u6</code></td>
+            <td>
+                <code>[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.u7">
+            <td><code>u7</code></td>
+            <td>
+                <code>[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.v1">
+            <td><code>v1</code></td>
+            <td>
+                <code><a class='link' href='#Vector'>Vector</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.v2">
+            <td><code>v2</code></td>
+            <td>
+                <code>vector&lt;vector&lt;uint64&gt;&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.v3">
+            <td><code>v3</code></td>
+            <td>
+                <code>[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.a1">
+            <td><code>a1</code></td>
+            <td>
+                <code><a class='link' href='#AliasOfArray'>AliasOfArray</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.a2">
+            <td><code>a2</code></td>
+            <td>
+                <code>vector&lt;array&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.a3">
+            <td><code>a3</code></td>
+            <td>
+                <code>[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.p1">
+            <td><code>p1</code></td>
+            <td>
+                <code>request&lt;<a class='link' href='#MyProtocol'>MyProtocol</a>&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.p2">
+            <td><code>p2</code></td>
+            <td>
+                <code>vector&lt;fidl.test.experimentalmaybefromtypealias/MyProtocol&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.p3">
+            <td><code>p3</code></td>
+            <td>
+                <code>fidl.test.experimentalmaybefromtypealias/MyProtocol[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.r1">
+            <td><code>r1</code></td>
+            <td>
+                <code><a class='link' href='#AliasOfRequest'>AliasOfRequest</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.r2">
+            <td><code>r2</code></td>
+            <td>
+                <code>vector&lt;fidl.test.experimentalmaybefromtypealias/MyProtocol&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.r3">
+            <td><code>r3</code></td>
+            <td>
+                <code>fidl.test.experimentalmaybefromtypealias/MyProtocol[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.b1">
+            <td><code>b1</code></td>
+            <td>
+                <code><a class='link' href='#AliasOfBytes'>AliasOfBytes</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.b2">
+            <td><code>b2</code></td>
+            <td>
+                <code>vector&lt;vector&lt;uint8&gt;&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.b3">
+            <td><code>b3</code></td>
+            <td>
+                <code>[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.s1">
+            <td><code>s1</code></td>
+            <td>
+                <code><a class='link' href='#AliasOfString'>AliasOfString</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.s2">
+            <td><code>s2</code></td>
+            <td>
+                <code>vector&lt;string&gt;</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.s3">
+            <td><code>s3</code></td>
+            <td>
+                <code>[4]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.vv1">
+            <td><code>vv1</code></td>
+            <td>
+                <code><a class='link' href='#AliasOfVectorContainingAliasOfVector'>AliasOfVectorContainingAliasOfVector</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.vv2">
+            <td><code>vv2</code></td>
+            <td>
+                <code>vector&lt;vector&lt;uint64&gt;&gt;[3]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.vv3">
+            <td><code>vv3</code></td>
+            <td>
+                <code>[3]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.aa1">
+            <td><code>aa1</code></td>
+            <td>
+                <code><a class='link' href='#AliasOfArrayContainingAliasOfArray'>AliasOfArrayContainingAliasOfArray</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.aa2">
+            <td><code>aa2</code></td>
+            <td>
+                <code>vector&lt;array&gt;[3]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.aa3">
+            <td><code>aa3</code></td>
+            <td>
+                <code>[3]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.rr1">
+            <td><code>rr1</code></td>
+            <td>
+                <code><a class='link' href='#AliasOfRequestContainingAliasOfProtocol'>AliasOfRequestContainingAliasOfProtocol</a></code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.rr2">
+            <td><code>rr2</code></td>
+            <td>
+                <code>vector&lt;fidl.test.experimentalmaybefromtypealias/MyProtocol&gt;[3]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr><tr id="Testing.rr3">
+            <td><code>rr3</code></td>
+            <td>
+                <code>fidl.test.experimentalmaybefromtypealias/MyProtocol[3]</code>
+            </td>
+            <td></td>
+            <td>No default</td>
+        </tr>
+</table>
+
+
+
+
+
+
+
+
+
+
+
+
+
+## **TYPE ALIASES**
+
+<table>
+    <tr><th>Name</th><th>Value</th><th>Description</th></tr><tr id="AliasOfArray">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=11">AliasOfArray</a></td>
+            <td>
+                <code>array</code>[<code>1</code>]</td>
+            <td></td>
+        </tr><tr id="AliasOfArrayContainingAliasOfArray">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=14">AliasOfArrayContainingAliasOfArray</a></td>
+            <td>
+                <code>array</code>[<code>2</code>]</td>
+            <td></td>
+        </tr><tr id="AliasOfBytes">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=6">AliasOfBytes</a></td>
+            <td>
+                <code>vector</code></td>
+            <td></td>
+        </tr><tr id="AliasOfProtocol">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=9">AliasOfProtocol</a></td>
+            <td>
+                <code>fidl.test.experimentalmaybefromtypealias/MyProtocol</code></td>
+            <td></td>
+        </tr><tr id="AliasOfRequest">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=12">AliasOfRequest</a></td>
+            <td>
+                <code>request</code></td>
+            <td></td>
+        </tr><tr id="AliasOfRequestContainingAliasOfProtocol">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=15">AliasOfRequestContainingAliasOfProtocol</a></td>
+            <td>
+                <code>request</code></td>
+            <td></td>
+        </tr><tr id="AliasOfString">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=7">AliasOfString</a></td>
+            <td>
+                <code>string</code></td>
+            <td></td>
+        </tr><tr id="AliasOfVectorContainingAliasOfVector">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=13">AliasOfVectorContainingAliasOfVector</a></td>
+            <td>
+                <code>vector</code>[<code>2</code>]</td>
+            <td></td>
+        </tr><tr id="U64">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=8">U64</a></td>
+            <td>
+                <code>uint64</code></td>
+            <td></td>
+        </tr><tr id="Vector">
+            <td><a href="https://cs.opensource.google/fuchsia/fuchsia/+/master:tools/fidl/fidlc/testdata/type_aliases/experimental_maybe_from_type_alias.test.fidl;l=10">Vector</a></td>
+            <td>
+                <code>vector</code></td>
+            <td></td>
+        </tr></table>
+
diff --git a/tools/fidl/fidldoc/goldens/goldens.txt b/tools/fidl/fidldoc/goldens/goldens.txt
index 29bf2eb..a11ef7f 100644
--- a/tools/fidl/fidldoc/goldens/goldens.txt
+++ b/tools/fidl/fidldoc/goldens/goldens.txt
@@ -13,6 +13,7 @@
 enum.md.golden
 error.md.golden
 escaping.md.golden
+experimental_maybe_from_type_alias.md.golden
 foreign_type_in_response_used_through_compose.md.golden
 handles.md.golden
 handles_in_types.md.golden
diff --git a/tools/fidl/fidlgen_dart/goldens/experimental_maybe_from_type_alias_async.dart.golden b/tools/fidl/fidlgen_dart/goldens/experimental_maybe_from_type_alias_async.dart.golden
new file mode 100644
index 0000000..2156aa26
--- /dev/null
+++ b/tools/fidl/fidlgen_dart/goldens/experimental_maybe_from_type_alias_async.dart.golden
@@ -0,0 +1,607 @@
+// WARNING: This file is machine generated by fidlgen_dart.
+// @dart = 2.12
+
+library fidl_fidl_test_experimentalmaybefromtypealias_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 $zircon;
+
+// 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_for_file: avoid_unused_constructor_parameters
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
+class Testing extends $fidl.Struct {
+  const Testing({
+    required this.u1,
+    required this.u2,
+    required this.u3,
+    required this.u4,
+    required this.u5,
+    required this.u6,
+    required this.u7,
+    this.v1,
+    required this.v2,
+    required this.v3,
+    required this.a1,
+    required this.a2,
+    required this.a3,
+    required this.p1,
+    required this.p2,
+    required this.p3,
+    this.r1,
+    required this.r2,
+    required this.r3,
+    required this.b1,
+    required this.b2,
+    required this.b3,
+    required this.s1,
+    required this.s2,
+    required this.s3,
+    required this.vv1,
+    required this.vv2,
+    required this.vv3,
+    required this.aa1,
+    required this.aa2,
+    required this.aa3,
+    required this.rr1,
+    required this.rr2,
+    required this.rr3,
+  });
+  Testing.clone(
+    Testing $orig, {
+    int? u1,
+    Uint64List? u2,
+    Uint64List? u3,
+    List<Uint64List>? u4,
+    List<Uint64List>? u5,
+    List<Uint64List>? u6,
+    List<Uint64List>? u7,
+    Uint64List? v1,
+    List<Uint64List?>? v2,
+    List<Uint64List?>? v3,
+    Uint64List? a1,
+    List<Uint64List>? a2,
+    List<Uint64List>? a3,
+    $fidl.InterfaceRequest<MyProtocol>? p1,
+    List<$fidl.InterfaceRequest<MyProtocol>>? p2,
+    List<$fidl.InterfaceRequest<MyProtocol>>? p3,
+    $fidl.InterfaceRequest<MyProtocol>? r1,
+    List<$fidl.InterfaceRequest<MyProtocol>?>? r2,
+    List<$fidl.InterfaceRequest<MyProtocol>?>? r3,
+    Uint8List? b1,
+    List<Uint8List>? b2,
+    List<Uint8List>? b3,
+    String? s1,
+    List<String>? s2,
+    List<String>? s3,
+    Uint64List? vv1,
+    List<Uint64List>? vv2,
+    List<Uint64List>? vv3,
+    Uint64List? aa1,
+    List<Uint64List>? aa2,
+    List<Uint64List>? aa3,
+    $fidl.InterfaceRequest<MyProtocol>? rr1,
+    List<$fidl.InterfaceRequest<MyProtocol>>? rr2,
+    List<$fidl.InterfaceRequest<MyProtocol>>? rr3,
+  }) : this(
+          u1: u1 ?? $orig.u1,
+          u2: u2 ?? $orig.u2,
+          u3: u3 ?? $orig.u3,
+          u4: u4 ?? $orig.u4,
+          u5: u5 ?? $orig.u5,
+          u6: u6 ?? $orig.u6,
+          u7: u7 ?? $orig.u7,
+          v1: v1 ?? $orig.v1,
+          v2: v2 ?? $orig.v2,
+          v3: v3 ?? $orig.v3,
+          a1: a1 ?? $orig.a1,
+          a2: a2 ?? $orig.a2,
+          a3: a3 ?? $orig.a3,
+          p1: p1 ?? $orig.p1,
+          p2: p2 ?? $orig.p2,
+          p3: p3 ?? $orig.p3,
+          r1: r1 ?? $orig.r1,
+          r2: r2 ?? $orig.r2,
+          r3: r3 ?? $orig.r3,
+          b1: b1 ?? $orig.b1,
+          b2: b2 ?? $orig.b2,
+          b3: b3 ?? $orig.b3,
+          s1: s1 ?? $orig.s1,
+          s2: s2 ?? $orig.s2,
+          s3: s3 ?? $orig.s3,
+          vv1: vv1 ?? $orig.vv1,
+          vv2: vv2 ?? $orig.vv2,
+          vv3: vv3 ?? $orig.vv3,
+          aa1: aa1 ?? $orig.aa1,
+          aa2: aa2 ?? $orig.aa2,
+          aa3: aa3 ?? $orig.aa3,
+          rr1: rr1 ?? $orig.rr1,
+          rr2: rr2 ?? $orig.rr2,
+          rr3: rr3 ?? $orig.rr3,
+        );
+
+  Testing.cloneWithout(
+    Testing $orig, {
+    bool v1 = false,
+    bool r1 = false,
+  }) : this(
+          u1: $orig.u1,
+          u2: $orig.u2,
+          u3: $orig.u3,
+          u4: $orig.u4,
+          u5: $orig.u5,
+          u6: $orig.u6,
+          u7: $orig.u7,
+          v1: v1 ? null : $orig.v1,
+          v2: $orig.v2,
+          v3: $orig.v3,
+          a1: $orig.a1,
+          a2: $orig.a2,
+          a3: $orig.a3,
+          p1: $orig.p1,
+          p2: $orig.p2,
+          p3: $orig.p3,
+          r1: r1 ? null : $orig.r1,
+          r2: $orig.r2,
+          r3: $orig.r3,
+          b1: $orig.b1,
+          b2: $orig.b2,
+          b3: $orig.b3,
+          s1: $orig.s1,
+          s2: $orig.s2,
+          s3: $orig.s3,
+          vv1: $orig.vv1,
+          vv2: $orig.vv2,
+          vv3: $orig.vv3,
+          aa1: $orig.aa1,
+          aa2: $orig.aa2,
+          aa3: $orig.aa3,
+          rr1: $orig.rr1,
+          rr2: $orig.rr2,
+          rr3: $orig.rr3,
+        );
+
+  final int u1;
+  final Uint64List u2;
+  final Uint64List u3;
+  final List<Uint64List> u4;
+  final List<Uint64List> u5;
+  final List<Uint64List> u6;
+  final List<Uint64List> u7;
+  final Uint64List? v1;
+  final List<Uint64List?> v2;
+  final List<Uint64List?> v3;
+  final Uint64List a1;
+  final List<Uint64List> a2;
+  final List<Uint64List> a3;
+  final $fidl.InterfaceRequest<MyProtocol> p1;
+  final List<$fidl.InterfaceRequest<MyProtocol>> p2;
+  final List<$fidl.InterfaceRequest<MyProtocol>> p3;
+  final $fidl.InterfaceRequest<MyProtocol>? r1;
+  final List<$fidl.InterfaceRequest<MyProtocol>?> r2;
+  final List<$fidl.InterfaceRequest<MyProtocol>?> r3;
+  final Uint8List b1;
+  final List<Uint8List> b2;
+  final List<Uint8List> b3;
+  final String s1;
+  final List<String> s2;
+  final List<String> s3;
+  final Uint64List vv1;
+  final List<Uint64List> vv2;
+  final List<Uint64List> vv3;
+  final Uint64List aa1;
+  final List<Uint64List> aa2;
+  final List<Uint64List> aa3;
+  final $fidl.InterfaceRequest<MyProtocol> rr1;
+  final List<$fidl.InterfaceRequest<MyProtocol>> rr2;
+  final List<$fidl.InterfaceRequest<MyProtocol>> rr3;
+
+  @override
+  List<Object?> get $fields {
+    return <Object?>[
+      u1,
+      u2,
+      u3,
+      u4,
+      u5,
+      u6,
+      u7,
+      v1,
+      v2,
+      v3,
+      a1,
+      a2,
+      a3,
+      p1,
+      p2,
+      p3,
+      r1,
+      r2,
+      r3,
+      b1,
+      b2,
+      b3,
+      s1,
+      s2,
+      s3,
+      vv1,
+      vv2,
+      vv3,
+      aa1,
+      aa2,
+      aa3,
+      rr1,
+      rr2,
+      rr3,
+    ];
+  }
+
+  static const $fieldType0 = $fidl.Uint64Type();
+  static const $fieldType1 = $fidl.VectorType<int, Uint64List>(
+      element: $fidl.Uint64Type(), maybeElementCount: 1);
+  static const $fieldType2 = $fidl.ArrayType<int, Uint64List>(
+      element: $fidl.Uint64Type(), elementCount: 1);
+  static const $fieldType3 = $fidl.VectorType<Uint64List, List<Uint64List>>(
+      element: $fidl.VectorType<int, Uint64List>(
+          element: $fidl.Uint64Type(), maybeElementCount: 1),
+      maybeElementCount: null);
+  static const $fieldType4 = $fidl.VectorType<Uint64List, List<Uint64List>>(
+      element: $fidl.ArrayType<int, Uint64List>(
+          element: $fidl.Uint64Type(), elementCount: 1),
+      maybeElementCount: null);
+  static const $fieldType5 = $fidl.ArrayType<Uint64List, List<Uint64List>>(
+      element: $fidl.VectorType<int, Uint64List>(
+          element: $fidl.Uint64Type(), maybeElementCount: 1),
+      elementCount: 4);
+  static const $fieldType6 = $fidl.ArrayType<Uint64List, List<Uint64List>>(
+      element: $fidl.ArrayType<int, Uint64List>(
+          element: $fidl.Uint64Type(), elementCount: 1),
+      elementCount: 4);
+  static const $fieldType7 = $fidl.NullableVectorType<int, Uint64List>(
+      element: $fidl.Uint64Type(), maybeElementCount: null);
+  static const $fieldType8 = $fidl.VectorType<Uint64List?, List<Uint64List?>>(
+      element: $fidl.NullableVectorType<int, Uint64List>(
+          element: $fidl.Uint64Type(), maybeElementCount: null),
+      maybeElementCount: null);
+  static const $fieldType9 = $fidl.ArrayType<Uint64List?, List<Uint64List?>>(
+      element: $fidl.NullableVectorType<int, Uint64List>(
+          element: $fidl.Uint64Type(), maybeElementCount: null),
+      elementCount: 4);
+  static const $fieldType10 = $fidl.ArrayType<int, Uint64List>(
+      element: $fidl.Uint64Type(), elementCount: 1);
+  static const $fieldType11 = $fidl.VectorType<Uint64List, List<Uint64List>>(
+      element: $fidl.ArrayType<int, Uint64List>(
+          element: $fidl.Uint64Type(), elementCount: 1),
+      maybeElementCount: null);
+  static const $fieldType12 = $fidl.ArrayType<Uint64List, List<Uint64List>>(
+      element: $fidl.ArrayType<int, Uint64List>(
+          element: $fidl.Uint64Type(), elementCount: 1),
+      elementCount: 4);
+  static const $fieldType13 = $fidl.InterfaceRequestType<MyProtocol>();
+  static const $fieldType14 = $fidl.VectorType<
+          $fidl.InterfaceRequest<MyProtocol>,
+          List<$fidl.InterfaceRequest<MyProtocol>>>(
+      element: $fidl.InterfaceRequestType<MyProtocol>(),
+      maybeElementCount: null);
+  static const $fieldType15 = $fidl.ArrayType<
+          $fidl.InterfaceRequest<MyProtocol>,
+          List<$fidl.InterfaceRequest<MyProtocol>>>(
+      element: $fidl.InterfaceRequestType<MyProtocol>(), elementCount: 4);
+  static const $fieldType16 = $fidl.NullableInterfaceRequestType<MyProtocol>();
+  static const $fieldType17 = $fidl.VectorType<
+          $fidl.InterfaceRequest<MyProtocol>?,
+          List<$fidl.InterfaceRequest<MyProtocol>?>>(
+      element: $fidl.NullableInterfaceRequestType<MyProtocol>(),
+      maybeElementCount: null);
+  static const $fieldType18 = $fidl.ArrayType<
+          $fidl.InterfaceRequest<MyProtocol>?,
+          List<$fidl.InterfaceRequest<MyProtocol>?>>(
+      element: $fidl.NullableInterfaceRequestType<MyProtocol>(),
+      elementCount: 4);
+  static const $fieldType19 = $fidl.VectorType<int, Uint8List>(
+      element: $fidl.Uint8Type(), maybeElementCount: null);
+  static const $fieldType20 = $fidl.VectorType<Uint8List, List<Uint8List>>(
+      element: $fidl.VectorType<int, Uint8List>(
+          element: $fidl.Uint8Type(), maybeElementCount: null),
+      maybeElementCount: null);
+  static const $fieldType21 = $fidl.ArrayType<Uint8List, List<Uint8List>>(
+      element: $fidl.VectorType<int, Uint8List>(
+          element: $fidl.Uint8Type(), maybeElementCount: null),
+      elementCount: 4);
+  static const $fieldType22 = $fidl.StringType(maybeElementCount: null);
+  static const $fieldType23 = $fidl.VectorType<String, List<String>>(
+      element: $fidl.StringType(maybeElementCount: null),
+      maybeElementCount: null);
+  static const $fieldType24 = $fidl.ArrayType<String, List<String>>(
+      element: $fidl.StringType(maybeElementCount: null), elementCount: 4);
+  static const $fieldType25 = $fidl.VectorType<int, Uint64List>(
+      element: $fidl.Uint64Type(), maybeElementCount: 2);
+  static const $fieldType26 = $fidl.VectorType<Uint64List, List<Uint64List>>(
+      element: $fidl.VectorType<int, Uint64List>(
+          element: $fidl.Uint64Type(), maybeElementCount: 2),
+      maybeElementCount: 3);
+  static const $fieldType27 = $fidl.ArrayType<Uint64List, List<Uint64List>>(
+      element: $fidl.VectorType<int, Uint64List>(
+          element: $fidl.Uint64Type(), maybeElementCount: 2),
+      elementCount: 3);
+  static const $fieldType28 = $fidl.ArrayType<int, Uint64List>(
+      element: $fidl.Uint64Type(), elementCount: 2);
+  static const $fieldType29 = $fidl.VectorType<Uint64List, List<Uint64List>>(
+      element: $fidl.ArrayType<int, Uint64List>(
+          element: $fidl.Uint64Type(), elementCount: 2),
+      maybeElementCount: 3);
+  static const $fieldType30 = $fidl.ArrayType<Uint64List, List<Uint64List>>(
+      element: $fidl.ArrayType<int, Uint64List>(
+          element: $fidl.Uint64Type(), elementCount: 2),
+      elementCount: 3);
+  static const $fieldType31 = $fidl.InterfaceRequestType<MyProtocol>();
+  static const $fieldType32 = $fidl.VectorType<
+          $fidl.InterfaceRequest<MyProtocol>,
+          List<$fidl.InterfaceRequest<MyProtocol>>>(
+      element: $fidl.InterfaceRequestType<MyProtocol>(), maybeElementCount: 3);
+  static const $fieldType33 = $fidl.ArrayType<
+          $fidl.InterfaceRequest<MyProtocol>,
+          List<$fidl.InterfaceRequest<MyProtocol>>>(
+      element: $fidl.InterfaceRequestType<MyProtocol>(), elementCount: 3);
+
+  @override
+  void $encode($fidl.Encoder $encoder, int $offset, int $depth) {
+    $fieldType0.encode($encoder, u1, $offset + 0, $depth);
+    $fieldType1.encode($encoder, u2, $offset + 8, $depth);
+    $fieldType2.encode($encoder, u3, $offset + 24, $depth);
+    $fieldType3.encode($encoder, u4, $offset + 32, $depth);
+    $fieldType4.encode($encoder, u5, $offset + 48, $depth);
+    $fieldType5.encode($encoder, u6, $offset + 64, $depth);
+    $fieldType6.encode($encoder, u7, $offset + 128, $depth);
+    $fieldType7.encode($encoder, v1, $offset + 160, $depth);
+    $fieldType8.encode($encoder, v2, $offset + 176, $depth);
+    $fieldType9.encode($encoder, v3, $offset + 192, $depth);
+    $fieldType10.encode($encoder, a1, $offset + 256, $depth);
+    $fieldType11.encode($encoder, a2, $offset + 264, $depth);
+    $fieldType12.encode($encoder, a3, $offset + 280, $depth);
+    $fieldType13.encode($encoder, p1, $offset + 312, $depth);
+    $fieldType14.encode($encoder, p2, $offset + 320, $depth);
+    $fieldType15.encode($encoder, p3, $offset + 336, $depth);
+    $fieldType16.encode($encoder, r1, $offset + 352, $depth);
+    $fieldType17.encode($encoder, r2, $offset + 360, $depth);
+    $fieldType18.encode($encoder, r3, $offset + 376, $depth);
+    $fieldType19.encode($encoder, b1, $offset + 392, $depth);
+    $fieldType20.encode($encoder, b2, $offset + 408, $depth);
+    $fieldType21.encode($encoder, b3, $offset + 424, $depth);
+    $fieldType22.encode($encoder, s1, $offset + 488, $depth);
+    $fieldType23.encode($encoder, s2, $offset + 504, $depth);
+    $fieldType24.encode($encoder, s3, $offset + 520, $depth);
+    $fieldType25.encode($encoder, vv1, $offset + 584, $depth);
+    $fieldType26.encode($encoder, vv2, $offset + 600, $depth);
+    $fieldType27.encode($encoder, vv3, $offset + 616, $depth);
+    $fieldType28.encode($encoder, aa1, $offset + 664, $depth);
+    $fieldType29.encode($encoder, aa2, $offset + 680, $depth);
+    $fieldType30.encode($encoder, aa3, $offset + 696, $depth);
+    $fieldType31.encode($encoder, rr1, $offset + 744, $depth);
+    $fieldType32.encode($encoder, rr2, $offset + 752, $depth);
+    $fieldType33.encode($encoder, rr3, $offset + 768, $depth);
+  }
+
+  @override
+  String toString() {
+    return r'Testing' r'(u1: ' +
+        u1.toString() +
+        r', u2: ' +
+        u2.toString() +
+        r', u3: ' +
+        u3.toString() +
+        r', u4: ' +
+        u4.toString() +
+        r', u5: ' +
+        u5.toString() +
+        r', u6: ' +
+        u6.toString() +
+        r', u7: ' +
+        u7.toString() +
+        r', v1: ' +
+        v1.toString() +
+        r', v2: ' +
+        v2.toString() +
+        r', v3: ' +
+        v3.toString() +
+        r', a1: ' +
+        a1.toString() +
+        r', a2: ' +
+        a2.toString() +
+        r', a3: ' +
+        a3.toString() +
+        r', p1: ' +
+        p1.toString() +
+        r', p2: ' +
+        p2.toString() +
+        r', p3: ' +
+        p3.toString() +
+        r', r1: ' +
+        r1.toString() +
+        r', r2: ' +
+        r2.toString() +
+        r', r3: ' +
+        r3.toString() +
+        r', b1: ' +
+        b1.toString() +
+        r', b2: ' +
+        b2.toString() +
+        r', b3: ' +
+        b3.toString() +
+        r', s1: ' +
+        s1.toString() +
+        r', s2: ' +
+        s2.toString() +
+        r', s3: ' +
+        s3.toString() +
+        r', vv1: ' +
+        vv1.toString() +
+        r', vv2: ' +
+        vv2.toString() +
+        r', vv3: ' +
+        vv3.toString() +
+        r', aa1: ' +
+        aa1.toString() +
+        r', aa2: ' +
+        aa2.toString() +
+        r', aa3: ' +
+        aa3.toString() +
+        r', rr1: ' +
+        rr1.toString() +
+        r', rr2: ' +
+        rr2.toString() +
+        r', rr3: ' +
+        rr3.toString() +
+        r')';
+  }
+
+  static Testing _structDecode(
+      $fidl.Decoder $decoder, int $offset, int $depth) {
+    return Testing(
+        u1: $fieldType0.decode($decoder, $offset + 0, $depth),
+        u2: $fieldType1.decode($decoder, $offset + 8, $depth),
+        u3: $fieldType2.decode($decoder, $offset + 24, $depth),
+        u4: $fieldType3.decode($decoder, $offset + 32, $depth),
+        u5: $fieldType4.decode($decoder, $offset + 48, $depth),
+        u6: $fieldType5.decode($decoder, $offset + 64, $depth),
+        u7: $fieldType6.decode($decoder, $offset + 128, $depth),
+        v1: $fieldType7.decode($decoder, $offset + 160, $depth),
+        v2: $fieldType8.decode($decoder, $offset + 176, $depth),
+        v3: $fieldType9.decode($decoder, $offset + 192, $depth),
+        a1: $fieldType10.decode($decoder, $offset + 256, $depth),
+        a2: $fieldType11.decode($decoder, $offset + 264, $depth),
+        a3: $fieldType12.decode($decoder, $offset + 280, $depth),
+        p1: $fieldType13.decode($decoder, $offset + 312, $depth),
+        p2: $fieldType14.decode($decoder, $offset + 320, $depth),
+        p3: $fieldType15.decode($decoder, $offset + 336, $depth),
+        r1: $fieldType16.decode($decoder, $offset + 352, $depth),
+        r2: $fieldType17.decode($decoder, $offset + 360, $depth),
+        r3: $fieldType18.decode($decoder, $offset + 376, $depth),
+        b1: $fieldType19.decode($decoder, $offset + 392, $depth),
+        b2: $fieldType20.decode($decoder, $offset + 408, $depth),
+        b3: $fieldType21.decode($decoder, $offset + 424, $depth),
+        s1: $fieldType22.decode($decoder, $offset + 488, $depth),
+        s2: $fieldType23.decode($decoder, $offset + 504, $depth),
+        s3: $fieldType24.decode($decoder, $offset + 520, $depth),
+        vv1: $fieldType25.decode($decoder, $offset + 584, $depth),
+        vv2: $fieldType26.decode($decoder, $offset + 600, $depth),
+        vv3: $fieldType27.decode($decoder, $offset + 616, $depth),
+        aa1: $fieldType28.decode($decoder, $offset + 664, $depth),
+        aa2: $fieldType29.decode($decoder, $offset + 680, $depth),
+        aa3: $fieldType30.decode($decoder, $offset + 696, $depth),
+        rr1: $fieldType31.decode($decoder, $offset + 744, $depth),
+        rr2: $fieldType32.decode($decoder, $offset + 752, $depth),
+        rr3: $fieldType33.decode($decoder, $offset + 768, $depth));
+  }
+}
+
+// See fxbug.dev/7644:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Testing> kTesting_Type = $fidl.StructType<Testing>(
+  inlineSize: 784,
+  structDecode: Testing._structDecode,
+);
+
+// ignore: unused_element, avoid_private_typedef_functions
+typedef _VoidCallback = void Function();
+
+abstract class MyProtocol {
+  $fidl.ServiceData? get $serviceData => MyProtocolData();
+}
+
+// TODO: Remove ServiceData for non-service
+class MyProtocolData implements $fidl.ServiceData<MyProtocol> {
+  const MyProtocolData();
+
+  @override
+  String getName() {
+    return "";
+  }
+
+  @override
+  $fidl.AsyncBinding getBinding() {
+    return MyProtocolBinding();
+  }
+}
+
+class MyProtocolProxy extends $fidl.AsyncProxy<MyProtocol>
+    implements MyProtocol {
+  MyProtocolProxy()
+      : super($fidl.AsyncProxyController<MyProtocol>(
+            $interfaceName: r'MyProtocol')) {
+    ctrl.onResponse = _handleResponse;
+  }
+  @override
+  Null get $serviceData => null;
+
+  void _handleEvent($fidl.IncomingMessage $message) {
+    switch ($message.ordinal) {
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+
+  void _handleResponse($fidl.IncomingMessage $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;
+    }
+    switch ($message.ordinal) {
+      default:
+        ctrl.proxyError(
+            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
+        ctrl.close();
+        break;
+    }
+  }
+}
+
+class MyProtocolBinding extends $fidl.AsyncBinding<MyProtocol> {
+  MyProtocolBinding() : super(r"MyProtocol");
+
+  @override
+  void handleMessage(
+      $fidl.IncomingMessage $message, $fidl.OutgoingMessageSink $respond) {
+    switch ($message.ordinal) {
+      default:
+        throw $fidl.FidlError(r'Unexpected message name for MyProtocolBinding');
+    }
+  }
+}
diff --git a/tools/fidl/fidlgen_dart/goldens/experimental_maybe_from_type_alias_test.dart.golden b/tools/fidl/fidlgen_dart/goldens/experimental_maybe_from_type_alias_test.dart.golden
new file mode 100644
index 0000000..532a29c
--- /dev/null
+++ b/tools/fidl/fidlgen_dart/goldens/experimental_maybe_from_type_alias_test.dart.golden
@@ -0,0 +1,24 @@
+// WARNING: This file is machine generated by fidlgen_dart.
+// @dart = 2.12
+
+library fidl_fidl_test_experimentalmaybefromtypealias_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 $zircon;
+
+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 MyProtocol$TestBase extends MyProtocol {}
diff --git a/tools/fidl/fidlgen_dart/goldens/goldens.txt b/tools/fidl/fidlgen_dart/goldens/goldens.txt
index 3380c99..4a79922 100644
--- a/tools/fidl/fidlgen_dart/goldens/goldens.txt
+++ b/tools/fidl/fidlgen_dart/goldens/goldens.txt
@@ -22,6 +22,8 @@
 error_test.dart.golden
 escaping_async.dart.golden
 escaping_test.dart.golden
+experimental_maybe_from_type_alias_async.dart.golden
+experimental_maybe_from_type_alias_test.dart.golden
 foreign_type_in_response_used_through_compose_async.dart.golden
 foreign_type_in_response_used_through_compose_test.dart.golden
 handles_async.dart.golden
diff --git a/tools/fidl/fidlgen_go/goldens/experimental_maybe_from_type_alias.go.golden b/tools/fidl/fidlgen_go/goldens/experimental_maybe_from_type_alias.go.golden
new file mode 100644
index 0000000..54f5eb6
--- /dev/null
+++ b/tools/fidl/fidlgen_go/goldens/experimental_maybe_from_type_alias.go.golden
@@ -0,0 +1,79 @@
+// Code generated by fidlgen; DO NOT EDIT.
+
+package experimentalmaybefromtypealias
+
+import (
+	_bindings "syscall/zx/fidl"
+)
+
+type Testing struct {
+	_   struct{}                             `fidl:"s" fidl_size_v1:"784" fidl_alignment_v1:"8"`
+	U1  uint64                               `fidl_offset_v1:"0"`
+	U2  []uint64                             `fidl_offset_v1:"8" fidl_bounds:"1"`
+	U3  [1]uint64                            `fidl_offset_v1:"24"`
+	U4  [][]uint64                           `fidl_offset_v1:"32" fidl_bounds:",1"`
+	U5  [][1]uint64                          `fidl_offset_v1:"48" fidl_bounds:""`
+	U6  [4][]uint64                          `fidl_offset_v1:"64" fidl_bounds:"1"`
+	U7  [4][1]uint64                         `fidl_offset_v1:"128"`
+	V1  *[]uint64                            `fidl_offset_v1:"160" fidl_bounds:""`
+	V2  []*[]uint64                          `fidl_offset_v1:"176" fidl_bounds:""`
+	V3  [4]*[]uint64                         `fidl_offset_v1:"192" fidl_bounds:""`
+	A1  [1]uint64                            `fidl_offset_v1:"256"`
+	A2  [][1]uint64                          `fidl_offset_v1:"264" fidl_bounds:""`
+	A3  [4][1]uint64                         `fidl_offset_v1:"280"`
+	P1  MyProtocolWithCtxInterfaceRequest    `fidl_offset_v1:"312" fidl_handle_subtype:"4" fidl_bounds:"0"`
+	P2  []MyProtocolWithCtxInterfaceRequest  `fidl_offset_v1:"320" fidl_handle_subtype:"4" fidl_bounds:",0"`
+	P3  [4]MyProtocolWithCtxInterfaceRequest `fidl_offset_v1:"336" fidl_handle_subtype:"4" fidl_bounds:"0"`
+	R1  MyProtocolWithCtxInterfaceRequest    `fidl_offset_v1:"352" fidl_handle_subtype:"4" fidl_bounds:"1"`
+	R2  []MyProtocolWithCtxInterfaceRequest  `fidl_offset_v1:"360" fidl_handle_subtype:"4" fidl_bounds:",1"`
+	R3  [4]MyProtocolWithCtxInterfaceRequest `fidl_offset_v1:"376" fidl_handle_subtype:"4" fidl_bounds:"1"`
+	B1  []uint8                              `fidl_offset_v1:"392" fidl_bounds:""`
+	B2  [][]uint8                            `fidl_offset_v1:"408" fidl_bounds:""`
+	B3  [4][]uint8                           `fidl_offset_v1:"424" fidl_bounds:""`
+	S1  string                               `fidl_offset_v1:"488" fidl_bounds:""`
+	S2  []string                             `fidl_offset_v1:"504" fidl_bounds:""`
+	S3  [4]string                            `fidl_offset_v1:"520" fidl_bounds:""`
+	Vv1 []uint64                             `fidl_offset_v1:"584" fidl_bounds:"2"`
+	Vv2 [][]uint64                           `fidl_offset_v1:"600" fidl_bounds:"3,2"`
+	Vv3 [3][]uint64                          `fidl_offset_v1:"616" fidl_bounds:"2"`
+	Aa1 [2]uint64                            `fidl_offset_v1:"664"`
+	Aa2 [][2]uint64                          `fidl_offset_v1:"680" fidl_bounds:"3"`
+	Aa3 [3][2]uint64                         `fidl_offset_v1:"696"`
+	Rr1 MyProtocolWithCtxInterfaceRequest    `fidl_offset_v1:"744" fidl_handle_subtype:"4" fidl_bounds:"0"`
+	Rr2 []MyProtocolWithCtxInterfaceRequest  `fidl_offset_v1:"752" fidl_handle_subtype:"4" fidl_bounds:"3,0"`
+	Rr3 [3]MyProtocolWithCtxInterfaceRequest `fidl_offset_v1:"768" fidl_handle_subtype:"4" fidl_bounds:"0"`
+}
+
+var _mTesting = _bindings.CreateLazyMarshaler(Testing{})
+
+func (msg *Testing) Marshaler() _bindings.Marshaler {
+	return _mTesting
+}
+
+const ()
+
+type MyProtocolWithCtxInterface _bindings.ChannelProxy
+
+type MyProtocolWithCtx interface {
+}
+
+type MyProtocolWithCtxTransitionalBase struct{}
+
+type MyProtocolWithCtxInterfaceRequest _bindings.InterfaceRequest
+
+func NewMyProtocolWithCtxInterfaceRequest() (MyProtocolWithCtxInterfaceRequest, *MyProtocolWithCtxInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return MyProtocolWithCtxInterfaceRequest(req), (*MyProtocolWithCtxInterface)(cli), err
+}
+
+type MyProtocolWithCtxStub struct {
+	Impl MyProtocolWithCtx
+}
+
+func (s_ *MyProtocolWithCtxStub) Dispatch(args_ _bindings.DispatchArgs) (_bindings.Message, bool, error) {
+	switch args_.Ordinal {
+	}
+	return nil, false, _bindings.ErrUnknownOrdinal
+}
+
+type MyProtocolEventProxy _bindings.ChannelProxy
diff --git a/tools/fidl/fidlgen_go/goldens/goldens.txt b/tools/fidl/fidlgen_go/goldens/goldens.txt
index d19658e..385c0ec 100644
--- a/tools/fidl/fidlgen_go/goldens/goldens.txt
+++ b/tools/fidl/fidlgen_go/goldens/goldens.txt
@@ -10,6 +10,7 @@
 enum.go.golden
 error.go.golden
 escaping.go.golden
+experimental_maybe_from_type_alias.go.golden
 foreign_type_in_response_used_through_compose.go.golden
 handles.go.golden
 handles_in_types.go.golden
diff --git a/tools/fidl/fidlgen_rust/goldens/experimental_maybe_from_type_alias.rs.golden b/tools/fidl/fidlgen_rust/goldens/experimental_maybe_from_type_alias.rs.golden
new file mode 100644
index 0000000..ae67575
--- /dev/null
+++ b/tools/fidl/fidlgen_rust/goldens/experimental_maybe_from_type_alias.rs.golden
@@ -0,0 +1,539 @@
+// WARNING: This file is machine generated by fidlgen.
+
+#![allow(
+	unused_parens, // one-element-tuple-case is not a tuple
+	unused_mut, // not all args require mutation, but many do
+	nonstandard_style, // auto-caps does its best, but is not always successful
+)]
+#![recursion_limit = "512"]
+
+#[cfg(target_os = "fuchsia")]
+#[allow(unused_imports)]
+use fuchsia_zircon as zx;
+
+#[allow(unused_imports)]
+use {
+    bitflags::bitflags,
+    fidl::{
+        client::{decode_transaction_body_fut, QueryResponseFut},
+        encoding::{Decodable as _, Encodable as _},
+        fidl_empty_struct, fidl_flexible_bits, fidl_flexible_enum, fidl_strict_bits,
+        fidl_strict_enum, fidl_struct, fidl_struct_copy, fidl_table, fidl_xunion,
+        wrap_handle_metadata,
+    },
+    fuchsia_zircon_status as zx_status,
+    futures::future::{self, MaybeDone, TryFutureExt},
+};
+
+const _FIDL_TRACE_BINDINGS_RUST: u32 = 6;
+
+#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
+pub struct Testing {
+    pub u1: u64,
+    pub u2: Vec<u64>,
+    pub u3: [u64; 1],
+    pub u4: Vec<Vec<u64>>,
+    pub u5: Vec<[u64; 1]>,
+    pub u6: [Vec<u64>; 4],
+    pub u7: [[u64; 1]; 4],
+    pub v1: Option<Vec<u64>>,
+    pub v2: Vec<Option<Vec<u64>>>,
+    pub v3: [Option<Vec<u64>>; 4],
+    pub a1: [u64; 1],
+    pub a2: Vec<[u64; 1]>,
+    pub a3: [[u64; 1]; 4],
+    pub p1: fidl::endpoints::ServerEnd<MyProtocolMarker>,
+    pub p2: Vec<fidl::endpoints::ServerEnd<MyProtocolMarker>>,
+    pub p3: [fidl::endpoints::ServerEnd<MyProtocolMarker>; 4],
+    pub r1: Option<fidl::endpoints::ServerEnd<MyProtocolMarker>>,
+    pub r2: Vec<Option<fidl::endpoints::ServerEnd<MyProtocolMarker>>>,
+    pub r3: [Option<fidl::endpoints::ServerEnd<MyProtocolMarker>>; 4],
+    pub b1: Vec<u8>,
+    pub b2: Vec<Vec<u8>>,
+    pub b3: [Vec<u8>; 4],
+    pub s1: String,
+    pub s2: Vec<String>,
+    pub s3: [String; 4],
+    pub vv1: Vec<u64>,
+    pub vv2: Vec<Vec<u64>>,
+    pub vv3: [Vec<u64>; 3],
+    pub aa1: [u64; 2],
+    pub aa2: Vec<[u64; 2]>,
+    pub aa3: [[u64; 2]; 3],
+    pub rr1: fidl::endpoints::ServerEnd<MyProtocolMarker>,
+    pub rr2: Vec<fidl::endpoints::ServerEnd<MyProtocolMarker>>,
+    pub rr3: [fidl::endpoints::ServerEnd<MyProtocolMarker>; 3],
+}
+
+fidl_struct! {
+  name: Testing,
+  members: [
+    u1 {
+      ty: u64,
+      offset_v1: 0,
+    },
+    u2 {
+      ty: Vec<u64>,
+      offset_v1: 8,
+    },
+    u3 {
+      ty: [u64; 1],
+      offset_v1: 24,
+    },
+    u4 {
+      ty: Vec<Vec<u64>>,
+      offset_v1: 32,
+    },
+    u5 {
+      ty: Vec<[u64; 1]>,
+      offset_v1: 48,
+    },
+    u6 {
+      ty: [Vec<u64>; 4],
+      offset_v1: 64,
+    },
+    u7 {
+      ty: [[u64; 1]; 4],
+      offset_v1: 128,
+    },
+    v1 {
+      ty: Option<Vec<u64>>,
+      offset_v1: 160,
+    },
+    v2 {
+      ty: Vec<Option<Vec<u64>>>,
+      offset_v1: 176,
+    },
+    v3 {
+      ty: [Option<Vec<u64>>; 4],
+      offset_v1: 192,
+    },
+    a1 {
+      ty: [u64; 1],
+      offset_v1: 256,
+    },
+    a2 {
+      ty: Vec<[u64; 1]>,
+      offset_v1: 264,
+    },
+    a3 {
+      ty: [[u64; 1]; 4],
+      offset_v1: 280,
+    },
+    p1 {
+      ty: fidl::endpoints::ServerEnd<MyProtocolMarker>,
+      offset_v1: 312,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    p2 {
+      ty: Vec<fidl::endpoints::ServerEnd<MyProtocolMarker>>,
+      offset_v1: 320,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    p3 {
+      ty: [fidl::endpoints::ServerEnd<MyProtocolMarker>; 4],
+      offset_v1: 336,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    r1 {
+      ty: Option<fidl::endpoints::ServerEnd<MyProtocolMarker>>,
+      offset_v1: 352,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    r2 {
+      ty: Vec<Option<fidl::endpoints::ServerEnd<MyProtocolMarker>>>,
+      offset_v1: 360,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    r3 {
+      ty: [Option<fidl::endpoints::ServerEnd<MyProtocolMarker>>; 4],
+      offset_v1: 376,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    b1 {
+      ty: Vec<u8>,
+      offset_v1: 392,
+    },
+    b2 {
+      ty: Vec<Vec<u8>>,
+      offset_v1: 408,
+    },
+    b3 {
+      ty: [Vec<u8>; 4],
+      offset_v1: 424,
+    },
+    s1 {
+      ty: String,
+      offset_v1: 488,
+    },
+    s2 {
+      ty: Vec<String>,
+      offset_v1: 504,
+    },
+    s3 {
+      ty: [String; 4],
+      offset_v1: 520,
+    },
+    vv1 {
+      ty: Vec<u64>,
+      offset_v1: 584,
+    },
+    vv2 {
+      ty: Vec<Vec<u64>>,
+      offset_v1: 600,
+    },
+    vv3 {
+      ty: [Vec<u64>; 3],
+      offset_v1: 616,
+    },
+    aa1 {
+      ty: [u64; 2],
+      offset_v1: 664,
+    },
+    aa2 {
+      ty: Vec<[u64; 2]>,
+      offset_v1: 680,
+    },
+    aa3 {
+      ty: [[u64; 2]; 3],
+      offset_v1: 696,
+    },
+    rr1 {
+      ty: fidl::endpoints::ServerEnd<MyProtocolMarker>,
+      offset_v1: 744,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    rr2 {
+      ty: Vec<fidl::endpoints::ServerEnd<MyProtocolMarker>>,
+      offset_v1: 752,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+    rr3 {
+      ty: [fidl::endpoints::ServerEnd<MyProtocolMarker>; 3],
+      offset_v1: 768,
+      handle_metadata: {
+        handle_subtype: fidl::ObjectType::CHANNEL,
+        handle_rights: fidl::Rights::CHANNEL_DEFAULT,
+      },
+    },
+  ],
+  padding: [
+  {
+      ty: u64,
+      offset: 312,
+      mask: 0xffffffff00000000u64,
+  },
+  {
+      ty: u64,
+      offset: 352,
+      mask: 0xffffffff00000000u64,
+  },
+  {
+      ty: u64,
+      offset: 744,
+      mask: 0xffffffff00000000u64,
+  },
+  {
+      ty: u64,
+      offset: 776,
+      mask: 0xffffffff00000000u64,
+  },],
+  size_v1: 784,
+  align_v1: 8,
+}
+
+#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
+pub struct MyProtocolMarker;
+
+impl fidl::endpoints::ServiceMarker for MyProtocolMarker {
+    type Proxy = MyProtocolProxy;
+    type RequestStream = MyProtocolRequestStream;
+    const DEBUG_NAME: &'static str = "(anonymous) MyProtocol";
+}
+
+pub trait MyProtocolProxyInterface: Send + Sync {}
+
+#[derive(Debug)]
+#[cfg(target_os = "fuchsia")]
+pub struct MyProtocolSynchronousProxy {
+    client: fidl::client::sync::Client,
+}
+
+#[cfg(target_os = "fuchsia")]
+impl MyProtocolSynchronousProxy {
+    pub fn new(channel: fidl::Channel) -> Self {
+        let service_name = <MyProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME;
+        Self { client: fidl::client::sync::Client::new(channel, service_name) }
+    }
+
+    pub fn into_channel(self) -> fidl::Channel {
+        self.client.into_channel()
+    }
+}
+
+#[derive(Debug, Clone)]
+pub struct MyProtocolProxy {
+    client: fidl::client::Client,
+}
+
+impl fidl::endpoints::Proxy for MyProtocolProxy {
+    type Service = MyProtocolMarker;
+
+    fn from_channel(inner: fidl::AsyncChannel) -> Self {
+        Self::new(inner)
+    }
+
+    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
+        self.client.into_channel().map_err(|client| Self { client })
+    }
+
+    fn as_channel(&self) -> &::fidl::AsyncChannel {
+        self.client.as_channel()
+    }
+}
+
+impl MyProtocolProxy {
+    /// Create a new Proxy for MyProtocol
+    pub fn new(channel: fidl::AsyncChannel) -> Self {
+        let service_name = <MyProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME;
+        Self { client: fidl::client::Client::new(channel, service_name) }
+    }
+
+    /// Get a Stream of events from the remote end of the MyProtocol protocol
+    ///
+    /// # Panics
+    ///
+    /// Panics if the event stream was already taken.
+    pub fn take_event_stream(&self) -> MyProtocolEventStream {
+        MyProtocolEventStream { event_receiver: self.client.take_event_receiver() }
+    }
+}
+
+impl MyProtocolProxyInterface for MyProtocolProxy {}
+
+pub struct MyProtocolEventStream {
+    event_receiver: fidl::client::EventReceiver,
+}
+
+impl std::marker::Unpin for MyProtocolEventStream {}
+
+impl futures::stream::FusedStream for MyProtocolEventStream {
+    fn is_terminated(&self) -> bool {
+        self.event_receiver.is_terminated()
+    }
+}
+
+impl futures::Stream for MyProtocolEventStream {
+    type Item = Result<MyProtocolEvent, fidl::Error>;
+
+    fn poll_next(
+        mut self: std::pin::Pin<&mut Self>,
+        cx: &mut std::task::Context<'_>,
+    ) -> std::task::Poll<Option<Self::Item>> {
+        let mut buf = match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
+            &mut self.event_receiver,
+            cx
+        )?) {
+            Some(buf) => buf,
+            None => return std::task::Poll::Ready(None),
+        };
+        let (bytes, _handles) = buf.split_mut();
+        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
+
+        std::task::Poll::Ready(Some(match tx_header.ordinal() {
+            _ => Err(fidl::Error::UnknownOrdinal {
+                ordinal: tx_header.ordinal(),
+                service_name: <MyProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME,
+            }),
+        }))
+    }
+}
+
+#[derive(Debug)]
+pub enum MyProtocolEvent {}
+
+impl MyProtocolEvent {}
+
+/// A type which can be used to send responses and events into a borrowed channel.
+///
+/// Note: this should only be used when the channel must be temporarily
+/// borrowed. For a typical sending of events, use the send_ methods
+/// on the ControlHandle types, which can be acquired through a
+/// RequestStream or Responder type.
+#[deprecated(note = "Use MyProtocolRequestStream / Responder instead")]
+pub struct MyProtocolServerSender<'a> {
+    // Some protocols don't define events which would render this channel unused.
+    #[allow(dead_code)]
+    channel: &'a fidl::Channel,
+}
+
+#[allow(deprecated)]
+impl<'a> MyProtocolServerSender<'a> {
+    pub fn new(channel: &'a fidl::Channel) -> Self {
+        Self { channel }
+    }
+}
+
+/// A Stream of incoming requests for MyProtocol
+pub struct MyProtocolRequestStream {
+    inner: std::sync::Arc<fidl::ServeInner>,
+    is_terminated: bool,
+}
+
+impl std::marker::Unpin for MyProtocolRequestStream {}
+
+impl futures::stream::FusedStream for MyProtocolRequestStream {
+    fn is_terminated(&self) -> bool {
+        self.is_terminated
+    }
+}
+
+impl fidl::endpoints::RequestStream for MyProtocolRequestStream {
+    type Service = MyProtocolMarker;
+
+    /// Consume a channel to make a MyProtocolRequestStream
+    fn from_channel(channel: fidl::AsyncChannel) -> Self {
+        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
+    }
+
+    /// ControlHandle for the remote connection
+    type ControlHandle = MyProtocolControlHandle;
+
+    /// ControlHandle for the remote connection
+    fn control_handle(&self) -> Self::ControlHandle {
+        MyProtocolControlHandle { inner: self.inner.clone() }
+    }
+
+    fn into_inner(self) -> (::std::sync::Arc<fidl::ServeInner>, bool) {
+        (self.inner, self.is_terminated)
+    }
+
+    fn from_inner(inner: std::sync::Arc<fidl::ServeInner>, is_terminated: bool) -> Self {
+        Self { inner, is_terminated }
+    }
+}
+
+impl futures::Stream for MyProtocolRequestStream {
+    type Item = Result<MyProtocolRequest, fidl::Error>;
+
+    fn poll_next(
+        mut self: std::pin::Pin<&mut Self>,
+        cx: &mut std::task::Context<'_>,
+    ) -> std::task::Poll<Option<Self::Item>> {
+        let this = &mut *self;
+        if this.inner.poll_shutdown(cx) {
+            this.is_terminated = true;
+            return std::task::Poll::Ready(None);
+        }
+        if this.is_terminated {
+            panic!("polled MyProtocolRequestStream after completion");
+        }
+        fidl::encoding::with_tls_decode_buf(|bytes, handles| {
+            match this.inner.channel().read_etc(cx, bytes, handles) {
+                std::task::Poll::Ready(Ok(())) => {}
+                std::task::Poll::Pending => return std::task::Poll::Pending,
+                std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
+                    this.is_terminated = true;
+                    return std::task::Poll::Ready(None);
+                }
+                std::task::Poll::Ready(Err(e)) => {
+                    return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(e))))
+                }
+            }
+
+            // A message has been received from the channel
+            let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
+            if !header.is_compatible() {
+                return std::task::Poll::Ready(Some(Err(fidl::Error::IncompatibleMagicNumber(
+                    header.magic_number(),
+                ))));
+            }
+
+            std::task::Poll::Ready(Some(match header.ordinal() {
+                _ => Err(fidl::Error::UnknownOrdinal {
+                    ordinal: header.ordinal(),
+                    service_name: <MyProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME,
+                }),
+            }))
+        })
+    }
+}
+
+/// Represents a single request.
+/// RequestMessages should only be used for manual deserialization when higher level
+/// structs such as RequestStream cannot be used. One usually would only encounter
+/// such scenarios when working with legacy FIDL code (prior to FIDL generated client/server bindings).
+#[derive(Debug)]
+#[deprecated(note = "Use MyProtocolRequest instead")]
+pub enum MyProtocolRequestMessage {}
+
+#[allow(deprecated)]
+impl MyProtocolRequestMessage {
+    pub fn decode(
+        bytes: &[u8],
+        _handles: &mut [fidl::HandleInfo],
+    ) -> Result<MyProtocolRequestMessage, fidl::Error> {
+        let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
+
+        match header.ordinal() {
+            _ => Err(fidl::Error::UnknownOrdinal {
+                ordinal: header.ordinal(),
+                service_name: <MyProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME,
+            }),
+        }
+    }
+}
+#[derive(Debug)]
+pub enum MyProtocolRequest {}
+
+impl MyProtocolRequest {
+    /// Name of the method defined in FIDL
+    pub fn method_name(&self) -> &'static str {
+        match *self {}
+    }
+}
+
+pub struct MyProtocolEncoder;
+
+impl MyProtocolEncoder {}
+
+#[derive(Debug, Clone)]
+pub struct MyProtocolControlHandle {
+    inner: std::sync::Arc<fidl::ServeInner>,
+}
+
+impl MyProtocolControlHandle {
+    /// Set the server to shutdown. The underlying channel is only closed the
+    /// next time the stream is polled.
+    pub fn shutdown(&self) {
+        self.inner.shutdown()
+    }
+
+    pub fn shutdown_with_epitaph(&self, status: zx_status::Status) {
+        self.inner.shutdown_with_epitaph(status)
+    }
+}
diff --git a/tools/fidl/fidlgen_rust/goldens/goldens.txt b/tools/fidl/fidlgen_rust/goldens/goldens.txt
index 258118d..cd3e3ca 100644
--- a/tools/fidl/fidlgen_rust/goldens/goldens.txt
+++ b/tools/fidl/fidlgen_rust/goldens/goldens.txt
@@ -10,6 +10,7 @@
 enum.rs.golden
 error.rs.golden
 escaping.rs.golden
+experimental_maybe_from_type_alias.rs.golden
 foreign_type_in_response_used_through_compose.rs.golden
 handles.rs.golden
 handles_in_types.rs.golden
diff --git a/tools/fidl/fidlgen_syzkaller/goldens/experimental_maybe_from_type_alias.syz.txt.golden b/tools/fidl/fidlgen_syzkaller/goldens/experimental_maybe_from_type_alias.syz.txt.golden
new file mode 100644
index 0000000..ce6a761a
--- /dev/null
+++ b/tools/fidl/fidlgen_syzkaller/goldens/experimental_maybe_from_type_alias.syz.txt.golden
@@ -0,0 +1,85 @@
+# Copyright 2018 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#
+# WARNING: This file is machine generated by fidlgen.
+
+include <fidl/test/experimentalmaybefromtypealias/c/fidl.h>
+fidl_test_experimentalmaybefromtypealias_TestingInLine {
+       u1 int64
+       u2InLine fidl_vector
+       u3InLine array[int64, 1]
+       u4InLine fidl_vector
+       u5InLine fidl_vector
+       u6InLine array[fidl_vector, 4]
+       u7InLine array[array[int64, 1], 4]
+       v1InLine fidl_vector
+       v2InLine fidl_vector
+       v3InLine array[fidl_vector, 4]
+       a1InLine array[int64, 1]
+       a2InLine fidl_vector
+       a3InLine array[array[int64, 1], 4]
+       p1 flags[fidl_handle_presence, int32]
+       p2InLine fidl_vector
+       p3InLine array[flags[fidl_handle_presence, int32], 4]
+       r1 flags[fidl_handle_presence, int32]
+       r2InLine fidl_vector
+       r3InLine array[flags[fidl_handle_presence, int32], 4]
+       b1InLine fidl_vector
+       b2InLine fidl_vector
+       b3InLine array[fidl_vector, 4]
+       s1InLine fidl_string
+       s2InLine fidl_vector
+       s3InLine array[fidl_string, 4]
+       vv1InLine fidl_vector
+       vv2InLine fidl_vector
+       vv3InLine array[fidl_vector, 3]
+       aa1InLine array[int64, 2]
+       aa2InLine fidl_vector
+       aa3InLine array[array[int64, 2], 3]
+       rr1 flags[fidl_handle_presence, int32]
+       rr2InLine fidl_vector
+       rr3InLine array[flags[fidl_handle_presence, int32], 3]
+} [packed]
+fidl_test_experimentalmaybefromtypealias_TestingOutOfLine {
+       u2OutOfLine array[int64]
+       u4OutOfLine parallel_array[fidl_vector, array[int64]]
+       u5OutOfLine array[array[int64, 1]]
+       u6OutOfLine array[array[int64], 4]
+       v1OutOfLine array[int64]
+       v2OutOfLine parallel_array[fidl_vector, array[int64]]
+       v3OutOfLine array[array[int64], 4]
+       a2OutOfLine array[array[int64, 1]]
+       p2OutOfLine array[flags[fidl_handle_presence, int32]]
+       r2OutOfLine array[flags[fidl_handle_presence, int32]]
+       b1OutOfLine array[int8]
+       b2OutOfLine parallel_array[fidl_vector, array[int8]]
+       b3OutOfLine array[array[int8], 4]
+       s1OutOfLine fidl_aligned[stringnoz]
+       s2OutOfLine parallel_array[fidl_string, fidl_aligned[stringnoz]]
+       s3OutOfLine array[fidl_aligned[stringnoz], 4]
+       vv1OutOfLine array[int64]
+       vv2OutOfLine parallel_array[fidl_vector, array[int64]]
+       vv3OutOfLine array[array[int64], 3]
+       aa2OutOfLine array[array[int64, 2]]
+       rr2OutOfLine array[flags[fidl_handle_presence, int32]]
+} [packed]
+fidl_test_experimentalmaybefromtypealias_TestingHandles {
+       p1 zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server
+       p2 array[zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server]
+       p3Handles array[zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server, 4]
+       r1 zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server
+       r2 array[zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server]
+       r3Handles array[zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server, 4]
+       rr1 zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server
+       rr2 array[zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server]
+       rr3Handles array[zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server, 3]
+} [packed]
+
+
+
+resource zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_client[zx_chan]
+resource zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server[zx_chan]
+
+zx_channel_create$fidl_test_experimentalmaybefromtypealias_MyProtocol(options const[0], out0 ptr[out, zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_client], out1 ptr[out, zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server])
+fdio_service_connect$fidl_test_experimentalmaybefromtypealias_MyProtocol(path ptr[in, string["/svc/"]], handle zx_chan_fidl_test_experimentalmaybefromtypealias_MyProtocol_server)
+
diff --git a/tools/fidl/fidlgen_syzkaller/goldens/goldens.txt b/tools/fidl/fidlgen_syzkaller/goldens/goldens.txt
index cd01390..85d07aa 100644
--- a/tools/fidl/fidlgen_syzkaller/goldens/goldens.txt
+++ b/tools/fidl/fidlgen_syzkaller/goldens/goldens.txt
@@ -11,6 +11,7 @@
 enum.syz.txt.golden
 error.syz.txt.golden
 escaping.syz.txt.golden
+experimental_maybe_from_type_alias.syz.txt.golden
 foreign_type_in_response_used_through_compose.syz.txt.golden
 handles.syz.txt.golden
 handles_in_types.syz.txt.golden