diff --git a/garnet/go/src/fidl/compiler/backend/golang/ir/ir.go b/garnet/go/src/fidl/compiler/backend/golang/ir/ir.go
index c6d7ed26af40d495ed409489f0fbc83300e6c0f2..0b892950f5a3f7e831374cd433a951a228905e18 100644
--- a/garnet/go/src/fidl/compiler/backend/golang/ir/ir.go
+++ b/garnet/go/src/fidl/compiler/backend/golang/ir/ir.go
@@ -582,12 +582,6 @@ var handleTypes = map[types.HandleSubtype]string{
 	types.Vmar:    "_zx.VMAR",
 }
 
-func exportIdentifier(name types.EncodedCompoundIdentifier) types.CompoundIdentifier {
-	ci := types.ParseCompoundIdentifier(name)
-	ci.Name = types.Identifier(common.ToUpperCamelCase(string(ci.Name)))
-	return ci
-}
-
 func isReservedWord(str string) bool {
 	_, ok := reservedWords[str]
 	return ok
@@ -624,8 +618,13 @@ func (_ *compiler) compileIdentifier(id types.Identifier, export bool, ext strin
 	return changeIfReserved(types.Identifier(str), ext)
 }
 
-func (c *compiler) compileCompoundIdentifier(eci types.EncodedCompoundIdentifier, ext string) string {
-	ci := exportIdentifier(eci)
+func (c *compiler) compileCompoundIdentifier(eci types.EncodedCompoundIdentifier, export bool, ext string) string {
+	ci := types.ParseCompoundIdentifier(eci)
+	if export {
+		ci.Name = types.Identifier(common.ToUpperCamelCase(string(ci.Name)))
+	} else {
+		ci.Name = types.Identifier(common.ToLowerCamelCase(string(ci.Name)))
+	}
 	pkg := compileLibraryIdentifier(ci.Library)
 	strs := []string{}
 	if c.inExternalLibrary(ci) {
@@ -707,7 +706,7 @@ func (c *compiler) compileType(val types.Type) (r Type, t Tag, t2 tagNew) {
 		t2.reverseOfBounds = append(t2.reverseOfBounds, nullability)
 		r = Type(e)
 	case types.RequestType:
-		e := c.compileCompoundIdentifier(val.RequestSubtype, RequestSuffix)
+		e := c.compileCompoundIdentifier(val.RequestSubtype, true, RequestSuffix)
 		var nullability int
 		if val.Nullable {
 			t.Nullable = true
@@ -733,7 +732,7 @@ func (c *compiler) compileType(val types.Type) (r Type, t Tag, t2 tagNew) {
 	case types.PrimitiveType:
 		r = c.compilePrimitiveSubtype(val.PrimitiveSubtype)
 	case types.IdentifierType:
-		e := c.compileCompoundIdentifier(val.Identifier, "")
+		e := c.compileCompoundIdentifier(val.Identifier, true, "")
 		declType, ok := c.decls[val.Identifier]
 		if !ok {
 			log.Fatal("Unknown identifier: ", val.Identifier)
@@ -781,7 +780,7 @@ func (c *compiler) compileBits(val types.Bits) Bits {
 	t, _, _ := c.compileType(val.Type)
 	r := Bits{
 		Attributes: val.Attributes,
-		Name:       c.compileCompoundIdentifier(val.Name, ""),
+		Name:       c.compileCompoundIdentifier(val.Name, true, ""),
 		Type:       t,
 	}
 	for _, v := range val.Members {
@@ -796,7 +795,7 @@ func (c *compiler) compileConst(val types.Const) Const {
 	t, _, _ := c.compileType(val.Type)
 	return Const{
 		Attributes: val.Attributes,
-		Name:       c.compileCompoundIdentifier(val.Name, ""),
+		Name:       c.compileCompoundIdentifier(val.Name, true, ""),
 		Type:       t,
 		Value:      c.compileConstant(val.Value),
 	}
@@ -813,7 +812,7 @@ func (c *compiler) compileEnumMember(val types.EnumMember) EnumMember {
 func (c *compiler) compileEnum(val types.Enum) Enum {
 	r := Enum{
 		Attributes: val.Attributes,
-		Name:       c.compileCompoundIdentifier(val.Name, ""),
+		Name:       c.compileCompoundIdentifier(val.Name, true, ""),
 		Type:       c.compilePrimitiveSubtype(val.Type),
 	}
 	for _, v := range val.Members {
@@ -836,7 +835,7 @@ func (c *compiler) compileStructMember(val types.StructMember) StructMember {
 func (c *compiler) compileStruct(val types.Struct) Struct {
 	r := Struct{
 		Attributes: val.Attributes,
-		Name:       c.compileCompoundIdentifier(val.Name, ""),
+		Name:       c.compileCompoundIdentifier(val.Name, true, ""),
 		Size:       val.Size,
 		Alignment:  val.Alignment,
 	}
@@ -862,8 +861,8 @@ func (c *compiler) compileUnionMember(unionName string, val types.UnionMember) U
 func (c *compiler) compileUnion(val types.Union) Union {
 	r := Union{
 		Attributes: val.Attributes,
-		Name:       c.compileCompoundIdentifier(val.Name, ""),
-		TagName:    c.compileCompoundIdentifier(val.Name, TagSuffix),
+		Name:       c.compileCompoundIdentifier(val.Name, true, ""),
+		TagName:    c.compileCompoundIdentifier(val.Name, true, TagSuffix),
 		Size:       val.Size,
 		Alignment:  val.Alignment,
 	}
@@ -890,8 +889,8 @@ func (c *compiler) compileXUnion(val types.XUnion) XUnion {
 	}
 	return XUnion{
 		Attributes: val.Attributes,
-		Name:       c.compileCompoundIdentifier(val.Name, ""),
-		TagName:    c.compileCompoundIdentifier(val.Name, TagSuffix),
+		Name:       c.compileCompoundIdentifier(val.Name, true, ""),
+		TagName:    c.compileCompoundIdentifier(val.Name, true, TagSuffix),
 		Size:       val.Size,
 		Alignment:  val.Alignment,
 		Members:    members,
@@ -926,7 +925,7 @@ func (c *compiler) compileTable(val types.Table) Table {
 	}
 	return Table{
 		Attributes: val.Attributes,
-		Name:       c.compileCompoundIdentifier(val.Name, ""),
+		Name:       c.compileCompoundIdentifier(val.Name, true, ""),
 		Size:       val.Size,
 		Alignment:  val.Alignment,
 		Members:    members,
@@ -949,16 +948,16 @@ func (c *compiler) compileMethod(ifaceName types.EncodedCompoundIdentifier, val
 		Attributes:      val.Attributes,
 		Name:            methodName,
 		Ordinal:         val.Ordinal,
-		OrdinalName:     c.compileCompoundIdentifier(ifaceName, methodName+"Ordinal"),
+		OrdinalName:     c.compileCompoundIdentifier(ifaceName, true, methodName+"Ordinal"),
 		GenOrdinal:      val.GenOrdinal,
-		GenOrdinalName:  c.compileCompoundIdentifier(ifaceName, methodName+"GenOrdinal"),
+		GenOrdinalName:  c.compileCompoundIdentifier(ifaceName, true, methodName+"GenOrdinal"),
 		EventExpectName: "Expect" + methodName,
 		IsEvent:         !val.HasRequest && val.HasResponse,
 		IsTransitional:  val.IsTransitional(),
 	}
 	if val.HasRequest {
 		req := Struct{
-			Name: c.compileCompoundIdentifier(ifaceName, methodName+"Request"),
+			Name: c.compileCompoundIdentifier(ifaceName, false, methodName+"Request"),
 			// We want just the size of the parameter array as a struct, not
 			// including the message header size.
 			Size: val.RequestSize - MessageHeaderSize,
@@ -970,7 +969,7 @@ func (c *compiler) compileMethod(ifaceName types.EncodedCompoundIdentifier, val
 	}
 	if val.HasResponse {
 		resp := Struct{
-			Name: c.compileCompoundIdentifier(ifaceName, methodName+"Response"),
+			Name: c.compileCompoundIdentifier(ifaceName, false, methodName+"Response"),
 			// We want just the size of the parameter array as a struct, not
 			// including the message header size.
 			Size: val.ResponseSize - MessageHeaderSize,
@@ -990,15 +989,15 @@ func (c *compiler) compileInterface(val types.Interface) Interface {
 	}
 	r := Interface{
 		Attributes:           val.Attributes,
-		Name:                 c.compileCompoundIdentifier(val.Name, ""),
-		TransitionalBaseName: c.compileCompoundIdentifier(val.Name, TransitionalBaseSuffix),
-		ProxyName:            c.compileCompoundIdentifier(val.Name, ProxySuffix),
+		Name:                 c.compileCompoundIdentifier(val.Name, true, ""),
+		TransitionalBaseName: c.compileCompoundIdentifier(val.Name, true, TransitionalBaseSuffix),
+		ProxyName:            c.compileCompoundIdentifier(val.Name, true, ProxySuffix),
 		ProxyType:            proxyType,
-		StubName:             c.compileCompoundIdentifier(val.Name, StubSuffix),
-		RequestName:          c.compileCompoundIdentifier(val.Name, RequestSuffix),
-		EventProxyName:       c.compileCompoundIdentifier(val.Name, EventProxySuffix),
-		ServerName:           c.compileCompoundIdentifier(val.Name, ServiceSuffix),
-		ServiceNameConstant:  c.compileCompoundIdentifier(val.Name, ServiceNameSuffix),
+		StubName:             c.compileCompoundIdentifier(val.Name, true, StubSuffix),
+		RequestName:          c.compileCompoundIdentifier(val.Name, true, RequestSuffix),
+		EventProxyName:       c.compileCompoundIdentifier(val.Name, true, EventProxySuffix),
+		ServerName:           c.compileCompoundIdentifier(val.Name, true, ServiceSuffix),
+		ServiceNameConstant:  c.compileCompoundIdentifier(val.Name, true, ServiceNameSuffix),
 		ServiceNameString:    val.GetServiceName(),
 	}
 	for _, v := range val.Methods {
diff --git a/garnet/go/src/fidl/compiler/backend/golang/ir/ir_test.go b/garnet/go/src/fidl/compiler/backend/golang/ir/ir_test.go
index 38b5379b0cd320dddfc49be9278660670a00d11a..e574e43e21f4f4e46fcda1370d79ebd13e92646d 100644
--- a/garnet/go/src/fidl/compiler/backend/golang/ir/ir_test.go
+++ b/garnet/go/src/fidl/compiler/backend/golang/ir/ir_test.go
@@ -634,7 +634,7 @@ func TestCompileInterface(t *testing.T) {
 				GenOrdinalName: "TestFirstGenOrdinal",
 				Name:           "First",
 				Request: &Struct{
-					Name: "TestFirstRequest",
+					Name: "testFirstRequest",
 					Members: []StructMember{
 						{
 							Name:        "Value",
@@ -654,7 +654,7 @@ func TestCompileInterface(t *testing.T) {
 				GenOrdinalName: "TestSecondGenOrdinal",
 				Name:           "Second",
 				Request: &Struct{
-					Name: "TestSecondRequest",
+					Name: "testSecondRequest",
 					Members: []StructMember{
 						{
 							Name:        "Value",
@@ -665,7 +665,7 @@ func TestCompileInterface(t *testing.T) {
 					Size: 16,
 				},
 				Response: &Struct{
-					Name: "TestSecondResponse",
+					Name: "testSecondResponse",
 					Members: []StructMember{
 						{
 							Name:        "Value",
@@ -727,7 +727,7 @@ func TestCompileInterface(t *testing.T) {
 				GenOrdinalName: "TestFirstGenOrdinal",
 				Name:           "First",
 				Response: &Struct{
-					Name: "TestFirstResponse",
+					Name: "testFirstResponse",
 					Members: []StructMember{
 						{
 							Name:        "Value",
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json
index 3f246611a79bc74fe5f791d2f34a5ed1713beb27..caa37664e79cfa8ecf2c56fd30c04a1dec3bd89c 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json
@@ -4,7 +4,49 @@
   "library_dependencies": [],
   "bits_declarations": [],
   "const_declarations": [],
-  "enum_declarations": [],
+  "enum_declarations": [
+    {
+      "name": "test.name/ErrorEnun",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
+        "line": 14,
+        "column": 5
+      },
+      "type": "uint32",
+      "members": [
+        {
+          "name": "ERR_FOO",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
+            "line": 15,
+            "column": 4
+          },
+          "value": {
+            "kind": "literal",
+            "literal": {
+              "kind": "numeric",
+              "value": "1"
+            }
+          }
+        },
+        {
+          "name": "ERR_BAR",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
+            "line": 16,
+            "column": 4
+          },
+          "value": {
+            "kind": "literal",
+            "literal": {
+              "kind": "numeric",
+              "value": "2"
+            }
+          }
+        }
+      ]
+    }
+  ],
   "interface_declarations": [
     {
       "name": "test.name/WithAndWithoutRequestResponse",
@@ -256,11 +298,95 @@
         }
       ]
     },
+    {
+      "name": "test.name/WithErrorSyntax",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
+        "line": 19,
+        "column": 9
+      },
+      "methods": [
+        {
+          "ordinal": 2069369145,
+          "generated_ordinal": 2069369145,
+          "name": "ErrorAsPrimitive",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
+            "line": 20,
+            "column": 4
+          },
+          "has_request": true,
+          "maybe_request": [],
+          "maybe_request_size": 16,
+          "maybe_request_alignment": 8,
+          "has_response": true,
+          "maybe_response": [
+            {
+              "type": {
+                "kind": "identifier",
+                "identifier": "test.name/WithErrorSyntax_ErrorAsPrimitive_Result",
+                "nullable": false
+              },
+              "name": "result",
+              "location": {
+                "filename": "generated",
+                "line": 18,
+                "column": 0
+              },
+              "size": 8,
+              "max_out_of_line": 0,
+              "alignment": 4,
+              "offset": 16,
+              "max_handles": 0
+            }
+          ],
+          "maybe_response_size": 24,
+          "maybe_response_alignment": 8
+        },
+        {
+          "ordinal": 1284890143,
+          "generated_ordinal": 1284890143,
+          "name": "ErrorAsEnum",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
+            "line": 21,
+            "column": 4
+          },
+          "has_request": true,
+          "maybe_request": [],
+          "maybe_request_size": 16,
+          "maybe_request_alignment": 8,
+          "has_response": true,
+          "maybe_response": [
+            {
+              "type": {
+                "kind": "identifier",
+                "identifier": "test.name/WithErrorSyntax_ErrorAsEnum_Result",
+                "nullable": false
+              },
+              "name": "result",
+              "location": {
+                "filename": "generated",
+                "line": 25,
+                "column": 0
+              },
+              "size": 8,
+              "max_out_of_line": 0,
+              "alignment": 4,
+              "offset": 16,
+              "max_handles": 0
+            }
+          ],
+          "maybe_response_size": 24,
+          "maybe_response_alignment": 8
+        }
+      ]
+    },
     {
       "name": "test.name/OvernetInternalProtocol",
       "location": {
         "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-        "line": 15,
+        "line": 25,
         "column": 9
       },
       "maybe_attributes": [
@@ -276,7 +402,7 @@
           "name": "MethodA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 16,
+            "line": 26,
             "column": 4
           },
           "has_request": true,
@@ -289,7 +415,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 16,
+                "line": 26,
                 "column": 18
               },
               "size": 8,
@@ -306,7 +432,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 16,
+                "line": 26,
                 "column": 27
               },
               "size": 8,
@@ -326,7 +452,7 @@
           "name": "EventA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 17,
+            "line": 27,
             "column": 7
           },
           "has_request": false,
@@ -340,7 +466,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 17,
+                "line": 27,
                 "column": 20
               },
               "size": 8,
@@ -357,7 +483,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 17,
+                "line": 27,
                 "column": 29
               },
               "size": 8,
@@ -376,7 +502,7 @@
           "name": "MethodB",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 18,
+            "line": 28,
             "column": 4
           },
           "has_request": true,
@@ -389,7 +515,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 18,
+                "line": 28,
                 "column": 18
               },
               "size": 8,
@@ -406,7 +532,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 18,
+                "line": 28,
                 "column": 27
               },
               "size": 8,
@@ -428,7 +554,7 @@
               "name": "result",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 18,
+                "line": 28,
                 "column": 40
               },
               "size": 8,
@@ -447,7 +573,7 @@
       "name": "test.name/SocketControlProtocol",
       "location": {
         "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-        "line": 22,
+        "line": 32,
         "column": 9
       },
       "maybe_attributes": [
@@ -463,7 +589,7 @@
           "name": "MethodA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 23,
+            "line": 33,
             "column": 4
           },
           "has_request": true,
@@ -476,7 +602,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 23,
+                "line": 33,
                 "column": 18
               },
               "size": 8,
@@ -493,7 +619,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 23,
+                "line": 33,
                 "column": 27
               },
               "size": 8,
@@ -513,7 +639,7 @@
           "name": "EventA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 24,
+            "line": 34,
             "column": 7
           },
           "has_request": false,
@@ -527,7 +653,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 24,
+                "line": 34,
                 "column": 20
               },
               "size": 8,
@@ -544,7 +670,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 24,
+                "line": 34,
                 "column": 29
               },
               "size": 8,
@@ -563,7 +689,7 @@
           "name": "MethodB",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 25,
+            "line": 35,
             "column": 4
           },
           "has_request": true,
@@ -576,7 +702,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 25,
+                "line": 35,
                 "column": 18
               },
               "size": 8,
@@ -593,7 +719,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 25,
+                "line": 35,
                 "column": 27
               },
               "size": 8,
@@ -615,7 +741,7 @@
               "name": "result",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 25,
+                "line": 35,
                 "column": 40
               },
               "size": 8,
@@ -634,7 +760,7 @@
       "name": "test.name/ChannelProtocol",
       "location": {
         "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-        "line": 29,
+        "line": 39,
         "column": 9
       },
       "maybe_attributes": [
@@ -650,7 +776,7 @@
           "name": "MethodA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 30,
+            "line": 40,
             "column": 4
           },
           "has_request": true,
@@ -663,7 +789,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 30,
+                "line": 40,
                 "column": 18
               },
               "size": 8,
@@ -680,7 +806,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 30,
+                "line": 40,
                 "column": 27
               },
               "size": 8,
@@ -700,7 +826,7 @@
           "name": "EventA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 31,
+            "line": 41,
             "column": 7
           },
           "has_request": false,
@@ -714,7 +840,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 31,
+                "line": 41,
                 "column": 20
               },
               "size": 8,
@@ -731,7 +857,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 31,
+                "line": 41,
                 "column": 29
               },
               "size": 8,
@@ -750,7 +876,7 @@
           "name": "MethodB",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 32,
+            "line": 42,
             "column": 4
           },
           "has_request": true,
@@ -763,7 +889,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 32,
+                "line": 42,
                 "column": 18
               },
               "size": 8,
@@ -780,7 +906,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 32,
+                "line": 42,
                 "column": 27
               },
               "size": 8,
@@ -802,7 +928,7 @@
               "name": "result",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 32,
+                "line": 42,
                 "column": 40
               },
               "size": 8,
@@ -821,7 +947,7 @@
       "name": "test.name/KitchenSink",
       "location": {
         "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-        "line": 37,
+        "line": 47,
         "column": 9
       },
       "maybe_attributes": [
@@ -837,7 +963,7 @@
           "name": "MethodA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 38,
+            "line": 48,
             "column": 4
           },
           "has_request": true,
@@ -850,7 +976,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 38,
+                "line": 48,
                 "column": 18
               },
               "size": 8,
@@ -867,7 +993,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 38,
+                "line": 48,
                 "column": 27
               },
               "size": 8,
@@ -887,7 +1013,7 @@
           "name": "EventA",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 39,
+            "line": 49,
             "column": 7
           },
           "has_request": false,
@@ -901,7 +1027,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 39,
+                "line": 49,
                 "column": 20
               },
               "size": 8,
@@ -918,7 +1044,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 39,
+                "line": 49,
                 "column": 29
               },
               "size": 8,
@@ -937,7 +1063,7 @@
           "name": "MethodB",
           "location": {
             "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-            "line": 40,
+            "line": 50,
             "column": 4
           },
           "has_request": true,
@@ -950,7 +1076,7 @@
               "name": "a",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 40,
+                "line": 50,
                 "column": 18
               },
               "size": 8,
@@ -967,7 +1093,7 @@
               "name": "b",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 40,
+                "line": 50,
                 "column": 27
               },
               "size": 8,
@@ -989,7 +1115,7 @@
               "name": "result",
               "location": {
                 "filename": "garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl",
-                "line": 40,
+                "line": 50,
                 "column": 40
               },
               "size": 8,
@@ -1005,22 +1131,171 @@
       ]
     }
   ],
-  "struct_declarations": [],
+  "struct_declarations": [
+    {
+      "name": "test.name/WithErrorSyntax_ErrorAsPrimitive_Response",
+      "location": {
+        "filename": "generated",
+        "line": 14,
+        "column": 0
+      },
+      "anonymous": false,
+      "members": [],
+      "size": 1,
+      "max_out_of_line": 0,
+      "alignment": 1,
+      "max_handles": 0
+    },
+    {
+      "name": "test.name/WithErrorSyntax_ErrorAsEnum_Response",
+      "location": {
+        "filename": "generated",
+        "line": 21,
+        "column": 0
+      },
+      "anonymous": false,
+      "members": [],
+      "size": 1,
+      "max_out_of_line": 0,
+      "alignment": 1,
+      "max_handles": 0
+    }
+  ],
   "table_declarations": [],
-  "union_declarations": [],
+  "union_declarations": [
+    {
+      "name": "test.name/WithErrorSyntax_ErrorAsPrimitive_Result",
+      "location": {
+        "filename": "generated",
+        "line": 17,
+        "column": 0
+      },
+      "maybe_attributes": [
+        {
+          "name": "Result",
+          "value": ""
+        }
+      ],
+      "members": [
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/WithErrorSyntax_ErrorAsPrimitive_Response",
+            "nullable": false
+          },
+          "name": "response",
+          "location": {
+            "filename": "generated",
+            "line": 15,
+            "column": 0
+          },
+          "size": 1,
+          "max_out_of_line": 0,
+          "alignment": 1,
+          "offset": 4
+        },
+        {
+          "type": {
+            "kind": "primitive",
+            "subtype": "uint32"
+          },
+          "name": "err",
+          "location": {
+            "filename": "generated",
+            "line": 16,
+            "column": 0
+          },
+          "size": 4,
+          "max_out_of_line": 0,
+          "alignment": 4,
+          "offset": 4
+        }
+      ],
+      "size": 8,
+      "max_out_of_line": 0,
+      "alignment": 4,
+      "max_handles": 0
+    },
+    {
+      "name": "test.name/WithErrorSyntax_ErrorAsEnum_Result",
+      "location": {
+        "filename": "generated",
+        "line": 24,
+        "column": 0
+      },
+      "maybe_attributes": [
+        {
+          "name": "Result",
+          "value": ""
+        }
+      ],
+      "members": [
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/WithErrorSyntax_ErrorAsEnum_Response",
+            "nullable": false
+          },
+          "name": "response",
+          "location": {
+            "filename": "generated",
+            "line": 22,
+            "column": 0
+          },
+          "size": 1,
+          "max_out_of_line": 0,
+          "alignment": 1,
+          "offset": 4
+        },
+        {
+          "type": {
+            "kind": "identifier",
+            "identifier": "test.name/ErrorEnun",
+            "nullable": false
+          },
+          "name": "err",
+          "location": {
+            "filename": "generated",
+            "line": 23,
+            "column": 0
+          },
+          "size": 4,
+          "max_out_of_line": 0,
+          "alignment": 4,
+          "offset": 4
+        }
+      ],
+      "size": 8,
+      "max_out_of_line": 0,
+      "alignment": 4,
+      "max_handles": 0
+    }
+  ],
   "xunion_declarations": [],
   "declaration_order": [
+    "test.name/WithErrorSyntax_ErrorAsPrimitive_Response",
+    "test.name/WithErrorSyntax_ErrorAsPrimitive_Result",
+    "test.name/WithErrorSyntax_ErrorAsEnum_Response",
     "test.name/KitchenSink",
     "test.name/ChannelProtocol",
     "test.name/SocketControlProtocol",
     "test.name/OvernetInternalProtocol",
-    "test.name/WithAndWithoutRequestResponse"
+    "test.name/WithAndWithoutRequestResponse",
+    "test.name/ErrorEnun",
+    "test.name/WithErrorSyntax_ErrorAsEnum_Result",
+    "test.name/WithErrorSyntax"
   ],
   "declarations": {
+    "test.name/ErrorEnun": "enum",
     "test.name/WithAndWithoutRequestResponse": "interface",
+    "test.name/WithErrorSyntax": "interface",
     "test.name/OvernetInternalProtocol": "interface",
     "test.name/SocketControlProtocol": "interface",
     "test.name/ChannelProtocol": "interface",
-    "test.name/KitchenSink": "interface"
+    "test.name/KitchenSink": "interface",
+    "test.name/WithErrorSyntax_ErrorAsPrimitive_Response": "struct",
+    "test.name/WithErrorSyntax_ErrorAsEnum_Response": "struct",
+    "test.name/WithErrorSyntax_ErrorAsPrimitive_Result": "union",
+    "test.name/WithErrorSyntax_ErrorAsEnum_Result": "union"
   }
 }
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.cc.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.cc.golden
index 7a1b319cac297f73987c480a30daaabe274c7bc1..e19bbcc9d28306255945b97a462c0a68a502a208 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.cc.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.cc.golden
@@ -6,6 +6,158 @@
 namespace test {
 namespace name {
 
+extern "C" const fidl_type_t test_name_WithErrorSyntax_ErrorAsPrimitive_ResponseTable;
+const fidl_type_t* WithErrorSyntax_ErrorAsPrimitive_Response::FidlType = &test_name_WithErrorSyntax_ErrorAsPrimitive_ResponseTable;
+
+void WithErrorSyntax_ErrorAsPrimitive_Response::Encode(::fidl::Encoder* _encoder, size_t _offset) {
+  ::fidl::Encode(_encoder, &__reserved, _offset + 0);
+}
+
+void WithErrorSyntax_ErrorAsPrimitive_Response::Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsPrimitive_Response* value, size_t _offset) {
+  ::fidl::Decode(_decoder, &value->__reserved, _offset + 0);
+}
+
+zx_status_t WithErrorSyntax_ErrorAsPrimitive_Response::Clone(WithErrorSyntax_ErrorAsPrimitive_Response* _result) const {
+  zx_status_t _status = ::fidl::Clone(__reserved, &_result->__reserved);
+  if (_status != ZX_OK)
+    return _status;
+  return ZX_OK;
+}
+
+bool operator==(const WithErrorSyntax_ErrorAsPrimitive_Response& _lhs, const WithErrorSyntax_ErrorAsPrimitive_Response& _rhs) {
+  if (!::fidl::Equals(_lhs.__reserved, _rhs.__reserved)) {
+    return false;
+  }
+  return true;
+}
+WithErrorSyntax_ErrorAsPrimitive_Result::WithErrorSyntax_ErrorAsPrimitive_Result() : value_() {}
+
+WithErrorSyntax_ErrorAsPrimitive_Result::~WithErrorSyntax_ErrorAsPrimitive_Result() {
+}
+
+WithErrorSyntax_ErrorAsPrimitive_Result::WithErrorSyntax_ErrorAsPrimitive_Result(WithErrorSyntax_ErrorAsPrimitive_Result&& other) : value_(std::move(other.value_)) {
+}
+
+WithErrorSyntax_ErrorAsPrimitive_Result& WithErrorSyntax_ErrorAsPrimitive_Result::operator=(WithErrorSyntax_ErrorAsPrimitive_Result&& other) {
+  if (this != &other) {
+    value_ = std::move(other.value_);
+  }
+  return *this;
+}
+
+void WithErrorSyntax_ErrorAsPrimitive_Result::Encode(::fidl::Encoder* _encoder, size_t _offset) {
+  fidl_union_tag_t _tag = static_cast<fidl_union_tag_t>(Which());
+  ::fidl::Encode(_encoder, &_tag, _offset);
+  switch (_tag) {
+   case 0:
+    ::fidl::Encode(_encoder, &response(), _offset + 4);
+    break;
+   case 1:
+    ::fidl::Encode(_encoder, &err(), _offset + 4);
+    break;
+   default:
+    break;
+  }
+}
+
+void WithErrorSyntax_ErrorAsPrimitive_Result::Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsPrimitive_Result* _value, size_t _offset) {
+  fidl_union_tag_t _tag;
+  ::fidl::Decode(_decoder, &_tag, _offset);
+  switch (_tag) {
+   case 0:
+    {
+      WithErrorSyntax_ErrorAsPrimitive_Response _member{};
+      ::fidl::Decode(_decoder, &_member, _offset + 4);
+      _value->set_response(std::move(_member));
+      break;
+    }
+   case 1:
+    {
+      uint32_t _member{};
+      ::fidl::Decode(_decoder, &_member, _offset + 4);
+      _value->set_err(std::move(_member));
+      break;
+    }
+   default:
+    _value->value_.emplace<0>();
+  }
+}
+
+zx_status_t WithErrorSyntax_ErrorAsPrimitive_Result::Clone(WithErrorSyntax_ErrorAsPrimitive_Result* _result) const {
+  zx_status_t _status = ZX_OK;
+  switch (Which()) {
+    case Tag::kResponse:
+      {
+        WithErrorSyntax_ErrorAsPrimitive_Response _member{};
+        _status = ::fidl::Clone(response(), &_member);
+        if (_status == ZX_OK) {
+          _result->set_response(std::move(_member));
+        }
+      }
+      break;
+    case Tag::kErr:
+      {
+        uint32_t _member{};
+        _status = ::fidl::Clone(err(), &_member);
+        if (_status == ZX_OK) {
+          _result->set_err(std::move(_member));
+        }
+      }
+      break;
+    case Tag::Invalid:
+      _result->value_.emplace<0>();
+      break;
+  }
+  return _status;
+}
+
+bool operator==(const WithErrorSyntax_ErrorAsPrimitive_Result& _lhs, const WithErrorSyntax_ErrorAsPrimitive_Result& _rhs) {
+  if (_lhs.Which() != _rhs.Which()) {
+    return false;
+  }
+  switch (_lhs.Which()) {
+    case WithErrorSyntax_ErrorAsPrimitive_Result::Tag::kResponse:
+      return ::fidl::Equals(_lhs.response(), _rhs.response());
+    case WithErrorSyntax_ErrorAsPrimitive_Result::Tag::kErr:
+      return ::fidl::Equals(_lhs.err(), _rhs.err());
+    case WithErrorSyntax_ErrorAsPrimitive_Result::Tag::Invalid:
+      return true;
+    default:
+      return false;
+  }
+}
+
+void WithErrorSyntax_ErrorAsPrimitive_Result::set_response(WithErrorSyntax_ErrorAsPrimitive_Response value) {
+  value_.emplace<static_cast<size_t>(Tag::kResponse) + 1>(std::move(value));
+}
+
+void WithErrorSyntax_ErrorAsPrimitive_Result::set_err(uint32_t value) {
+  value_.emplace<static_cast<size_t>(Tag::kErr) + 1>(std::move(value));
+}
+extern "C" const fidl_type_t test_name_WithErrorSyntax_ErrorAsEnum_ResponseTable;
+const fidl_type_t* WithErrorSyntax_ErrorAsEnum_Response::FidlType = &test_name_WithErrorSyntax_ErrorAsEnum_ResponseTable;
+
+void WithErrorSyntax_ErrorAsEnum_Response::Encode(::fidl::Encoder* _encoder, size_t _offset) {
+  ::fidl::Encode(_encoder, &__reserved, _offset + 0);
+}
+
+void WithErrorSyntax_ErrorAsEnum_Response::Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsEnum_Response* value, size_t _offset) {
+  ::fidl::Decode(_decoder, &value->__reserved, _offset + 0);
+}
+
+zx_status_t WithErrorSyntax_ErrorAsEnum_Response::Clone(WithErrorSyntax_ErrorAsEnum_Response* _result) const {
+  zx_status_t _status = ::fidl::Clone(__reserved, &_result->__reserved);
+  if (_status != ZX_OK)
+    return _status;
+  return ZX_OK;
+}
+
+bool operator==(const WithErrorSyntax_ErrorAsEnum_Response& _lhs, const WithErrorSyntax_ErrorAsEnum_Response& _rhs) {
+  if (!::fidl::Equals(_lhs.__reserved, _rhs.__reserved)) {
+    return false;
+  }
+  return true;
+}
 #ifdef __Fuchsia__
 namespace {
   
@@ -1290,5 +1442,325 @@ zx_status_t WithAndWithoutRequestResponse_SyncProxy::WithRequestWithResponse(::s
 
 #endif // __Fuchsia__
 
+WithErrorSyntax_ErrorAsEnum_Result::WithErrorSyntax_ErrorAsEnum_Result() : value_() {}
+
+WithErrorSyntax_ErrorAsEnum_Result::~WithErrorSyntax_ErrorAsEnum_Result() {
+}
+
+WithErrorSyntax_ErrorAsEnum_Result::WithErrorSyntax_ErrorAsEnum_Result(WithErrorSyntax_ErrorAsEnum_Result&& other) : value_(std::move(other.value_)) {
+}
+
+WithErrorSyntax_ErrorAsEnum_Result& WithErrorSyntax_ErrorAsEnum_Result::operator=(WithErrorSyntax_ErrorAsEnum_Result&& other) {
+  if (this != &other) {
+    value_ = std::move(other.value_);
+  }
+  return *this;
+}
+
+void WithErrorSyntax_ErrorAsEnum_Result::Encode(::fidl::Encoder* _encoder, size_t _offset) {
+  fidl_union_tag_t _tag = static_cast<fidl_union_tag_t>(Which());
+  ::fidl::Encode(_encoder, &_tag, _offset);
+  switch (_tag) {
+   case 0:
+    ::fidl::Encode(_encoder, &response(), _offset + 4);
+    break;
+   case 1:
+    ::fidl::Encode(_encoder, &err(), _offset + 4);
+    break;
+   default:
+    break;
+  }
+}
+
+void WithErrorSyntax_ErrorAsEnum_Result::Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsEnum_Result* _value, size_t _offset) {
+  fidl_union_tag_t _tag;
+  ::fidl::Decode(_decoder, &_tag, _offset);
+  switch (_tag) {
+   case 0:
+    {
+      WithErrorSyntax_ErrorAsEnum_Response _member{};
+      ::fidl::Decode(_decoder, &_member, _offset + 4);
+      _value->set_response(std::move(_member));
+      break;
+    }
+   case 1:
+    {
+      ErrorEnun _member{};
+      ::fidl::Decode(_decoder, &_member, _offset + 4);
+      _value->set_err(std::move(_member));
+      break;
+    }
+   default:
+    _value->value_.emplace<0>();
+  }
+}
+
+zx_status_t WithErrorSyntax_ErrorAsEnum_Result::Clone(WithErrorSyntax_ErrorAsEnum_Result* _result) const {
+  zx_status_t _status = ZX_OK;
+  switch (Which()) {
+    case Tag::kResponse:
+      {
+        WithErrorSyntax_ErrorAsEnum_Response _member{};
+        _status = ::fidl::Clone(response(), &_member);
+        if (_status == ZX_OK) {
+          _result->set_response(std::move(_member));
+        }
+      }
+      break;
+    case Tag::kErr:
+      {
+        ErrorEnun _member{};
+        _status = ::fidl::Clone(err(), &_member);
+        if (_status == ZX_OK) {
+          _result->set_err(std::move(_member));
+        }
+      }
+      break;
+    case Tag::Invalid:
+      _result->value_.emplace<0>();
+      break;
+  }
+  return _status;
+}
+
+bool operator==(const WithErrorSyntax_ErrorAsEnum_Result& _lhs, const WithErrorSyntax_ErrorAsEnum_Result& _rhs) {
+  if (_lhs.Which() != _rhs.Which()) {
+    return false;
+  }
+  switch (_lhs.Which()) {
+    case WithErrorSyntax_ErrorAsEnum_Result::Tag::kResponse:
+      return ::fidl::Equals(_lhs.response(), _rhs.response());
+    case WithErrorSyntax_ErrorAsEnum_Result::Tag::kErr:
+      return ::fidl::Equals(_lhs.err(), _rhs.err());
+    case WithErrorSyntax_ErrorAsEnum_Result::Tag::Invalid:
+      return true;
+    default:
+      return false;
+  }
+}
+
+void WithErrorSyntax_ErrorAsEnum_Result::set_response(WithErrorSyntax_ErrorAsEnum_Response value) {
+  value_.emplace<static_cast<size_t>(Tag::kResponse) + 1>(std::move(value));
+}
+
+void WithErrorSyntax_ErrorAsEnum_Result::set_err(ErrorEnun value) {
+  value_.emplace<static_cast<size_t>(Tag::kErr) + 1>(std::move(value));
+}
+#ifdef __Fuchsia__
+namespace {
+  
+constexpr uint32_t kWithErrorSyntax_ErrorAsPrimitive_Ordinal = 2069369145u;
+extern "C" const fidl_type_t test_name_WithErrorSyntaxErrorAsPrimitiveRequestTable;
+extern "C" const fidl_type_t test_name_WithErrorSyntaxErrorAsPrimitiveResponseTable;
+  
+constexpr uint32_t kWithErrorSyntax_ErrorAsEnum_Ordinal = 1284890143u;
+extern "C" const fidl_type_t test_name_WithErrorSyntaxErrorAsEnumRequestTable;
+extern "C" const fidl_type_t test_name_WithErrorSyntaxErrorAsEnumResponseTable;
+
+}  // namespace
+
+WithErrorSyntax::~WithErrorSyntax() = default;
+
+WithErrorSyntax_EventSender::~WithErrorSyntax_EventSender() = default;
+
+WithErrorSyntax_Sync::~WithErrorSyntax_Sync() = default;
+
+WithErrorSyntax_Proxy::WithErrorSyntax_Proxy(::fidl::internal::ProxyController* controller)
+    : controller_(controller) {
+  (void)controller_;
+}
+
+WithErrorSyntax_Proxy::~WithErrorSyntax_Proxy() = default;
+
+zx_status_t WithErrorSyntax_Proxy::Dispatch_(::fidl::Message message) {
+  zx_status_t status = ZX_OK;
+  switch (message.ordinal()) {
+    default: {
+      status = ZX_ERR_NOT_SUPPORTED;
+      break;
+    }
+  }
+  return status;
+}
+
+
+namespace {
+
+class WithErrorSyntax_ErrorAsPrimitive_ResponseHandler : public ::fidl::internal::MessageHandler {
+ public:
+  WithErrorSyntax_ErrorAsPrimitive_ResponseHandler(WithErrorSyntax::ErrorAsPrimitiveCallback callback)
+      : callback_(std::move(callback)) {
+    ZX_DEBUG_ASSERT_MSG(callback_,
+                        "Callback must not be empty for WithErrorSyntax::ErrorAsPrimitive\n");
+  }
+
+  zx_status_t OnMessage(::fidl::Message message) override {
+    const char* error_msg = nullptr;
+    zx_status_t status = message.Decode(&test_name_WithErrorSyntaxErrorAsPrimitiveResponseTable, &error_msg);
+    if (status != ZX_OK) {
+      FIDL_REPORT_DECODING_ERROR(message, &test_name_WithErrorSyntaxErrorAsPrimitiveResponseTable, error_msg);
+      return status;
+    }
+    ::fidl::Decoder decoder(std::move(message));
+    auto arg0 = ::fidl::DecodeAs<WithErrorSyntax_ErrorAsPrimitive_Result>(&decoder, 16);
+    callback_(std::move(arg0));
+    return ZX_OK;
+  }
+
+ private:
+  WithErrorSyntax::ErrorAsPrimitiveCallback callback_;
+
+  WithErrorSyntax_ErrorAsPrimitive_ResponseHandler(const WithErrorSyntax_ErrorAsPrimitive_ResponseHandler&) = delete;
+  WithErrorSyntax_ErrorAsPrimitive_ResponseHandler& operator=(const WithErrorSyntax_ErrorAsPrimitive_ResponseHandler&) = delete;
+};
+
+}  // namespace
+void WithErrorSyntax_Proxy::ErrorAsPrimitive(ErrorAsPrimitiveCallback callback) {
+  ::fidl::Encoder _encoder(kWithErrorSyntax_ErrorAsPrimitive_Ordinal);
+  controller_->Send(&test_name_WithErrorSyntaxErrorAsPrimitiveRequestTable, _encoder.GetMessage(), std::make_unique<WithErrorSyntax_ErrorAsPrimitive_ResponseHandler>(std::move(callback)));
+}
+namespace {
+
+class WithErrorSyntax_ErrorAsEnum_ResponseHandler : public ::fidl::internal::MessageHandler {
+ public:
+  WithErrorSyntax_ErrorAsEnum_ResponseHandler(WithErrorSyntax::ErrorAsEnumCallback callback)
+      : callback_(std::move(callback)) {
+    ZX_DEBUG_ASSERT_MSG(callback_,
+                        "Callback must not be empty for WithErrorSyntax::ErrorAsEnum\n");
+  }
+
+  zx_status_t OnMessage(::fidl::Message message) override {
+    const char* error_msg = nullptr;
+    zx_status_t status = message.Decode(&test_name_WithErrorSyntaxErrorAsEnumResponseTable, &error_msg);
+    if (status != ZX_OK) {
+      FIDL_REPORT_DECODING_ERROR(message, &test_name_WithErrorSyntaxErrorAsEnumResponseTable, error_msg);
+      return status;
+    }
+    ::fidl::Decoder decoder(std::move(message));
+    auto arg0 = ::fidl::DecodeAs<WithErrorSyntax_ErrorAsEnum_Result>(&decoder, 16);
+    callback_(std::move(arg0));
+    return ZX_OK;
+  }
+
+ private:
+  WithErrorSyntax::ErrorAsEnumCallback callback_;
+
+  WithErrorSyntax_ErrorAsEnum_ResponseHandler(const WithErrorSyntax_ErrorAsEnum_ResponseHandler&) = delete;
+  WithErrorSyntax_ErrorAsEnum_ResponseHandler& operator=(const WithErrorSyntax_ErrorAsEnum_ResponseHandler&) = delete;
+};
+
+}  // namespace
+void WithErrorSyntax_Proxy::ErrorAsEnum(ErrorAsEnumCallback callback) {
+  ::fidl::Encoder _encoder(kWithErrorSyntax_ErrorAsEnum_Ordinal);
+  controller_->Send(&test_name_WithErrorSyntaxErrorAsEnumRequestTable, _encoder.GetMessage(), std::make_unique<WithErrorSyntax_ErrorAsEnum_ResponseHandler>(std::move(callback)));
+}
+
+WithErrorSyntax_Stub::WithErrorSyntax_Stub(WithErrorSyntax_clazz* impl) : impl_(impl) {
+  (void)impl_;
+}
+
+WithErrorSyntax_Stub::~WithErrorSyntax_Stub() = default;
+
+namespace {
+
+class WithErrorSyntax_ErrorAsPrimitive_Responder {
+ public:
+  WithErrorSyntax_ErrorAsPrimitive_Responder(::fidl::internal::PendingResponse response, uint32_t ordinal)
+      : response_(std::move(response)), ordinal_(ordinal) {}
+
+  void operator()(WithErrorSyntax_ErrorAsPrimitive_Result result) {
+    ::fidl::Encoder _encoder(ordinal_);
+    _encoder.Alloc(24 - sizeof(fidl_message_header_t));
+    ::fidl::Encode(&_encoder, &result, 16);
+    response_.Send(&test_name_WithErrorSyntaxErrorAsPrimitiveResponseTable, _encoder.GetMessage());
+  }
+
+ private:
+  ::fidl::internal::PendingResponse response_;
+  uint32_t ordinal_;
+};
+
+class WithErrorSyntax_ErrorAsEnum_Responder {
+ public:
+  WithErrorSyntax_ErrorAsEnum_Responder(::fidl::internal::PendingResponse response, uint32_t ordinal)
+      : response_(std::move(response)), ordinal_(ordinal) {}
+
+  void operator()(WithErrorSyntax_ErrorAsEnum_Result result) {
+    ::fidl::Encoder _encoder(ordinal_);
+    _encoder.Alloc(24 - sizeof(fidl_message_header_t));
+    ::fidl::Encode(&_encoder, &result, 16);
+    response_.Send(&test_name_WithErrorSyntaxErrorAsEnumResponseTable, _encoder.GetMessage());
+  }
+
+ private:
+  ::fidl::internal::PendingResponse response_;
+  uint32_t ordinal_;
+};
+
+}  // namespace
+
+zx_status_t WithErrorSyntax_Stub::Dispatch_(
+    ::fidl::Message message,
+    ::fidl::internal::PendingResponse response) {
+  zx_status_t status = ZX_OK;
+  uint32_t ordinal = message.ordinal();
+  switch (ordinal) {
+    case kWithErrorSyntax_ErrorAsPrimitive_Ordinal: {
+      const char* error_msg = nullptr;
+      status = message.Decode(&test_name_WithErrorSyntaxErrorAsPrimitiveRequestTable, &error_msg);
+      if (status != ZX_OK) {
+        FIDL_REPORT_DECODING_ERROR(message, &test_name_WithErrorSyntaxErrorAsPrimitiveRequestTable, error_msg);
+        break;
+      }
+      impl_->ErrorAsPrimitive(WithErrorSyntax_ErrorAsPrimitive_Responder(std::move(response), ordinal));
+      break;
+    }
+    case kWithErrorSyntax_ErrorAsEnum_Ordinal: {
+      const char* error_msg = nullptr;
+      status = message.Decode(&test_name_WithErrorSyntaxErrorAsEnumRequestTable, &error_msg);
+      if (status != ZX_OK) {
+        FIDL_REPORT_DECODING_ERROR(message, &test_name_WithErrorSyntaxErrorAsEnumRequestTable, error_msg);
+        break;
+      }
+      impl_->ErrorAsEnum(WithErrorSyntax_ErrorAsEnum_Responder(std::move(response), ordinal));
+      break;
+    }
+    default: {
+      status = ZX_ERR_NOT_SUPPORTED;
+      break;
+    }
+  }
+  return status;
+}
+
+WithErrorSyntax_SyncProxy::WithErrorSyntax_SyncProxy(::zx::channel channel)
+    : proxy_(::std::move(channel)) {}
+
+WithErrorSyntax_SyncProxy::~WithErrorSyntax_SyncProxy() = default;
+zx_status_t WithErrorSyntax_SyncProxy::ErrorAsPrimitive(WithErrorSyntax_ErrorAsPrimitive_Result* out_result) {
+  ::fidl::Encoder _encoder(kWithErrorSyntax_ErrorAsPrimitive_Ordinal);
+  ::fidl::MessageBuffer buffer_;
+  ::fidl::Message response_ = buffer_.CreateEmptyMessage();
+  zx_status_t status_ = proxy_.Call(&test_name_WithErrorSyntaxErrorAsPrimitiveRequestTable, &test_name_WithErrorSyntaxErrorAsPrimitiveResponseTable, _encoder.GetMessage(), &response_);
+  if (status_ != ZX_OK)
+    return status_;
+  ::fidl::Decoder decoder_(std::move(response_));
+  *out_result = ::fidl::DecodeAs<WithErrorSyntax_ErrorAsPrimitive_Result>(&decoder_, 16);
+  return ZX_OK;
+}
+zx_status_t WithErrorSyntax_SyncProxy::ErrorAsEnum(WithErrorSyntax_ErrorAsEnum_Result* out_result) {
+  ::fidl::Encoder _encoder(kWithErrorSyntax_ErrorAsEnum_Ordinal);
+  ::fidl::MessageBuffer buffer_;
+  ::fidl::Message response_ = buffer_.CreateEmptyMessage();
+  zx_status_t status_ = proxy_.Call(&test_name_WithErrorSyntaxErrorAsEnumRequestTable, &test_name_WithErrorSyntaxErrorAsEnumResponseTable, _encoder.GetMessage(), &response_);
+  if (status_ != ZX_OK)
+    return status_;
+  ::fidl::Decoder decoder_(std::move(response_));
+  *out_result = ::fidl::DecodeAs<WithErrorSyntax_ErrorAsEnum_Result>(&decoder_, 16);
+  return ZX_OK;
+}
+
+#endif // __Fuchsia__
+
 }  // namespace name
 }  // namespace test
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.go.golden
index 3b36bfb3cf128e025a6f03055f360b76e2d034e2..90ca9170627eca3d22ea0093a5674c994c975d8c 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.go.golden
@@ -11,6 +11,135 @@ import (
 
 
 
+
+type ErrorEnun uint32
+const (
+	ErrorEnunErrFoo ErrorEnun = 1
+	ErrorEnunErrBar ErrorEnun = 2
+)
+func (x ErrorEnun) String() string {
+	switch x {
+	case 1:
+		return "ErrFoo"
+	case 2:
+		return "ErrBar"
+	}
+	return "Unknown"
+}
+
+type WithErrorSyntaxErrorAsPrimitiveResponse struct {
+	_ struct{} `fidl2:"s,1,1"`
+}
+
+var _mWithErrorSyntaxErrorAsPrimitiveResponse = _bindings.CreateLazyMarshaler(WithErrorSyntaxErrorAsPrimitiveResponse{})
+
+func (msg *WithErrorSyntaxErrorAsPrimitiveResponse) Marshaler() _bindings.Marshaler {
+	return _mWithErrorSyntaxErrorAsPrimitiveResponse
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsPrimitiveResponse) InlineAlignment() int {
+	return 1
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsPrimitiveResponse) InlineSize() int {
+	return 1
+}
+
+type WithErrorSyntaxErrorAsEnumResponse struct {
+	_ struct{} `fidl2:"s,1,1"`
+}
+
+var _mWithErrorSyntaxErrorAsEnumResponse = _bindings.CreateLazyMarshaler(WithErrorSyntaxErrorAsEnumResponse{})
+
+func (msg *WithErrorSyntaxErrorAsEnumResponse) Marshaler() _bindings.Marshaler {
+	return _mWithErrorSyntaxErrorAsEnumResponse
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsEnumResponse) InlineAlignment() int {
+	return 1
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsEnumResponse) InlineSize() int {
+	return 1
+}
+type WithErrorSyntaxErrorAsPrimitiveResultTag uint32
+const (
+	_ WithErrorSyntaxErrorAsPrimitiveResultTag = iota
+	WithErrorSyntaxErrorAsPrimitiveResultResponse
+	WithErrorSyntaxErrorAsPrimitiveResultErr
+)
+
+
+type WithErrorSyntaxErrorAsPrimitiveResult struct {
+	WithErrorSyntaxErrorAsPrimitiveResultTag `fidl:"tag" fidl2:"u,8,4"`
+	Response WithErrorSyntaxErrorAsPrimitiveResponse 
+	Err uint32 
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsPrimitiveResult) InlineAlignment() int {
+	return 4
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsPrimitiveResult) InlineSize() int {
+	return 8
+}
+
+func (u *WithErrorSyntaxErrorAsPrimitiveResult) Which() WithErrorSyntaxErrorAsPrimitiveResultTag {
+	return u.WithErrorSyntaxErrorAsPrimitiveResultTag
+}
+
+func (u *WithErrorSyntaxErrorAsPrimitiveResult) SetResponse(response WithErrorSyntaxErrorAsPrimitiveResponse) {
+	u.WithErrorSyntaxErrorAsPrimitiveResultTag = WithErrorSyntaxErrorAsPrimitiveResultResponse
+	u.Response = response
+}
+
+func (u *WithErrorSyntaxErrorAsPrimitiveResult) SetErr(err uint32) {
+	u.WithErrorSyntaxErrorAsPrimitiveResultTag = WithErrorSyntaxErrorAsPrimitiveResultErr
+	u.Err = err
+}
+type WithErrorSyntaxErrorAsEnumResultTag uint32
+const (
+	_ WithErrorSyntaxErrorAsEnumResultTag = iota
+	WithErrorSyntaxErrorAsEnumResultResponse
+	WithErrorSyntaxErrorAsEnumResultErr
+)
+
+
+type WithErrorSyntaxErrorAsEnumResult struct {
+	WithErrorSyntaxErrorAsEnumResultTag `fidl:"tag" fidl2:"u,8,4"`
+	Response WithErrorSyntaxErrorAsEnumResponse 
+	Err ErrorEnun 
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsEnumResult) InlineAlignment() int {
+	return 4
+}
+
+// Implements Payload.
+func (_ *WithErrorSyntaxErrorAsEnumResult) InlineSize() int {
+	return 8
+}
+
+func (u *WithErrorSyntaxErrorAsEnumResult) Which() WithErrorSyntaxErrorAsEnumResultTag {
+	return u.WithErrorSyntaxErrorAsEnumResultTag
+}
+
+func (u *WithErrorSyntaxErrorAsEnumResult) SetResponse(response WithErrorSyntaxErrorAsEnumResponse) {
+	u.WithErrorSyntaxErrorAsEnumResultTag = WithErrorSyntaxErrorAsEnumResultResponse
+	u.Response = response
+}
+
+func (u *WithErrorSyntaxErrorAsEnumResult) SetErr(err ErrorEnun) {
+	u.WithErrorSyntaxErrorAsEnumResultTag = WithErrorSyntaxErrorAsEnumResultErr
+	u.Err = err
+}
 const (
 	WithAndWithoutRequestResponseNoRequestNoResponseOrdinal uint32 = 503576693
 	WithAndWithoutRequestResponseNoRequestNoResponseGenOrdinal uint32 = 503576693
@@ -30,129 +159,129 @@ const (
 	WithAndWithoutRequestResponseOnWithResponseGenOrdinal uint32 = 2051478023
 )
 
-type WithAndWithoutRequestResponseNoRequestWithResponseResponse struct {
+type withAndWithoutRequestResponseNoRequestWithResponseResponse struct {
 	_ struct{} `fidl2:"s,16,0"`
 	Ret string
 }
 
-var _mWithAndWithoutRequestResponseNoRequestWithResponseResponse = _bindings.CreateLazyMarshaler(WithAndWithoutRequestResponseNoRequestWithResponseResponse{})
+var _mwithAndWithoutRequestResponseNoRequestWithResponseResponse = _bindings.CreateLazyMarshaler(withAndWithoutRequestResponseNoRequestWithResponseResponse{})
 
-func (msg *WithAndWithoutRequestResponseNoRequestWithResponseResponse) Marshaler() _bindings.Marshaler {
-	return _mWithAndWithoutRequestResponseNoRequestWithResponseResponse
+func (msg *withAndWithoutRequestResponseNoRequestWithResponseResponse) Marshaler() _bindings.Marshaler {
+	return _mwithAndWithoutRequestResponseNoRequestWithResponseResponse
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseNoRequestWithResponseResponse) InlineAlignment() int {
+func (_ *withAndWithoutRequestResponseNoRequestWithResponseResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseNoRequestWithResponseResponse) InlineSize() int {
+func (_ *withAndWithoutRequestResponseNoRequestWithResponseResponse) InlineSize() int {
 	return 16
 }
 
-type WithAndWithoutRequestResponseWithRequestNoResponseRequest struct {
+type withAndWithoutRequestResponseWithRequestNoResponseRequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	Arg string
 }
 
-var _mWithAndWithoutRequestResponseWithRequestNoResponseRequest = _bindings.CreateLazyMarshaler(WithAndWithoutRequestResponseWithRequestNoResponseRequest{})
+var _mwithAndWithoutRequestResponseWithRequestNoResponseRequest = _bindings.CreateLazyMarshaler(withAndWithoutRequestResponseWithRequestNoResponseRequest{})
 
-func (msg *WithAndWithoutRequestResponseWithRequestNoResponseRequest) Marshaler() _bindings.Marshaler {
-	return _mWithAndWithoutRequestResponseWithRequestNoResponseRequest
+func (msg *withAndWithoutRequestResponseWithRequestNoResponseRequest) Marshaler() _bindings.Marshaler {
+	return _mwithAndWithoutRequestResponseWithRequestNoResponseRequest
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestNoResponseRequest) InlineAlignment() int {
+func (_ *withAndWithoutRequestResponseWithRequestNoResponseRequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestNoResponseRequest) InlineSize() int {
+func (_ *withAndWithoutRequestResponseWithRequestNoResponseRequest) InlineSize() int {
 	return 16
 }
 
-type WithAndWithoutRequestResponseWithRequestEmptyResponseRequest struct {
+type withAndWithoutRequestResponseWithRequestEmptyResponseRequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	Arg string
 }
 
-var _mWithAndWithoutRequestResponseWithRequestEmptyResponseRequest = _bindings.CreateLazyMarshaler(WithAndWithoutRequestResponseWithRequestEmptyResponseRequest{})
+var _mwithAndWithoutRequestResponseWithRequestEmptyResponseRequest = _bindings.CreateLazyMarshaler(withAndWithoutRequestResponseWithRequestEmptyResponseRequest{})
 
-func (msg *WithAndWithoutRequestResponseWithRequestEmptyResponseRequest) Marshaler() _bindings.Marshaler {
-	return _mWithAndWithoutRequestResponseWithRequestEmptyResponseRequest
+func (msg *withAndWithoutRequestResponseWithRequestEmptyResponseRequest) Marshaler() _bindings.Marshaler {
+	return _mwithAndWithoutRequestResponseWithRequestEmptyResponseRequest
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestEmptyResponseRequest) InlineAlignment() int {
+func (_ *withAndWithoutRequestResponseWithRequestEmptyResponseRequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestEmptyResponseRequest) InlineSize() int {
+func (_ *withAndWithoutRequestResponseWithRequestEmptyResponseRequest) InlineSize() int {
 	return 16
 }
 
-type WithAndWithoutRequestResponseWithRequestWithResponseRequest struct {
+type withAndWithoutRequestResponseWithRequestWithResponseRequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	Arg string
 }
 
-var _mWithAndWithoutRequestResponseWithRequestWithResponseRequest = _bindings.CreateLazyMarshaler(WithAndWithoutRequestResponseWithRequestWithResponseRequest{})
+var _mwithAndWithoutRequestResponseWithRequestWithResponseRequest = _bindings.CreateLazyMarshaler(withAndWithoutRequestResponseWithRequestWithResponseRequest{})
 
-func (msg *WithAndWithoutRequestResponseWithRequestWithResponseRequest) Marshaler() _bindings.Marshaler {
-	return _mWithAndWithoutRequestResponseWithRequestWithResponseRequest
+func (msg *withAndWithoutRequestResponseWithRequestWithResponseRequest) Marshaler() _bindings.Marshaler {
+	return _mwithAndWithoutRequestResponseWithRequestWithResponseRequest
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestWithResponseRequest) InlineAlignment() int {
+func (_ *withAndWithoutRequestResponseWithRequestWithResponseRequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestWithResponseRequest) InlineSize() int {
+func (_ *withAndWithoutRequestResponseWithRequestWithResponseRequest) InlineSize() int {
 	return 16
 }
 
-type WithAndWithoutRequestResponseWithRequestWithResponseResponse struct {
+type withAndWithoutRequestResponseWithRequestWithResponseResponse struct {
 	_ struct{} `fidl2:"s,16,0"`
 	Ret string
 }
 
-var _mWithAndWithoutRequestResponseWithRequestWithResponseResponse = _bindings.CreateLazyMarshaler(WithAndWithoutRequestResponseWithRequestWithResponseResponse{})
+var _mwithAndWithoutRequestResponseWithRequestWithResponseResponse = _bindings.CreateLazyMarshaler(withAndWithoutRequestResponseWithRequestWithResponseResponse{})
 
-func (msg *WithAndWithoutRequestResponseWithRequestWithResponseResponse) Marshaler() _bindings.Marshaler {
-	return _mWithAndWithoutRequestResponseWithRequestWithResponseResponse
+func (msg *withAndWithoutRequestResponseWithRequestWithResponseResponse) Marshaler() _bindings.Marshaler {
+	return _mwithAndWithoutRequestResponseWithRequestWithResponseResponse
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestWithResponseResponse) InlineAlignment() int {
+func (_ *withAndWithoutRequestResponseWithRequestWithResponseResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseWithRequestWithResponseResponse) InlineSize() int {
+func (_ *withAndWithoutRequestResponseWithRequestWithResponseResponse) InlineSize() int {
 	return 16
 }
 
-type WithAndWithoutRequestResponseOnWithResponseResponse struct {
+type withAndWithoutRequestResponseOnWithResponseResponse struct {
 	_ struct{} `fidl2:"s,16,0"`
 	Ret string
 }
 
-var _mWithAndWithoutRequestResponseOnWithResponseResponse = _bindings.CreateLazyMarshaler(WithAndWithoutRequestResponseOnWithResponseResponse{})
+var _mwithAndWithoutRequestResponseOnWithResponseResponse = _bindings.CreateLazyMarshaler(withAndWithoutRequestResponseOnWithResponseResponse{})
 
-func (msg *WithAndWithoutRequestResponseOnWithResponseResponse) Marshaler() _bindings.Marshaler {
-	return _mWithAndWithoutRequestResponseOnWithResponseResponse
+func (msg *withAndWithoutRequestResponseOnWithResponseResponse) Marshaler() _bindings.Marshaler {
+	return _mwithAndWithoutRequestResponseOnWithResponseResponse
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseOnWithResponseResponse) InlineAlignment() int {
+func (_ *withAndWithoutRequestResponseOnWithResponseResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *WithAndWithoutRequestResponseOnWithResponseResponse) InlineSize() int {
+func (_ *withAndWithoutRequestResponseOnWithResponseResponse) InlineSize() int {
 	return 16
 }
 
@@ -174,13 +303,13 @@ func (p *WithAndWithoutRequestResponseInterface) NoRequestEmptyResponse() error
 
 func (p *WithAndWithoutRequestResponseInterface) NoRequestWithResponse() (string, error) {
 	var req_ _bindings.Payload
-	resp_ := &WithAndWithoutRequestResponseNoRequestWithResponseResponse{}
+	resp_ := &withAndWithoutRequestResponseNoRequestWithResponseResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Call(WithAndWithoutRequestResponseNoRequestWithResponseOrdinal, req_, resp_)
 	return resp_.Ret, err
 }
 
 func (p *WithAndWithoutRequestResponseInterface) WithRequestNoResponse(arg string) error {
-	req_ := &WithAndWithoutRequestResponseWithRequestNoResponseRequest{
+	req_ := &withAndWithoutRequestResponseWithRequestNoResponseRequest{
 		Arg: arg,
 	}
 	err := ((*_bindings.ChannelProxy)(p)).Send(WithAndWithoutRequestResponseWithRequestNoResponseOrdinal, req_)
@@ -188,7 +317,7 @@ func (p *WithAndWithoutRequestResponseInterface) WithRequestNoResponse(arg strin
 }
 
 func (p *WithAndWithoutRequestResponseInterface) WithRequestEmptyResponse(arg string) error {
-	req_ := &WithAndWithoutRequestResponseWithRequestEmptyResponseRequest{
+	req_ := &withAndWithoutRequestResponseWithRequestEmptyResponseRequest{
 		Arg: arg,
 	}
 	var resp_ _bindings.Payload
@@ -197,10 +326,10 @@ func (p *WithAndWithoutRequestResponseInterface) WithRequestEmptyResponse(arg st
 }
 
 func (p *WithAndWithoutRequestResponseInterface) WithRequestWithResponse(arg string) (string, error) {
-	req_ := &WithAndWithoutRequestResponseWithRequestWithResponseRequest{
+	req_ := &withAndWithoutRequestResponseWithRequestWithResponseRequest{
 		Arg: arg,
 	}
-	resp_ := &WithAndWithoutRequestResponseWithRequestWithResponseResponse{}
+	resp_ := &withAndWithoutRequestResponseWithRequestWithResponseResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Call(WithAndWithoutRequestResponseWithRequestWithResponseOrdinal, req_, resp_)
 	return resp_.Ret, err
 }
@@ -212,7 +341,7 @@ func (p *WithAndWithoutRequestResponseInterface) ExpectOnEmptyResponse() error {
 }
 
 func (p *WithAndWithoutRequestResponseInterface) ExpectOnWithResponse() (string, error) {
-	resp_ := &WithAndWithoutRequestResponseOnWithResponseResponse{}
+	resp_ := &withAndWithoutRequestResponseOnWithResponseResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Recv(WithAndWithoutRequestResponseOnWithResponseOrdinal, resp_)
 	return resp_.Ret, err
 }
@@ -255,30 +384,30 @@ func (s *WithAndWithoutRequestResponseStub) DispatchNew(ord uint32, b_ []byte, h
 		return nil, err_
 	case WithAndWithoutRequestResponseNoRequestWithResponseOrdinal:
 		ret, err_ := s.Impl.NoRequestWithResponse()
-		out_ := WithAndWithoutRequestResponseNoRequestWithResponseResponse{}
+		out_ := withAndWithoutRequestResponseNoRequestWithResponseResponse{}
 		out_.Ret = ret
 		return &out_, err_
 	case WithAndWithoutRequestResponseWithRequestNoResponseOrdinal:
-		in_ := WithAndWithoutRequestResponseWithRequestNoResponseRequest{}
+		in_ := withAndWithoutRequestResponseWithRequestNoResponseRequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		err_ := s.Impl.WithRequestNoResponse(in_.Arg)
 		return nil, err_
 	case WithAndWithoutRequestResponseWithRequestEmptyResponseOrdinal:
-		in_ := WithAndWithoutRequestResponseWithRequestEmptyResponseRequest{}
+		in_ := withAndWithoutRequestResponseWithRequestEmptyResponseRequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		err_ := s.Impl.WithRequestEmptyResponse(in_.Arg)
 		return nil, err_
 	case WithAndWithoutRequestResponseWithRequestWithResponseOrdinal:
-		in_ := WithAndWithoutRequestResponseWithRequestWithResponseRequest{}
+		in_ := withAndWithoutRequestResponseWithRequestWithResponseRequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		ret, err_ := s.Impl.WithRequestWithResponse(in_.Arg)
-		out_ := WithAndWithoutRequestResponseWithRequestWithResponseResponse{}
+		out_ := withAndWithoutRequestResponseWithRequestWithResponseResponse{}
 		out_.Ret = ret
 		return &out_, err_
 	}
@@ -304,13 +433,135 @@ func (p *WithAndWithoutRequestResponseEventProxy) OnEmptyResponse() error {
 	return ((*_bindings.ChannelProxy)(p)).Send(WithAndWithoutRequestResponseOnEmptyResponseOrdinal, event_)
 }
 func (p *WithAndWithoutRequestResponseEventProxy) OnWithResponse(ret string) error {
-	event_ := &WithAndWithoutRequestResponseOnWithResponseResponse{
+	event_ := &withAndWithoutRequestResponseOnWithResponseResponse{
 		Ret: ret,
 	}
 	return ((*_bindings.ChannelProxy)(p)).Send(WithAndWithoutRequestResponseOnWithResponseOrdinal, event_)
 }
 
 
+const (
+	WithErrorSyntaxErrorAsPrimitiveOrdinal uint32 = 2069369145
+	WithErrorSyntaxErrorAsPrimitiveGenOrdinal uint32 = 2069369145
+	WithErrorSyntaxErrorAsEnumOrdinal uint32 = 1284890143
+	WithErrorSyntaxErrorAsEnumGenOrdinal uint32 = 1284890143
+)
+
+type withErrorSyntaxErrorAsPrimitiveResponse struct {
+	_ struct{} `fidl2:"s,8,0"`
+	Result WithErrorSyntaxErrorAsPrimitiveResult
+}
+
+var _mwithErrorSyntaxErrorAsPrimitiveResponse = _bindings.CreateLazyMarshaler(withErrorSyntaxErrorAsPrimitiveResponse{})
+
+func (msg *withErrorSyntaxErrorAsPrimitiveResponse) Marshaler() _bindings.Marshaler {
+	return _mwithErrorSyntaxErrorAsPrimitiveResponse
+}
+
+// Implements Payload.
+func (_ *withErrorSyntaxErrorAsPrimitiveResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *withErrorSyntaxErrorAsPrimitiveResponse) InlineSize() int {
+	return 8
+}
+
+type withErrorSyntaxErrorAsEnumResponse struct {
+	_ struct{} `fidl2:"s,8,0"`
+	Result WithErrorSyntaxErrorAsEnumResult
+}
+
+var _mwithErrorSyntaxErrorAsEnumResponse = _bindings.CreateLazyMarshaler(withErrorSyntaxErrorAsEnumResponse{})
+
+func (msg *withErrorSyntaxErrorAsEnumResponse) Marshaler() _bindings.Marshaler {
+	return _mwithErrorSyntaxErrorAsEnumResponse
+}
+
+// Implements Payload.
+func (_ *withErrorSyntaxErrorAsEnumResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *withErrorSyntaxErrorAsEnumResponse) InlineSize() int {
+	return 8
+}
+
+type WithErrorSyntaxInterface _bindings.ChannelProxy
+
+
+func (p *WithErrorSyntaxInterface) ErrorAsPrimitive() (WithErrorSyntaxErrorAsPrimitiveResult, error) {
+	var req_ _bindings.Payload
+	resp_ := &withErrorSyntaxErrorAsPrimitiveResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(WithErrorSyntaxErrorAsPrimitiveOrdinal, req_, resp_)
+	return resp_.Result, err
+}
+
+func (p *WithErrorSyntaxInterface) ErrorAsEnum() (WithErrorSyntaxErrorAsEnumResult, error) {
+	var req_ _bindings.Payload
+	resp_ := &withErrorSyntaxErrorAsEnumResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(WithErrorSyntaxErrorAsEnumOrdinal, req_, resp_)
+	return resp_.Result, err
+}
+
+
+type WithErrorSyntax interface {
+	ErrorAsPrimitive() (WithErrorSyntaxErrorAsPrimitiveResult, error)
+	ErrorAsEnum() (WithErrorSyntaxErrorAsEnumResult, error)
+}
+
+type WithErrorSyntaxTransitionalBase struct {}
+
+
+type WithErrorSyntaxInterfaceRequest _bindings.InterfaceRequest
+
+func NewWithErrorSyntaxInterfaceRequest() (WithErrorSyntaxInterfaceRequest, *WithErrorSyntaxInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return WithErrorSyntaxInterfaceRequest(req), (*WithErrorSyntaxInterface)(cli), err
+}
+
+type WithErrorSyntaxStub struct {
+	Impl WithErrorSyntax
+}
+
+func (s *WithErrorSyntaxStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Payload, error) {
+	return s.DispatchNew(ord, b_, h_)
+}
+
+func (s *WithErrorSyntaxStub) DispatchNew(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Message, error) {
+	switch ord {
+	case WithErrorSyntaxErrorAsPrimitiveOrdinal:
+		result, err_ := s.Impl.ErrorAsPrimitive()
+		out_ := withErrorSyntaxErrorAsPrimitiveResponse{}
+		out_.Result = result
+		return &out_, err_
+	case WithErrorSyntaxErrorAsEnumOrdinal:
+		result, err_ := s.Impl.ErrorAsEnum()
+		out_ := withErrorSyntaxErrorAsEnumResponse{}
+		out_.Result = result
+		return &out_, err_
+	}
+	return nil, _bindings.ErrUnknownOrdinal
+}
+type WithErrorSyntaxService struct {
+	_bindings.BindingSet
+}
+
+func (s *WithErrorSyntaxService) Add(impl WithErrorSyntax, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
+	return s.BindingSet.Add(&WithErrorSyntaxStub{Impl: impl}, c, onError)
+}
+
+func (s *WithErrorSyntaxService) EventProxyFor(key _bindings.BindingKey) (*WithErrorSyntaxEventProxy, bool) {
+	pxy, err := s.BindingSet.ProxyFor(key)
+	return (*WithErrorSyntaxEventProxy)(pxy), err
+}
+
+type WithErrorSyntaxEventProxy _bindings.ChannelProxy
+
+
+
 const (
 	OvernetInternalProtocolMethodAOrdinal uint32 = 1993818253
 	OvernetInternalProtocolMethodAGenOrdinal uint32 = 1993818253
@@ -320,90 +571,90 @@ const (
 	OvernetInternalProtocolMethodBGenOrdinal uint32 = 952134976
 )
 
-type OvernetInternalProtocolMethodARequest struct {
+type overnetInternalProtocolMethodARequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mOvernetInternalProtocolMethodARequest = _bindings.CreateLazyMarshaler(OvernetInternalProtocolMethodARequest{})
+var _movernetInternalProtocolMethodARequest = _bindings.CreateLazyMarshaler(overnetInternalProtocolMethodARequest{})
 
-func (msg *OvernetInternalProtocolMethodARequest) Marshaler() _bindings.Marshaler {
-	return _mOvernetInternalProtocolMethodARequest
+func (msg *overnetInternalProtocolMethodARequest) Marshaler() _bindings.Marshaler {
+	return _movernetInternalProtocolMethodARequest
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolMethodARequest) InlineAlignment() int {
+func (_ *overnetInternalProtocolMethodARequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolMethodARequest) InlineSize() int {
+func (_ *overnetInternalProtocolMethodARequest) InlineSize() int {
 	return 16
 }
 
-type OvernetInternalProtocolEventAResponse struct {
+type overnetInternalProtocolEventAResponse struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mOvernetInternalProtocolEventAResponse = _bindings.CreateLazyMarshaler(OvernetInternalProtocolEventAResponse{})
+var _movernetInternalProtocolEventAResponse = _bindings.CreateLazyMarshaler(overnetInternalProtocolEventAResponse{})
 
-func (msg *OvernetInternalProtocolEventAResponse) Marshaler() _bindings.Marshaler {
-	return _mOvernetInternalProtocolEventAResponse
+func (msg *overnetInternalProtocolEventAResponse) Marshaler() _bindings.Marshaler {
+	return _movernetInternalProtocolEventAResponse
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolEventAResponse) InlineAlignment() int {
+func (_ *overnetInternalProtocolEventAResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolEventAResponse) InlineSize() int {
+func (_ *overnetInternalProtocolEventAResponse) InlineSize() int {
 	return 16
 }
 
-type OvernetInternalProtocolMethodBRequest struct {
+type overnetInternalProtocolMethodBRequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mOvernetInternalProtocolMethodBRequest = _bindings.CreateLazyMarshaler(OvernetInternalProtocolMethodBRequest{})
+var _movernetInternalProtocolMethodBRequest = _bindings.CreateLazyMarshaler(overnetInternalProtocolMethodBRequest{})
 
-func (msg *OvernetInternalProtocolMethodBRequest) Marshaler() _bindings.Marshaler {
-	return _mOvernetInternalProtocolMethodBRequest
+func (msg *overnetInternalProtocolMethodBRequest) Marshaler() _bindings.Marshaler {
+	return _movernetInternalProtocolMethodBRequest
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolMethodBRequest) InlineAlignment() int {
+func (_ *overnetInternalProtocolMethodBRequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolMethodBRequest) InlineSize() int {
+func (_ *overnetInternalProtocolMethodBRequest) InlineSize() int {
 	return 16
 }
 
-type OvernetInternalProtocolMethodBResponse struct {
+type overnetInternalProtocolMethodBResponse struct {
 	_ struct{} `fidl2:"s,8,0"`
 	Result int64
 }
 
-var _mOvernetInternalProtocolMethodBResponse = _bindings.CreateLazyMarshaler(OvernetInternalProtocolMethodBResponse{})
+var _movernetInternalProtocolMethodBResponse = _bindings.CreateLazyMarshaler(overnetInternalProtocolMethodBResponse{})
 
-func (msg *OvernetInternalProtocolMethodBResponse) Marshaler() _bindings.Marshaler {
-	return _mOvernetInternalProtocolMethodBResponse
+func (msg *overnetInternalProtocolMethodBResponse) Marshaler() _bindings.Marshaler {
+	return _movernetInternalProtocolMethodBResponse
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolMethodBResponse) InlineAlignment() int {
+func (_ *overnetInternalProtocolMethodBResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *OvernetInternalProtocolMethodBResponse) InlineSize() int {
+func (_ *overnetInternalProtocolMethodBResponse) InlineSize() int {
 	return 8
 }
 
@@ -411,7 +662,7 @@ type OvernetInternalProtocolInterface _bindings.ChannelProxy
 
 
 func (p *OvernetInternalProtocolInterface) MethodA(a int64,b int64) error {
-	req_ := &OvernetInternalProtocolMethodARequest{
+	req_ := &overnetInternalProtocolMethodARequest{
 		A: a,
 		B: b,
 	}
@@ -420,17 +671,17 @@ func (p *OvernetInternalProtocolInterface) MethodA(a int64,b int64) error {
 }
 
 func (p *OvernetInternalProtocolInterface) ExpectEventA() (int64, int64, error) {
-	resp_ := &OvernetInternalProtocolEventAResponse{}
+	resp_ := &overnetInternalProtocolEventAResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Recv(OvernetInternalProtocolEventAOrdinal, resp_)
 	return resp_.A, resp_.B, err
 }
 
 func (p *OvernetInternalProtocolInterface) MethodB(a int64,b int64) (int64, error) {
-	req_ := &OvernetInternalProtocolMethodBRequest{
+	req_ := &overnetInternalProtocolMethodBRequest{
 		A: a,
 		B: b,
 	}
-	resp_ := &OvernetInternalProtocolMethodBResponse{}
+	resp_ := &overnetInternalProtocolMethodBResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Call(OvernetInternalProtocolMethodBOrdinal, req_, resp_)
 	return resp_.Result, err
 }
@@ -462,19 +713,19 @@ func (s *OvernetInternalProtocolStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.H
 func (s *OvernetInternalProtocolStub) DispatchNew(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Message, error) {
 	switch ord {
 	case OvernetInternalProtocolMethodAOrdinal:
-		in_ := OvernetInternalProtocolMethodARequest{}
+		in_ := overnetInternalProtocolMethodARequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		err_ := s.Impl.MethodA(in_.A,in_.B)
 		return nil, err_
 	case OvernetInternalProtocolMethodBOrdinal:
-		in_ := OvernetInternalProtocolMethodBRequest{}
+		in_ := overnetInternalProtocolMethodBRequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		result, err_ := s.Impl.MethodB(in_.A,in_.B)
-		out_ := OvernetInternalProtocolMethodBResponse{}
+		out_ := overnetInternalProtocolMethodBResponse{}
 		out_.Result = result
 		return &out_, err_
 	}
@@ -496,7 +747,7 @@ func (s *OvernetInternalProtocolService) EventProxyFor(key _bindings.BindingKey)
 type OvernetInternalProtocolEventProxy _bindings.ChannelProxy
 
 func (p *OvernetInternalProtocolEventProxy) EventA(a int64,b int64) error {
-	event_ := &OvernetInternalProtocolEventAResponse{
+	event_ := &overnetInternalProtocolEventAResponse{
 		A: a,
 		B: b,
 	}
@@ -513,90 +764,90 @@ const (
 	SocketControlProtocolMethodBGenOrdinal uint32 = 677342235
 )
 
-type SocketControlProtocolMethodARequest struct {
+type socketControlProtocolMethodARequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mSocketControlProtocolMethodARequest = _bindings.CreateLazyMarshaler(SocketControlProtocolMethodARequest{})
+var _msocketControlProtocolMethodARequest = _bindings.CreateLazyMarshaler(socketControlProtocolMethodARequest{})
 
-func (msg *SocketControlProtocolMethodARequest) Marshaler() _bindings.Marshaler {
-	return _mSocketControlProtocolMethodARequest
+func (msg *socketControlProtocolMethodARequest) Marshaler() _bindings.Marshaler {
+	return _msocketControlProtocolMethodARequest
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolMethodARequest) InlineAlignment() int {
+func (_ *socketControlProtocolMethodARequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolMethodARequest) InlineSize() int {
+func (_ *socketControlProtocolMethodARequest) InlineSize() int {
 	return 16
 }
 
-type SocketControlProtocolEventAResponse struct {
+type socketControlProtocolEventAResponse struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mSocketControlProtocolEventAResponse = _bindings.CreateLazyMarshaler(SocketControlProtocolEventAResponse{})
+var _msocketControlProtocolEventAResponse = _bindings.CreateLazyMarshaler(socketControlProtocolEventAResponse{})
 
-func (msg *SocketControlProtocolEventAResponse) Marshaler() _bindings.Marshaler {
-	return _mSocketControlProtocolEventAResponse
+func (msg *socketControlProtocolEventAResponse) Marshaler() _bindings.Marshaler {
+	return _msocketControlProtocolEventAResponse
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolEventAResponse) InlineAlignment() int {
+func (_ *socketControlProtocolEventAResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolEventAResponse) InlineSize() int {
+func (_ *socketControlProtocolEventAResponse) InlineSize() int {
 	return 16
 }
 
-type SocketControlProtocolMethodBRequest struct {
+type socketControlProtocolMethodBRequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mSocketControlProtocolMethodBRequest = _bindings.CreateLazyMarshaler(SocketControlProtocolMethodBRequest{})
+var _msocketControlProtocolMethodBRequest = _bindings.CreateLazyMarshaler(socketControlProtocolMethodBRequest{})
 
-func (msg *SocketControlProtocolMethodBRequest) Marshaler() _bindings.Marshaler {
-	return _mSocketControlProtocolMethodBRequest
+func (msg *socketControlProtocolMethodBRequest) Marshaler() _bindings.Marshaler {
+	return _msocketControlProtocolMethodBRequest
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolMethodBRequest) InlineAlignment() int {
+func (_ *socketControlProtocolMethodBRequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolMethodBRequest) InlineSize() int {
+func (_ *socketControlProtocolMethodBRequest) InlineSize() int {
 	return 16
 }
 
-type SocketControlProtocolMethodBResponse struct {
+type socketControlProtocolMethodBResponse struct {
 	_ struct{} `fidl2:"s,8,0"`
 	Result int64
 }
 
-var _mSocketControlProtocolMethodBResponse = _bindings.CreateLazyMarshaler(SocketControlProtocolMethodBResponse{})
+var _msocketControlProtocolMethodBResponse = _bindings.CreateLazyMarshaler(socketControlProtocolMethodBResponse{})
 
-func (msg *SocketControlProtocolMethodBResponse) Marshaler() _bindings.Marshaler {
-	return _mSocketControlProtocolMethodBResponse
+func (msg *socketControlProtocolMethodBResponse) Marshaler() _bindings.Marshaler {
+	return _msocketControlProtocolMethodBResponse
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolMethodBResponse) InlineAlignment() int {
+func (_ *socketControlProtocolMethodBResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *SocketControlProtocolMethodBResponse) InlineSize() int {
+func (_ *socketControlProtocolMethodBResponse) InlineSize() int {
 	return 8
 }
 
@@ -604,7 +855,7 @@ type SocketControlProtocolInterface _bindings.SocketControlProxy
 
 
 func (p *SocketControlProtocolInterface) MethodA(a int64,b int64) error {
-	req_ := &SocketControlProtocolMethodARequest{
+	req_ := &socketControlProtocolMethodARequest{
 		A: a,
 		B: b,
 	}
@@ -613,17 +864,17 @@ func (p *SocketControlProtocolInterface) MethodA(a int64,b int64) error {
 }
 
 func (p *SocketControlProtocolInterface) ExpectEventA() (int64, int64, error) {
-	resp_ := &SocketControlProtocolEventAResponse{}
+	resp_ := &socketControlProtocolEventAResponse{}
 	err := ((*_bindings.SocketControlProxy)(p)).Recv(SocketControlProtocolEventAOrdinal, resp_)
 	return resp_.A, resp_.B, err
 }
 
 func (p *SocketControlProtocolInterface) MethodB(a int64,b int64) (int64, error) {
-	req_ := &SocketControlProtocolMethodBRequest{
+	req_ := &socketControlProtocolMethodBRequest{
 		A: a,
 		B: b,
 	}
-	resp_ := &SocketControlProtocolMethodBResponse{}
+	resp_ := &socketControlProtocolMethodBResponse{}
 	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlProtocolMethodBOrdinal, req_, resp_)
 	return resp_.Result, err
 }
@@ -649,19 +900,19 @@ func (s *SocketControlProtocolStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Han
 func (s *SocketControlProtocolStub) DispatchNew(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Message, error) {
 	switch ord {
 	case SocketControlProtocolMethodAOrdinal:
-		in_ := SocketControlProtocolMethodARequest{}
+		in_ := socketControlProtocolMethodARequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		err_ := s.Impl.MethodA(in_.A,in_.B)
 		return nil, err_
 	case SocketControlProtocolMethodBOrdinal:
-		in_ := SocketControlProtocolMethodBRequest{}
+		in_ := socketControlProtocolMethodBRequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		result, err_ := s.Impl.MethodB(in_.A,in_.B)
-		out_ := SocketControlProtocolMethodBResponse{}
+		out_ := socketControlProtocolMethodBResponse{}
 		out_.Result = result
 		return &out_, err_
 	}
@@ -671,7 +922,7 @@ func (s *SocketControlProtocolStub) DispatchNew(ord uint32, b_ []byte, h_ []_zx.
 type SocketControlProtocolEventProxy _bindings.SocketControlProxy
 
 func (p *SocketControlProtocolEventProxy) EventA(a int64,b int64) error {
-	event_ := &SocketControlProtocolEventAResponse{
+	event_ := &socketControlProtocolEventAResponse{
 		A: a,
 		B: b,
 	}
@@ -688,90 +939,90 @@ const (
 	ChannelProtocolMethodBGenOrdinal uint32 = 180770075
 )
 
-type ChannelProtocolMethodARequest struct {
+type channelProtocolMethodARequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mChannelProtocolMethodARequest = _bindings.CreateLazyMarshaler(ChannelProtocolMethodARequest{})
+var _mchannelProtocolMethodARequest = _bindings.CreateLazyMarshaler(channelProtocolMethodARequest{})
 
-func (msg *ChannelProtocolMethodARequest) Marshaler() _bindings.Marshaler {
-	return _mChannelProtocolMethodARequest
+func (msg *channelProtocolMethodARequest) Marshaler() _bindings.Marshaler {
+	return _mchannelProtocolMethodARequest
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolMethodARequest) InlineAlignment() int {
+func (_ *channelProtocolMethodARequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolMethodARequest) InlineSize() int {
+func (_ *channelProtocolMethodARequest) InlineSize() int {
 	return 16
 }
 
-type ChannelProtocolEventAResponse struct {
+type channelProtocolEventAResponse struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mChannelProtocolEventAResponse = _bindings.CreateLazyMarshaler(ChannelProtocolEventAResponse{})
+var _mchannelProtocolEventAResponse = _bindings.CreateLazyMarshaler(channelProtocolEventAResponse{})
 
-func (msg *ChannelProtocolEventAResponse) Marshaler() _bindings.Marshaler {
-	return _mChannelProtocolEventAResponse
+func (msg *channelProtocolEventAResponse) Marshaler() _bindings.Marshaler {
+	return _mchannelProtocolEventAResponse
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolEventAResponse) InlineAlignment() int {
+func (_ *channelProtocolEventAResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolEventAResponse) InlineSize() int {
+func (_ *channelProtocolEventAResponse) InlineSize() int {
 	return 16
 }
 
-type ChannelProtocolMethodBRequest struct {
+type channelProtocolMethodBRequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mChannelProtocolMethodBRequest = _bindings.CreateLazyMarshaler(ChannelProtocolMethodBRequest{})
+var _mchannelProtocolMethodBRequest = _bindings.CreateLazyMarshaler(channelProtocolMethodBRequest{})
 
-func (msg *ChannelProtocolMethodBRequest) Marshaler() _bindings.Marshaler {
-	return _mChannelProtocolMethodBRequest
+func (msg *channelProtocolMethodBRequest) Marshaler() _bindings.Marshaler {
+	return _mchannelProtocolMethodBRequest
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolMethodBRequest) InlineAlignment() int {
+func (_ *channelProtocolMethodBRequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolMethodBRequest) InlineSize() int {
+func (_ *channelProtocolMethodBRequest) InlineSize() int {
 	return 16
 }
 
-type ChannelProtocolMethodBResponse struct {
+type channelProtocolMethodBResponse struct {
 	_ struct{} `fidl2:"s,8,0"`
 	Result int64
 }
 
-var _mChannelProtocolMethodBResponse = _bindings.CreateLazyMarshaler(ChannelProtocolMethodBResponse{})
+var _mchannelProtocolMethodBResponse = _bindings.CreateLazyMarshaler(channelProtocolMethodBResponse{})
 
-func (msg *ChannelProtocolMethodBResponse) Marshaler() _bindings.Marshaler {
-	return _mChannelProtocolMethodBResponse
+func (msg *channelProtocolMethodBResponse) Marshaler() _bindings.Marshaler {
+	return _mchannelProtocolMethodBResponse
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolMethodBResponse) InlineAlignment() int {
+func (_ *channelProtocolMethodBResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *ChannelProtocolMethodBResponse) InlineSize() int {
+func (_ *channelProtocolMethodBResponse) InlineSize() int {
 	return 8
 }
 
@@ -779,7 +1030,7 @@ type ChannelProtocolInterface _bindings.ChannelProxy
 
 
 func (p *ChannelProtocolInterface) MethodA(a int64,b int64) error {
-	req_ := &ChannelProtocolMethodARequest{
+	req_ := &channelProtocolMethodARequest{
 		A: a,
 		B: b,
 	}
@@ -788,17 +1039,17 @@ func (p *ChannelProtocolInterface) MethodA(a int64,b int64) error {
 }
 
 func (p *ChannelProtocolInterface) ExpectEventA() (int64, int64, error) {
-	resp_ := &ChannelProtocolEventAResponse{}
+	resp_ := &channelProtocolEventAResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Recv(ChannelProtocolEventAOrdinal, resp_)
 	return resp_.A, resp_.B, err
 }
 
 func (p *ChannelProtocolInterface) MethodB(a int64,b int64) (int64, error) {
-	req_ := &ChannelProtocolMethodBRequest{
+	req_ := &channelProtocolMethodBRequest{
 		A: a,
 		B: b,
 	}
-	resp_ := &ChannelProtocolMethodBResponse{}
+	resp_ := &channelProtocolMethodBResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Call(ChannelProtocolMethodBOrdinal, req_, resp_)
 	return resp_.Result, err
 }
@@ -830,19 +1081,19 @@ func (s *ChannelProtocolStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (
 func (s *ChannelProtocolStub) DispatchNew(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Message, error) {
 	switch ord {
 	case ChannelProtocolMethodAOrdinal:
-		in_ := ChannelProtocolMethodARequest{}
+		in_ := channelProtocolMethodARequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		err_ := s.Impl.MethodA(in_.A,in_.B)
 		return nil, err_
 	case ChannelProtocolMethodBOrdinal:
-		in_ := ChannelProtocolMethodBRequest{}
+		in_ := channelProtocolMethodBRequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		result, err_ := s.Impl.MethodB(in_.A,in_.B)
-		out_ := ChannelProtocolMethodBResponse{}
+		out_ := channelProtocolMethodBResponse{}
 		out_.Result = result
 		return &out_, err_
 	}
@@ -864,7 +1115,7 @@ func (s *ChannelProtocolService) EventProxyFor(key _bindings.BindingKey) (*Chann
 type ChannelProtocolEventProxy _bindings.ChannelProxy
 
 func (p *ChannelProtocolEventProxy) EventA(a int64,b int64) error {
-	event_ := &ChannelProtocolEventAResponse{
+	event_ := &channelProtocolEventAResponse{
 		A: a,
 		B: b,
 	}
@@ -881,90 +1132,90 @@ const (
 	KitchenSinkMethodBGenOrdinal uint32 = 1999489700
 )
 
-type KitchenSinkMethodARequest struct {
+type kitchenSinkMethodARequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mKitchenSinkMethodARequest = _bindings.CreateLazyMarshaler(KitchenSinkMethodARequest{})
+var _mkitchenSinkMethodARequest = _bindings.CreateLazyMarshaler(kitchenSinkMethodARequest{})
 
-func (msg *KitchenSinkMethodARequest) Marshaler() _bindings.Marshaler {
-	return _mKitchenSinkMethodARequest
+func (msg *kitchenSinkMethodARequest) Marshaler() _bindings.Marshaler {
+	return _mkitchenSinkMethodARequest
 }
 
 // Implements Payload.
-func (_ *KitchenSinkMethodARequest) InlineAlignment() int {
+func (_ *kitchenSinkMethodARequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *KitchenSinkMethodARequest) InlineSize() int {
+func (_ *kitchenSinkMethodARequest) InlineSize() int {
 	return 16
 }
 
-type KitchenSinkEventAResponse struct {
+type kitchenSinkEventAResponse struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mKitchenSinkEventAResponse = _bindings.CreateLazyMarshaler(KitchenSinkEventAResponse{})
+var _mkitchenSinkEventAResponse = _bindings.CreateLazyMarshaler(kitchenSinkEventAResponse{})
 
-func (msg *KitchenSinkEventAResponse) Marshaler() _bindings.Marshaler {
-	return _mKitchenSinkEventAResponse
+func (msg *kitchenSinkEventAResponse) Marshaler() _bindings.Marshaler {
+	return _mkitchenSinkEventAResponse
 }
 
 // Implements Payload.
-func (_ *KitchenSinkEventAResponse) InlineAlignment() int {
+func (_ *kitchenSinkEventAResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *KitchenSinkEventAResponse) InlineSize() int {
+func (_ *kitchenSinkEventAResponse) InlineSize() int {
 	return 16
 }
 
-type KitchenSinkMethodBRequest struct {
+type kitchenSinkMethodBRequest struct {
 	_ struct{} `fidl2:"s,16,0"`
 	A int64
 	B int64
 }
 
-var _mKitchenSinkMethodBRequest = _bindings.CreateLazyMarshaler(KitchenSinkMethodBRequest{})
+var _mkitchenSinkMethodBRequest = _bindings.CreateLazyMarshaler(kitchenSinkMethodBRequest{})
 
-func (msg *KitchenSinkMethodBRequest) Marshaler() _bindings.Marshaler {
-	return _mKitchenSinkMethodBRequest
+func (msg *kitchenSinkMethodBRequest) Marshaler() _bindings.Marshaler {
+	return _mkitchenSinkMethodBRequest
 }
 
 // Implements Payload.
-func (_ *KitchenSinkMethodBRequest) InlineAlignment() int {
+func (_ *kitchenSinkMethodBRequest) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *KitchenSinkMethodBRequest) InlineSize() int {
+func (_ *kitchenSinkMethodBRequest) InlineSize() int {
 	return 16
 }
 
-type KitchenSinkMethodBResponse struct {
+type kitchenSinkMethodBResponse struct {
 	_ struct{} `fidl2:"s,8,0"`
 	Result int64
 }
 
-var _mKitchenSinkMethodBResponse = _bindings.CreateLazyMarshaler(KitchenSinkMethodBResponse{})
+var _mkitchenSinkMethodBResponse = _bindings.CreateLazyMarshaler(kitchenSinkMethodBResponse{})
 
-func (msg *KitchenSinkMethodBResponse) Marshaler() _bindings.Marshaler {
-	return _mKitchenSinkMethodBResponse
+func (msg *kitchenSinkMethodBResponse) Marshaler() _bindings.Marshaler {
+	return _mkitchenSinkMethodBResponse
 }
 
 // Implements Payload.
-func (_ *KitchenSinkMethodBResponse) InlineAlignment() int {
+func (_ *kitchenSinkMethodBResponse) InlineAlignment() int {
 	return 0
 }
 
 // Implements Payload.
-func (_ *KitchenSinkMethodBResponse) InlineSize() int {
+func (_ *kitchenSinkMethodBResponse) InlineSize() int {
 	return 8
 }
 
@@ -972,7 +1223,7 @@ type KitchenSinkInterface _bindings.ChannelProxy
 
 
 func (p *KitchenSinkInterface) MethodA(a int64,b int64) error {
-	req_ := &KitchenSinkMethodARequest{
+	req_ := &kitchenSinkMethodARequest{
 		A: a,
 		B: b,
 	}
@@ -981,17 +1232,17 @@ func (p *KitchenSinkInterface) MethodA(a int64,b int64) error {
 }
 
 func (p *KitchenSinkInterface) ExpectEventA() (int64, int64, error) {
-	resp_ := &KitchenSinkEventAResponse{}
+	resp_ := &kitchenSinkEventAResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Recv(KitchenSinkEventAOrdinal, resp_)
 	return resp_.A, resp_.B, err
 }
 
 func (p *KitchenSinkInterface) MethodB(a int64,b int64) (int64, error) {
-	req_ := &KitchenSinkMethodBRequest{
+	req_ := &kitchenSinkMethodBRequest{
 		A: a,
 		B: b,
 	}
-	resp_ := &KitchenSinkMethodBResponse{}
+	resp_ := &kitchenSinkMethodBResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Call(KitchenSinkMethodBOrdinal, req_, resp_)
 	return resp_.Result, err
 }
@@ -1023,19 +1274,19 @@ func (s *KitchenSinkStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (_bin
 func (s *KitchenSinkStub) DispatchNew(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Message, error) {
 	switch ord {
 	case KitchenSinkMethodAOrdinal:
-		in_ := KitchenSinkMethodARequest{}
+		in_ := kitchenSinkMethodARequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		err_ := s.Impl.MethodA(in_.A,in_.B)
 		return nil, err_
 	case KitchenSinkMethodBOrdinal:
-		in_ := KitchenSinkMethodBRequest{}
+		in_ := kitchenSinkMethodBRequest{}
 		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
 			return nil, err_
 		}
 		result, err_ := s.Impl.MethodB(in_.A,in_.B)
-		out_ := KitchenSinkMethodBResponse{}
+		out_ := kitchenSinkMethodBResponse{}
 		out_.Result = result
 		return &out_, err_
 	}
@@ -1057,7 +1308,7 @@ func (s *KitchenSinkService) EventProxyFor(key _bindings.BindingKey) (*KitchenSi
 type KitchenSinkEventProxy _bindings.ChannelProxy
 
 func (p *KitchenSinkEventProxy) EventA(a int64,b int64) error {
-	event_ := &KitchenSinkEventAResponse{
+	event_ := &kitchenSinkEventAResponse{
 		A: a,
 		B: b,
 	}
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.h.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.h.golden
index e3acfabff8c6d44de274c756aa2ce7780f8e87e6..8e9724a17e2e38cc19ab6867c91660cdb99f4054 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.h.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.h.golden
@@ -8,6 +8,9 @@
 namespace test {
 namespace name {
 
+class WithErrorSyntax_ErrorAsPrimitive_Response;
+class WithErrorSyntax_ErrorAsPrimitive_Result;
+class WithErrorSyntax_ErrorAsEnum_Response;
 #ifdef __Fuchsia__
 class KitchenSink;
 using KitchenSinkPtr = ::fidl::InterfacePtr<KitchenSink>;
@@ -58,6 +61,152 @@ class WithAndWithoutRequestResponse_Sync;
 using WithAndWithoutRequestResponseSyncPtr = ::fidl::SynchronousInterfacePtr<WithAndWithoutRequestResponse>;
 class WithAndWithoutRequestResponse_SyncProxy;
 #endif // __Fuchsia__
+enum class ErrorEnun : uint32_t {
+  ERR_FOO = 1,
+  ERR_BAR = 2,
+};
+
+inline zx_status_t Clone(::test::name::ErrorEnun value,
+                         ::test::name::ErrorEnun* result) {
+  *result = value;
+  return ZX_OK;
+}
+
+class WithErrorSyntax_ErrorAsEnum_Result;
+#ifdef __Fuchsia__
+class WithErrorSyntax;
+using WithErrorSyntaxPtr = ::fidl::InterfacePtr<WithErrorSyntax>;
+class WithErrorSyntax_Proxy;
+class WithErrorSyntax_Stub;
+class WithErrorSyntax_EventSender;
+class WithErrorSyntax_Sync;
+using WithErrorSyntaxSyncPtr = ::fidl::SynchronousInterfacePtr<WithErrorSyntax>;
+class WithErrorSyntax_SyncProxy;
+#endif // __Fuchsia__
+
+class WithErrorSyntax_ErrorAsPrimitive_Response  {
+ public:
+  static const fidl_type_t* FidlType;
+  
+  uint8_t __reserved = 0;
+
+  static inline ::std::unique_ptr<WithErrorSyntax_ErrorAsPrimitive_Response> New() { return ::std::make_unique<WithErrorSyntax_ErrorAsPrimitive_Response>(); }
+
+  void Encode(::fidl::Encoder* _encoder, size_t _offset);
+  static void Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsPrimitive_Response* value, size_t _offset);
+  zx_status_t Clone(WithErrorSyntax_ErrorAsPrimitive_Response* result) const;
+};
+
+bool operator==(const WithErrorSyntax_ErrorAsPrimitive_Response& _lhs, const WithErrorSyntax_ErrorAsPrimitive_Response& _rhs);
+inline bool operator!=(const WithErrorSyntax_ErrorAsPrimitive_Response& _lhs, const WithErrorSyntax_ErrorAsPrimitive_Response& _rhs) {
+  return !(_lhs == _rhs);
+}
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsPrimitive_Response& _value,
+                         ::test::name::WithErrorSyntax_ErrorAsPrimitive_Response* _result) {
+  return _value.Clone(_result);
+}
+
+using WithErrorSyntax_ErrorAsPrimitive_ResponsePtr = ::std::unique_ptr<WithErrorSyntax_ErrorAsPrimitive_Response>;
+
+class WithErrorSyntax_ErrorAsPrimitive_Result {
+ public:
+  WithErrorSyntax_ErrorAsPrimitive_Result();
+  ~WithErrorSyntax_ErrorAsPrimitive_Result();
+
+  WithErrorSyntax_ErrorAsPrimitive_Result(WithErrorSyntax_ErrorAsPrimitive_Result&&);
+  WithErrorSyntax_ErrorAsPrimitive_Result& operator=(WithErrorSyntax_ErrorAsPrimitive_Result&&);
+
+  enum class Tag : fidl_union_tag_t {
+    kResponse = 0,
+    kErr = 1,
+    Invalid = ::std::numeric_limits<::fidl_union_tag_t>::max(),
+  };
+
+  static inline ::std::unique_ptr<WithErrorSyntax_ErrorAsPrimitive_Result> New() { return ::std::make_unique<WithErrorSyntax_ErrorAsPrimitive_Result>(); }
+
+  void Encode(::fidl::Encoder* _encoder, size_t _offset);
+  static void Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsPrimitive_Result* _value, size_t _offset);
+  zx_status_t Clone(WithErrorSyntax_ErrorAsPrimitive_Result* result) const;
+
+  bool has_invalid_tag() const { return Which() == Tag::Invalid; }
+
+  bool is_response() const { return Which() == Tag(0); }
+  
+  WithErrorSyntax_ErrorAsPrimitive_Response& response() {
+    if (!is_response()) {
+      value_.emplace<0 + 1>();
+    }
+    return value_.template get<0 + 1>();
+  }
+  
+  const WithErrorSyntax_ErrorAsPrimitive_Response& response() const { return value_.template get<0 + 1>(); }
+  void set_response(WithErrorSyntax_ErrorAsPrimitive_Response value);
+
+  bool is_err() const { return Which() == Tag(1); }
+  
+  uint32_t& err() {
+    if (!is_err()) {
+      value_.emplace<1 + 1>();
+    }
+    return value_.template get<1 + 1>();
+  }
+  
+  const uint32_t& err() const { return value_.template get<1 + 1>(); }
+  void set_err(uint32_t value);
+
+  Tag Which() const {
+    size_t index = value_.index();
+    if (index == 0) {
+      return Tag::Invalid;
+    } else {
+      return Tag(index - 1);
+    }
+  }
+
+ private:
+  friend bool operator==(const WithErrorSyntax_ErrorAsPrimitive_Result& _lhs, const WithErrorSyntax_ErrorAsPrimitive_Result& _rhs);
+
+  using Variant = fit::internal::variant<fit::internal::monostate, WithErrorSyntax_ErrorAsPrimitive_Response, uint32_t>;
+  Variant value_;
+};
+
+bool operator==(const WithErrorSyntax_ErrorAsPrimitive_Result& _lhs, const WithErrorSyntax_ErrorAsPrimitive_Result& _rhs);
+inline bool operator!=(const WithErrorSyntax_ErrorAsPrimitive_Result& _lhs, const WithErrorSyntax_ErrorAsPrimitive_Result& _rhs) {
+  return !(_lhs == _rhs);
+}
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsPrimitive_Result& value,
+                         ::test::name::WithErrorSyntax_ErrorAsPrimitive_Result* result) {
+  return value.Clone(result);
+}
+
+using WithErrorSyntax_ErrorAsPrimitive_ResultPtr = ::std::unique_ptr<WithErrorSyntax_ErrorAsPrimitive_Result>;
+
+class WithErrorSyntax_ErrorAsEnum_Response  {
+ public:
+  static const fidl_type_t* FidlType;
+  
+  uint8_t __reserved = 0;
+
+  static inline ::std::unique_ptr<WithErrorSyntax_ErrorAsEnum_Response> New() { return ::std::make_unique<WithErrorSyntax_ErrorAsEnum_Response>(); }
+
+  void Encode(::fidl::Encoder* _encoder, size_t _offset);
+  static void Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsEnum_Response* value, size_t _offset);
+  zx_status_t Clone(WithErrorSyntax_ErrorAsEnum_Response* result) const;
+};
+
+bool operator==(const WithErrorSyntax_ErrorAsEnum_Response& _lhs, const WithErrorSyntax_ErrorAsEnum_Response& _rhs);
+inline bool operator!=(const WithErrorSyntax_ErrorAsEnum_Response& _lhs, const WithErrorSyntax_ErrorAsEnum_Response& _rhs) {
+  return !(_lhs == _rhs);
+}
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsEnum_Response& _value,
+                         ::test::name::WithErrorSyntax_ErrorAsEnum_Response* _result) {
+  return _value.Clone(_result);
+}
+
+using WithErrorSyntax_ErrorAsEnum_ResponsePtr = ::std::unique_ptr<WithErrorSyntax_ErrorAsEnum_Response>;
 #ifdef __Fuchsia__
 
 class KitchenSink {
@@ -469,7 +618,204 @@ class WithAndWithoutRequestResponse_SyncProxy : public WithAndWithoutRequestResp
   friend class ::fidl::SynchronousInterfacePtr<WithAndWithoutRequestResponse>;
 };
 #endif // __Fuchsia__
+
+class WithErrorSyntax_ErrorAsEnum_Result {
+ public:
+  WithErrorSyntax_ErrorAsEnum_Result();
+  ~WithErrorSyntax_ErrorAsEnum_Result();
+
+  WithErrorSyntax_ErrorAsEnum_Result(WithErrorSyntax_ErrorAsEnum_Result&&);
+  WithErrorSyntax_ErrorAsEnum_Result& operator=(WithErrorSyntax_ErrorAsEnum_Result&&);
+
+  enum class Tag : fidl_union_tag_t {
+    kResponse = 0,
+    kErr = 1,
+    Invalid = ::std::numeric_limits<::fidl_union_tag_t>::max(),
+  };
+
+  static inline ::std::unique_ptr<WithErrorSyntax_ErrorAsEnum_Result> New() { return ::std::make_unique<WithErrorSyntax_ErrorAsEnum_Result>(); }
+
+  void Encode(::fidl::Encoder* _encoder, size_t _offset);
+  static void Decode(::fidl::Decoder* _decoder, WithErrorSyntax_ErrorAsEnum_Result* _value, size_t _offset);
+  zx_status_t Clone(WithErrorSyntax_ErrorAsEnum_Result* result) const;
+
+  bool has_invalid_tag() const { return Which() == Tag::Invalid; }
+
+  bool is_response() const { return Which() == Tag(0); }
+  
+  WithErrorSyntax_ErrorAsEnum_Response& response() {
+    if (!is_response()) {
+      value_.emplace<0 + 1>();
+    }
+    return value_.template get<0 + 1>();
+  }
+  
+  const WithErrorSyntax_ErrorAsEnum_Response& response() const { return value_.template get<0 + 1>(); }
+  void set_response(WithErrorSyntax_ErrorAsEnum_Response value);
+
+  bool is_err() const { return Which() == Tag(1); }
+  
+  ErrorEnun& err() {
+    if (!is_err()) {
+      value_.emplace<1 + 1>();
+    }
+    return value_.template get<1 + 1>();
+  }
+  
+  const ErrorEnun& err() const { return value_.template get<1 + 1>(); }
+  void set_err(ErrorEnun value);
+
+  Tag Which() const {
+    size_t index = value_.index();
+    if (index == 0) {
+      return Tag::Invalid;
+    } else {
+      return Tag(index - 1);
+    }
+  }
+
+ private:
+  friend bool operator==(const WithErrorSyntax_ErrorAsEnum_Result& _lhs, const WithErrorSyntax_ErrorAsEnum_Result& _rhs);
+
+  using Variant = fit::internal::variant<fit::internal::monostate, WithErrorSyntax_ErrorAsEnum_Response, ErrorEnun>;
+  Variant value_;
+};
+
+bool operator==(const WithErrorSyntax_ErrorAsEnum_Result& _lhs, const WithErrorSyntax_ErrorAsEnum_Result& _rhs);
+inline bool operator!=(const WithErrorSyntax_ErrorAsEnum_Result& _lhs, const WithErrorSyntax_ErrorAsEnum_Result& _rhs) {
+  return !(_lhs == _rhs);
+}
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsEnum_Result& value,
+                         ::test::name::WithErrorSyntax_ErrorAsEnum_Result* result) {
+  return value.Clone(result);
+}
+
+using WithErrorSyntax_ErrorAsEnum_ResultPtr = ::std::unique_ptr<WithErrorSyntax_ErrorAsEnum_Result>;
+#ifdef __Fuchsia__
+
+class WithErrorSyntax {
+ public:
+  using Proxy_ = WithErrorSyntax_Proxy;
+  using Stub_ = WithErrorSyntax_Stub;
+  using EventSender_ = WithErrorSyntax_EventSender;
+  using Sync_ = WithErrorSyntax_Sync;
+  virtual ~WithErrorSyntax();
+  using ErrorAsPrimitiveCallback =
+      fit::function<void(WithErrorSyntax_ErrorAsPrimitive_Result)>;
+      
+  virtual void ErrorAsPrimitive(ErrorAsPrimitiveCallback callback) = 0;
+  using ErrorAsEnumCallback =
+      fit::function<void(WithErrorSyntax_ErrorAsEnum_Result)>;
+      
+  virtual void ErrorAsEnum(ErrorAsEnumCallback callback) = 0;
+};
+
+class WithErrorSyntax_EventSender {
+ public:
+  virtual ~WithErrorSyntax_EventSender();
+};
+
+class WithErrorSyntax_Sync {
+ public:
+  using Proxy_ = WithErrorSyntax_SyncProxy;
+  virtual ~WithErrorSyntax_Sync();
+  virtual zx_status_t ErrorAsPrimitive(WithErrorSyntax_ErrorAsPrimitive_Result* out_result) = 0;
+  virtual zx_status_t ErrorAsEnum(WithErrorSyntax_ErrorAsEnum_Result* out_result) = 0;
+};
+
+class WithErrorSyntax_Proxy : public ::fidl::internal::Proxy, public WithErrorSyntax {
+ public:
+  explicit WithErrorSyntax_Proxy(::fidl::internal::ProxyController* controller);
+  ~WithErrorSyntax_Proxy() override;
+
+  zx_status_t Dispatch_(::fidl::Message message) override;
+  void ErrorAsPrimitive(ErrorAsPrimitiveCallback callback) override;
+  void ErrorAsEnum(ErrorAsEnumCallback callback) override;
+
+ private:
+  WithErrorSyntax_Proxy(const WithErrorSyntax_Proxy&) = delete;
+  WithErrorSyntax_Proxy& operator=(const WithErrorSyntax_Proxy&) = delete;
+
+  ::fidl::internal::ProxyController* controller_;
+};
+
+class WithErrorSyntax_Stub : public ::fidl::internal::Stub, public WithErrorSyntax_EventSender {
+ public:
+  typedef class ::test::name::WithErrorSyntax WithErrorSyntax_clazz;
+  explicit WithErrorSyntax_Stub(WithErrorSyntax_clazz* impl);
+  ~WithErrorSyntax_Stub() override;
+
+  zx_status_t Dispatch_(::fidl::Message message,
+                        ::fidl::internal::PendingResponse response) override;
+
+ private:
+  WithErrorSyntax_clazz* impl_;
+};
+
+class WithErrorSyntax_SyncProxy : public WithErrorSyntax_Sync {
+ public:
+  explicit WithErrorSyntax_SyncProxy(::zx::channel channel);
+  ~WithErrorSyntax_SyncProxy() override;
+  zx_status_t ErrorAsPrimitive(WithErrorSyntax_ErrorAsPrimitive_Result* out_result) override;
+  zx_status_t ErrorAsEnum(WithErrorSyntax_ErrorAsEnum_Result* out_result) override;
+
+  private:
+  ::fidl::internal::SynchronousProxy proxy_;
+  friend class ::fidl::SynchronousInterfacePtr<WithErrorSyntax>;
+};
+#endif // __Fuchsia__
 }  // namespace name
 }  // namespace test
 namespace fidl {
-}  // namespace fidl
+
+template <>
+struct CodingTraits<::test::name::WithErrorSyntax_ErrorAsPrimitive_Response>
+    : public EncodableCodingTraits<::test::name::WithErrorSyntax_ErrorAsPrimitive_Response, 1> {};
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsPrimitive_Response& value,
+                         ::test::name::WithErrorSyntax_ErrorAsPrimitive_Response* result) {
+  return ::test::name::Clone(value, result);
+}
+template <>
+struct CodingTraits<::test::name::WithErrorSyntax_ErrorAsPrimitive_Result>
+    : public EncodableCodingTraits<::test::name::WithErrorSyntax_ErrorAsPrimitive_Result, 8> {};
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsPrimitive_Result& value,
+                         ::test::name::WithErrorSyntax_ErrorAsPrimitive_Result* result) {
+  return ::test::name::Clone(value, result);
+}
+template <>
+struct CodingTraits<::test::name::WithErrorSyntax_ErrorAsEnum_Response>
+    : public EncodableCodingTraits<::test::name::WithErrorSyntax_ErrorAsEnum_Response, 1> {};
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsEnum_Response& value,
+                         ::test::name::WithErrorSyntax_ErrorAsEnum_Response* result) {
+  return ::test::name::Clone(value, result);
+}
+template <>
+struct CodingTraits<::test::name::ErrorEnun> {
+  static constexpr size_t encoded_size = sizeof(::test::name::ErrorEnun);
+  static void Encode(Encoder* encoder, ::test::name::ErrorEnun* value, size_t offset) {
+    uint32_t underlying = static_cast<uint32_t>(*value);
+    ::fidl::Encode(encoder, &underlying, offset);
+  }
+  static void Decode(Decoder* decoder, ::test::name::ErrorEnun* value, size_t offset) {
+    uint32_t underlying = {};
+    ::fidl::Decode(decoder, &underlying, offset);
+    *value = static_cast<::test::name::ErrorEnun>(underlying);
+  }
+};
+
+inline zx_status_t Clone(::test::name::ErrorEnun value,
+                         ::test::name::ErrorEnun* result) {
+  return ::test::name::Clone(value, result);
+}
+template <>
+struct CodingTraits<::test::name::WithErrorSyntax_ErrorAsEnum_Result>
+    : public EncodableCodingTraits<::test::name::WithErrorSyntax_ErrorAsEnum_Result, 8> {};
+
+inline zx_status_t Clone(const ::test::name::WithErrorSyntax_ErrorAsEnum_Result& value,
+                         ::test::name::WithErrorSyntax_ErrorAsEnum_Result* result) {
+  return ::test::name::Clone(value, result);
+}}  // namespace fidl
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.cc.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.cc.golden
index 9fd5a73a1fc78afb18e44fb4a837cc62d075246c..6773e88b3a52ae0fecfbf88aef664cbdcc7a6b67 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.cc.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.cc.golden
@@ -6,6 +6,30 @@
 namespace test {
 namespace name {
 
+::test::name::WithErrorSyntax_ErrorAsPrimitive_Result::WithErrorSyntax_ErrorAsPrimitive_Result() {
+  memset(this, 0, sizeof(WithErrorSyntax_ErrorAsPrimitive_Result));
+  tag_ = Tag::Invalid;
+}
+
+::test::name::WithErrorSyntax_ErrorAsPrimitive_Result::~WithErrorSyntax_ErrorAsPrimitive_Result() {
+  Destroy();
+}
+
+void ::test::name::WithErrorSyntax_ErrorAsPrimitive_Result::Destroy() {
+  switch (which()) {
+  case Tag::kResponse:
+    response_.~WithErrorSyntax_ErrorAsPrimitive_Response();
+  default:
+    break;
+  }
+}
+
+void ::test::name::WithErrorSyntax_ErrorAsPrimitive_Result::SizeAndOffsetAssertionHelper() {
+  static_assert(offsetof(::test::name::WithErrorSyntax_ErrorAsPrimitive_Result, response_) == 4);
+  static_assert(offsetof(::test::name::WithErrorSyntax_ErrorAsPrimitive_Result, err_) == 4);
+  static_assert(sizeof(::test::name::WithErrorSyntax_ErrorAsPrimitive_Result) == ::test::name::WithErrorSyntax_ErrorAsPrimitive_Result::PrimarySize);
+}
+
 namespace {
 
 [[maybe_unused]]
@@ -1519,5 +1543,302 @@ zx_status_t WithAndWithoutRequestResponse::SendOnWithResponseEvent(::zx::unowned
 }
 
 
+::test::name::WithErrorSyntax_ErrorAsEnum_Result::WithErrorSyntax_ErrorAsEnum_Result() {
+  memset(this, 0, sizeof(WithErrorSyntax_ErrorAsEnum_Result));
+  tag_ = Tag::Invalid;
+}
+
+::test::name::WithErrorSyntax_ErrorAsEnum_Result::~WithErrorSyntax_ErrorAsEnum_Result() {
+  Destroy();
+}
+
+void ::test::name::WithErrorSyntax_ErrorAsEnum_Result::Destroy() {
+  switch (which()) {
+  case Tag::kResponse:
+    response_.~WithErrorSyntax_ErrorAsEnum_Response();
+  case Tag::kErr:
+    err_.~ErrorEnun();
+  default:
+    break;
+  }
+}
+
+void ::test::name::WithErrorSyntax_ErrorAsEnum_Result::SizeAndOffsetAssertionHelper() {
+  static_assert(offsetof(::test::name::WithErrorSyntax_ErrorAsEnum_Result, response_) == 4);
+  static_assert(offsetof(::test::name::WithErrorSyntax_ErrorAsEnum_Result, err_) == 4);
+  static_assert(sizeof(::test::name::WithErrorSyntax_ErrorAsEnum_Result) == ::test::name::WithErrorSyntax_ErrorAsEnum_Result::PrimarySize);
+}
+
+namespace {
+
+[[maybe_unused]]
+constexpr uint32_t kWithErrorSyntax_ErrorAsPrimitive_Ordinal = 2069369145u;
+[[maybe_unused]]
+constexpr uint32_t kWithErrorSyntax_ErrorAsEnum_Ordinal = 1284890143u;
+
+}  // namespace
+
+zx_status_t WithErrorSyntax::SyncClient::ErrorAsPrimitive(WithErrorSyntax_ErrorAsPrimitive_Result* out_result) {
+  constexpr uint32_t _kWriteAllocSize = ::fidl::internal::ClampedMessageSize<ErrorAsPrimitiveRequest>();
+  FIDL_ALIGNDECL uint8_t _write_bytes[_kWriteAllocSize] = {};
+  auto& _request = *reinterpret_cast<ErrorAsPrimitiveRequest*>(_write_bytes);
+  _request._hdr.ordinal = kWithErrorSyntax_ErrorAsPrimitive_Ordinal;
+  ::fidl::BytePart _request_bytes(_write_bytes, _kWriteAllocSize, sizeof(ErrorAsPrimitiveRequest));
+  ::fidl::DecodedMessage<ErrorAsPrimitiveRequest> _decoded_request(std::move(_request_bytes));
+  auto _encode_request_result = ::fidl::Encode(std::move(_decoded_request));
+  if (_encode_request_result.status != ZX_OK) {
+    return _encode_request_result.status;
+  }
+
+  constexpr uint32_t _kReadAllocSize = ::fidl::internal::ClampedMessageSize<ErrorAsPrimitiveResponse>();
+  FIDL_ALIGNDECL uint8_t _read_bytes[_kReadAllocSize];
+  ::fidl::BytePart _response_bytes(_read_bytes, _kReadAllocSize);
+  auto _call_result = ::fidl::Call<ErrorAsPrimitiveRequest, ErrorAsPrimitiveResponse>(
+    this->channel_, std::move(_encode_request_result.message), std::move(_response_bytes));
+  if (_call_result.status != ZX_OK) {
+    return _call_result.status;
+  }
+  auto _decode_result = ::fidl::Decode(std::move(_call_result.message));
+  if (_decode_result.status != ZX_OK) {
+    return _decode_result.status;
+  }
+  auto& _response = *_decode_result.message.message();
+  *out_result = std::move(_response.result);
+  return ZX_OK;
+}
+
+zx_status_t WithErrorSyntax::SyncClient::ErrorAsPrimitive(::fidl::BytePart _response_buffer, WithErrorSyntax_ErrorAsPrimitive_Result* out_result) {
+  FIDL_ALIGNDECL uint8_t _write_bytes[sizeof(ErrorAsPrimitiveRequest)] = {};
+  ::fidl::BytePart _request_buffer(_write_bytes, sizeof(_write_bytes));
+  auto& _request = *reinterpret_cast<ErrorAsPrimitiveRequest*>(_request_buffer.data());
+  _request._hdr.ordinal = kWithErrorSyntax_ErrorAsPrimitive_Ordinal;
+  _request_buffer.set_actual(sizeof(ErrorAsPrimitiveRequest));
+  ::fidl::DecodedMessage<ErrorAsPrimitiveRequest> _decoded_request(std::move(_request_buffer));
+  auto _encode_request_result = ::fidl::Encode(std::move(_decoded_request));
+  if (_encode_request_result.status != ZX_OK) {
+    return _encode_request_result.status;
+  }
+  auto _call_result = ::fidl::Call<ErrorAsPrimitiveRequest, ErrorAsPrimitiveResponse>(
+    this->channel_, std::move(_encode_request_result.message), std::move(_response_buffer));
+  if (_call_result.status != ZX_OK) {
+    return _call_result.status;
+  }
+  auto _decode_result = ::fidl::Decode(std::move(_call_result.message));
+  if (_decode_result.status != ZX_OK) {
+    return _decode_result.status;
+  }
+  auto& _response = *_decode_result.message.message();
+  *out_result = std::move(_response.result);
+  return ZX_OK;
+}
+
+::fidl::DecodeResult<WithErrorSyntax::ErrorAsPrimitiveResponse> WithErrorSyntax::SyncClient::ErrorAsPrimitive(::fidl::BytePart response_buffer) {
+  FIDL_ALIGNDECL uint8_t _write_bytes[sizeof(ErrorAsPrimitiveRequest)] = {};
+  constexpr uint32_t _write_num_bytes = sizeof(ErrorAsPrimitiveRequest);
+  ::fidl::BytePart _request_buffer(_write_bytes, sizeof(_write_bytes), _write_num_bytes);
+  ::fidl::DecodedMessage<ErrorAsPrimitiveRequest> params(std::move(_request_buffer));
+  params.message()->_hdr = {};
+  params.message()->_hdr.ordinal = kWithErrorSyntax_ErrorAsPrimitive_Ordinal;
+  auto _encode_request_result = ::fidl::Encode(std::move(params));
+  if (_encode_request_result.status != ZX_OK) {
+    return ::fidl::DecodeResult<WithErrorSyntax::ErrorAsPrimitiveResponse>(
+      _encode_request_result.status,
+      _encode_request_result.error,
+      ::fidl::DecodedMessage<WithErrorSyntax::ErrorAsPrimitiveResponse>());
+  }
+  auto _call_result = ::fidl::Call<ErrorAsPrimitiveRequest, ErrorAsPrimitiveResponse>(
+    this->channel_, std::move(_encode_request_result.message), std::move(response_buffer));
+  if (_call_result.status != ZX_OK) {
+    return ::fidl::DecodeResult<WithErrorSyntax::ErrorAsPrimitiveResponse>(
+      _call_result.status,
+      _call_result.error,
+      ::fidl::DecodedMessage<WithErrorSyntax::ErrorAsPrimitiveResponse>());
+  }
+  return ::fidl::Decode(std::move(_call_result.message));
+}
+
+
+zx_status_t WithErrorSyntax::SyncClient::ErrorAsEnum(WithErrorSyntax_ErrorAsEnum_Result* out_result) {
+  constexpr uint32_t _kWriteAllocSize = ::fidl::internal::ClampedMessageSize<ErrorAsEnumRequest>();
+  FIDL_ALIGNDECL uint8_t _write_bytes[_kWriteAllocSize] = {};
+  auto& _request = *reinterpret_cast<ErrorAsEnumRequest*>(_write_bytes);
+  _request._hdr.ordinal = kWithErrorSyntax_ErrorAsEnum_Ordinal;
+  ::fidl::BytePart _request_bytes(_write_bytes, _kWriteAllocSize, sizeof(ErrorAsEnumRequest));
+  ::fidl::DecodedMessage<ErrorAsEnumRequest> _decoded_request(std::move(_request_bytes));
+  auto _encode_request_result = ::fidl::Encode(std::move(_decoded_request));
+  if (_encode_request_result.status != ZX_OK) {
+    return _encode_request_result.status;
+  }
+
+  constexpr uint32_t _kReadAllocSize = ::fidl::internal::ClampedMessageSize<ErrorAsEnumResponse>();
+  FIDL_ALIGNDECL uint8_t _read_bytes[_kReadAllocSize];
+  ::fidl::BytePart _response_bytes(_read_bytes, _kReadAllocSize);
+  auto _call_result = ::fidl::Call<ErrorAsEnumRequest, ErrorAsEnumResponse>(
+    this->channel_, std::move(_encode_request_result.message), std::move(_response_bytes));
+  if (_call_result.status != ZX_OK) {
+    return _call_result.status;
+  }
+  auto _decode_result = ::fidl::Decode(std::move(_call_result.message));
+  if (_decode_result.status != ZX_OK) {
+    return _decode_result.status;
+  }
+  auto& _response = *_decode_result.message.message();
+  *out_result = std::move(_response.result);
+  return ZX_OK;
+}
+
+zx_status_t WithErrorSyntax::SyncClient::ErrorAsEnum(::fidl::BytePart _response_buffer, WithErrorSyntax_ErrorAsEnum_Result* out_result) {
+  FIDL_ALIGNDECL uint8_t _write_bytes[sizeof(ErrorAsEnumRequest)] = {};
+  ::fidl::BytePart _request_buffer(_write_bytes, sizeof(_write_bytes));
+  auto& _request = *reinterpret_cast<ErrorAsEnumRequest*>(_request_buffer.data());
+  _request._hdr.ordinal = kWithErrorSyntax_ErrorAsEnum_Ordinal;
+  _request_buffer.set_actual(sizeof(ErrorAsEnumRequest));
+  ::fidl::DecodedMessage<ErrorAsEnumRequest> _decoded_request(std::move(_request_buffer));
+  auto _encode_request_result = ::fidl::Encode(std::move(_decoded_request));
+  if (_encode_request_result.status != ZX_OK) {
+    return _encode_request_result.status;
+  }
+  auto _call_result = ::fidl::Call<ErrorAsEnumRequest, ErrorAsEnumResponse>(
+    this->channel_, std::move(_encode_request_result.message), std::move(_response_buffer));
+  if (_call_result.status != ZX_OK) {
+    return _call_result.status;
+  }
+  auto _decode_result = ::fidl::Decode(std::move(_call_result.message));
+  if (_decode_result.status != ZX_OK) {
+    return _decode_result.status;
+  }
+  auto& _response = *_decode_result.message.message();
+  *out_result = std::move(_response.result);
+  return ZX_OK;
+}
+
+::fidl::DecodeResult<WithErrorSyntax::ErrorAsEnumResponse> WithErrorSyntax::SyncClient::ErrorAsEnum(::fidl::BytePart response_buffer) {
+  FIDL_ALIGNDECL uint8_t _write_bytes[sizeof(ErrorAsEnumRequest)] = {};
+  constexpr uint32_t _write_num_bytes = sizeof(ErrorAsEnumRequest);
+  ::fidl::BytePart _request_buffer(_write_bytes, sizeof(_write_bytes), _write_num_bytes);
+  ::fidl::DecodedMessage<ErrorAsEnumRequest> params(std::move(_request_buffer));
+  params.message()->_hdr = {};
+  params.message()->_hdr.ordinal = kWithErrorSyntax_ErrorAsEnum_Ordinal;
+  auto _encode_request_result = ::fidl::Encode(std::move(params));
+  if (_encode_request_result.status != ZX_OK) {
+    return ::fidl::DecodeResult<WithErrorSyntax::ErrorAsEnumResponse>(
+      _encode_request_result.status,
+      _encode_request_result.error,
+      ::fidl::DecodedMessage<WithErrorSyntax::ErrorAsEnumResponse>());
+  }
+  auto _call_result = ::fidl::Call<ErrorAsEnumRequest, ErrorAsEnumResponse>(
+    this->channel_, std::move(_encode_request_result.message), std::move(response_buffer));
+  if (_call_result.status != ZX_OK) {
+    return ::fidl::DecodeResult<WithErrorSyntax::ErrorAsEnumResponse>(
+      _call_result.status,
+      _call_result.error,
+      ::fidl::DecodedMessage<WithErrorSyntax::ErrorAsEnumResponse>());
+  }
+  return ::fidl::Decode(std::move(_call_result.message));
+}
+
+
+bool WithErrorSyntax::TryDispatch(Interface* impl, fidl_msg_t* msg, ::fidl::Transaction* txn) {
+  if (msg->num_bytes < sizeof(fidl_message_header_t)) {
+    zx_handle_close_many(msg->handles, msg->num_handles);
+    txn->Close(ZX_ERR_INVALID_ARGS);
+    return true;
+  }
+  fidl_message_header_t* hdr = reinterpret_cast<fidl_message_header_t*>(msg->bytes);
+  switch (hdr->ordinal) {
+    case kWithErrorSyntax_ErrorAsPrimitive_Ordinal: {
+      auto result = ::fidl::DecodeAs<ErrorAsPrimitiveRequest>(msg);
+      if (result.status != ZX_OK) {
+        txn->Close(ZX_ERR_INVALID_ARGS);
+        return true;
+      }
+      impl->ErrorAsPrimitive(
+        Interface::ErrorAsPrimitiveCompleter::Sync(txn));
+      return true;
+    }
+    case kWithErrorSyntax_ErrorAsEnum_Ordinal: {
+      auto result = ::fidl::DecodeAs<ErrorAsEnumRequest>(msg);
+      if (result.status != ZX_OK) {
+        txn->Close(ZX_ERR_INVALID_ARGS);
+        return true;
+      }
+      impl->ErrorAsEnum(
+        Interface::ErrorAsEnumCompleter::Sync(txn));
+      return true;
+    }
+    default: {
+      return false;
+    }
+  }
+}
+
+bool WithErrorSyntax::Dispatch(Interface* impl, fidl_msg_t* msg, ::fidl::Transaction* txn) {
+  bool found = TryDispatch(impl, msg, txn);
+  if (!found) {
+    zx_handle_close_many(msg->handles, msg->num_handles);
+    txn->Close(ZX_ERR_NOT_SUPPORTED);
+  }
+  return found;
+}
+
+
+void WithErrorSyntax::Interface::ErrorAsPrimitiveCompleterBase::Reply(WithErrorSyntax_ErrorAsPrimitive_Result result) {
+  constexpr uint32_t _kWriteAllocSize = ::fidl::internal::ClampedMessageSize<ErrorAsPrimitiveResponse>();
+  FIDL_ALIGNDECL uint8_t _write_bytes[_kWriteAllocSize] = {};
+  auto& _response = *reinterpret_cast<ErrorAsPrimitiveResponse*>(_write_bytes);
+  _response._hdr.ordinal = kWithErrorSyntax_ErrorAsPrimitive_Ordinal;
+  _response.result = std::move(result);
+  ::fidl::BytePart _response_bytes(_write_bytes, _kWriteAllocSize, sizeof(ErrorAsPrimitiveResponse));
+  CompleterBase::SendReply(::fidl::DecodedMessage<ErrorAsPrimitiveResponse>(std::move(_response_bytes)));
+}
+
+void WithErrorSyntax::Interface::ErrorAsPrimitiveCompleterBase::Reply(::fidl::BytePart _buffer, WithErrorSyntax_ErrorAsPrimitive_Result result) {
+  if (_buffer.capacity() < ErrorAsPrimitiveResponse::PrimarySize) {
+    CompleterBase::Close(ZX_ERR_INTERNAL);
+    return;
+  }
+  auto& _response = *reinterpret_cast<ErrorAsPrimitiveResponse*>(_buffer.data());
+  _response._hdr.ordinal = kWithErrorSyntax_ErrorAsPrimitive_Ordinal;
+  _response.result = std::move(result);
+  _buffer.set_actual(sizeof(ErrorAsPrimitiveResponse));
+  CompleterBase::SendReply(::fidl::DecodedMessage<ErrorAsPrimitiveResponse>(std::move(_buffer)));
+}
+
+void WithErrorSyntax::Interface::ErrorAsPrimitiveCompleterBase::Reply(::fidl::DecodedMessage<ErrorAsPrimitiveResponse> params) {
+  params.message()->_hdr = {};
+  params.message()->_hdr.ordinal = kWithErrorSyntax_ErrorAsPrimitive_Ordinal;
+  CompleterBase::SendReply(std::move(params));
+}
+
+
+void WithErrorSyntax::Interface::ErrorAsEnumCompleterBase::Reply(WithErrorSyntax_ErrorAsEnum_Result result) {
+  constexpr uint32_t _kWriteAllocSize = ::fidl::internal::ClampedMessageSize<ErrorAsEnumResponse>();
+  FIDL_ALIGNDECL uint8_t _write_bytes[_kWriteAllocSize] = {};
+  auto& _response = *reinterpret_cast<ErrorAsEnumResponse*>(_write_bytes);
+  _response._hdr.ordinal = kWithErrorSyntax_ErrorAsEnum_Ordinal;
+  _response.result = std::move(result);
+  ::fidl::BytePart _response_bytes(_write_bytes, _kWriteAllocSize, sizeof(ErrorAsEnumResponse));
+  CompleterBase::SendReply(::fidl::DecodedMessage<ErrorAsEnumResponse>(std::move(_response_bytes)));
+}
+
+void WithErrorSyntax::Interface::ErrorAsEnumCompleterBase::Reply(::fidl::BytePart _buffer, WithErrorSyntax_ErrorAsEnum_Result result) {
+  if (_buffer.capacity() < ErrorAsEnumResponse::PrimarySize) {
+    CompleterBase::Close(ZX_ERR_INTERNAL);
+    return;
+  }
+  auto& _response = *reinterpret_cast<ErrorAsEnumResponse*>(_buffer.data());
+  _response._hdr.ordinal = kWithErrorSyntax_ErrorAsEnum_Ordinal;
+  _response.result = std::move(result);
+  _buffer.set_actual(sizeof(ErrorAsEnumResponse));
+  CompleterBase::SendReply(::fidl::DecodedMessage<ErrorAsEnumResponse>(std::move(_buffer)));
+}
+
+void WithErrorSyntax::Interface::ErrorAsEnumCompleterBase::Reply(::fidl::DecodedMessage<ErrorAsEnumResponse> params) {
+  params.message()->_hdr = {};
+  params.message()->_hdr.ordinal = kWithErrorSyntax_ErrorAsEnum_Ordinal;
+  CompleterBase::SendReply(std::move(params));
+}
+
+
 }  // namespace name
 }  // namespace test
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.h.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.h.golden
index 1464b95ac1fb2c1b45d19e4c171fdbc4d7703dac..a915085ba5a3aff985cec5100fa2bde33bfe69b7 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.h.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.llcpp.h.golden
@@ -15,11 +15,110 @@
 namespace test {
 namespace name {
 
+struct WithErrorSyntax_ErrorAsPrimitive_Response;
+struct WithErrorSyntax_ErrorAsPrimitive_Result;
+struct WithErrorSyntax_ErrorAsEnum_Response;
 class KitchenSink;
 class ChannelProtocol;
 class SocketControlProtocol;
 class OvernetInternalProtocol;
 class WithAndWithoutRequestResponse;
+enum class ErrorEnun : uint32_t {
+  ERR_FOO = 1,
+  ERR_BAR = 2,
+};
+
+
+struct WithErrorSyntax_ErrorAsEnum_Result;
+class WithErrorSyntax;
+
+
+
+struct WithErrorSyntax_ErrorAsPrimitive_Response {
+  static constexpr const fidl_type_t* Type = nullptr;
+  static constexpr uint32_t MaxNumHandles = 0;
+  static constexpr uint32_t PrimarySize = 1;
+  [[maybe_unused]]
+  static constexpr uint32_t MaxOutOfLine = 0;
+
+  uint8_t __reserved = 0;
+};
+
+extern "C" const fidl_type_t test_name_WithErrorSyntax_ErrorAsPrimitive_ResultTable;
+
+struct WithErrorSyntax_ErrorAsPrimitive_Result {
+  enum class Tag : fidl_union_tag_t {
+    kResponse = 0,
+    kErr = 1,
+    Invalid = ::std::numeric_limits<::fidl_union_tag_t>::max(),
+  };
+
+  WithErrorSyntax_ErrorAsPrimitive_Result();
+  ~WithErrorSyntax_ErrorAsPrimitive_Result();
+
+  bool has_invalid_tag() const { return tag_ == Tag::Invalid; }
+
+  bool is_response() const { return tag_ == Tag::kResponse; }
+
+  WithErrorSyntax_ErrorAsPrimitive_Response& mutable_response() {
+    if (which() != Tag::kResponse) {
+      Destroy();
+    }
+    tag_ = Tag::kResponse;
+    return response_;
+  }
+
+  void set_response(WithErrorSyntax_ErrorAsPrimitive_Response const & v) {
+    mutable_response() = v;
+  }
+
+  WithErrorSyntax_ErrorAsPrimitive_Response const & response() const { return response_; }
+
+  bool is_err() const { return tag_ == Tag::kErr; }
+
+  uint32_t& mutable_err() {
+    if (which() != Tag::kErr) {
+      Destroy();
+    }
+    tag_ = Tag::kErr;
+    return err_;
+  }
+
+  void set_err(uint32_t const & v) {
+    mutable_err() = v;
+  }
+
+  uint32_t const & err() const { return err_; }
+
+  Tag which() const { return tag_; }
+
+  static constexpr const fidl_type_t* Type = &test_name_WithErrorSyntax_ErrorAsPrimitive_ResultTable;
+  static constexpr uint32_t MaxNumHandles = 0;
+  static constexpr uint32_t PrimarySize = 8;
+  [[maybe_unused]]
+  static constexpr uint32_t MaxOutOfLine = 0;
+
+ private:
+  void Destroy();
+  static void SizeAndOffsetAssertionHelper();
+  Tag tag_;
+  union {
+    WithErrorSyntax_ErrorAsPrimitive_Response response_;
+    uint32_t err_;
+  };
+};
+
+
+
+struct WithErrorSyntax_ErrorAsEnum_Response {
+  static constexpr const fidl_type_t* Type = nullptr;
+  static constexpr uint32_t MaxNumHandles = 0;
+  static constexpr uint32_t PrimarySize = 1;
+  [[maybe_unused]]
+  static constexpr uint32_t MaxOutOfLine = 0;
+
+  uint8_t __reserved = 0;
+};
 
 
 class KitchenSink final {
@@ -781,11 +880,204 @@ class WithAndWithoutRequestResponse final {
 
 };
 
+extern "C" const fidl_type_t test_name_WithErrorSyntax_ErrorAsEnum_ResultTable;
+
+struct WithErrorSyntax_ErrorAsEnum_Result {
+  enum class Tag : fidl_union_tag_t {
+    kResponse = 0,
+    kErr = 1,
+    Invalid = ::std::numeric_limits<::fidl_union_tag_t>::max(),
+  };
+
+  WithErrorSyntax_ErrorAsEnum_Result();
+  ~WithErrorSyntax_ErrorAsEnum_Result();
+
+  bool has_invalid_tag() const { return tag_ == Tag::Invalid; }
+
+  bool is_response() const { return tag_ == Tag::kResponse; }
+
+  WithErrorSyntax_ErrorAsEnum_Response& mutable_response() {
+    if (which() != Tag::kResponse) {
+      Destroy();
+    }
+    tag_ = Tag::kResponse;
+    return response_;
+  }
+
+  void set_response(WithErrorSyntax_ErrorAsEnum_Response const & v) {
+    mutable_response() = v;
+  }
+
+  WithErrorSyntax_ErrorAsEnum_Response const & response() const { return response_; }
+
+  bool is_err() const { return tag_ == Tag::kErr; }
+
+  ErrorEnun& mutable_err() {
+    if (which() != Tag::kErr) {
+      Destroy();
+    }
+    tag_ = Tag::kErr;
+    return err_;
+  }
+
+  void set_err(ErrorEnun const & v) {
+    mutable_err() = v;
+  }
+
+  ErrorEnun const & err() const { return err_; }
+
+  Tag which() const { return tag_; }
+
+  static constexpr const fidl_type_t* Type = &test_name_WithErrorSyntax_ErrorAsEnum_ResultTable;
+  static constexpr uint32_t MaxNumHandles = 0;
+  static constexpr uint32_t PrimarySize = 8;
+  [[maybe_unused]]
+  static constexpr uint32_t MaxOutOfLine = 0;
+
+ private:
+  void Destroy();
+  static void SizeAndOffsetAssertionHelper();
+  Tag tag_;
+  union {
+    WithErrorSyntax_ErrorAsEnum_Response response_;
+    ErrorEnun err_;
+  };
+};
+
+
+class WithErrorSyntax final {
+ public:
+
+  struct ErrorAsPrimitiveResponse {
+    FIDL_ALIGNDECL
+    fidl_message_header_t _hdr;
+    WithErrorSyntax_ErrorAsPrimitive_Result result;
+
+    static constexpr const fidl_type_t* Type = nullptr;
+    static constexpr uint32_t MaxNumHandles = 0;
+    static constexpr uint32_t PrimarySize = 24;
+    static constexpr uint32_t MaxOutOfLine = 0;
+  };
+  using ErrorAsPrimitiveRequest = ::fidl::AnyZeroArgMessage;
+
+  struct ErrorAsEnumResponse {
+    FIDL_ALIGNDECL
+    fidl_message_header_t _hdr;
+    WithErrorSyntax_ErrorAsEnum_Result result;
+
+    static constexpr const fidl_type_t* Type = nullptr;
+    static constexpr uint32_t MaxNumHandles = 0;
+    static constexpr uint32_t PrimarySize = 24;
+    static constexpr uint32_t MaxOutOfLine = 0;
+  };
+  using ErrorAsEnumRequest = ::fidl::AnyZeroArgMessage;
+
+
+  class SyncClient final {
+   public:
+    SyncClient(::zx::channel channel) : channel_(std::move(channel)) {}
+
+    ~SyncClient() {}
+
+    zx_status_t ErrorAsPrimitive(WithErrorSyntax_ErrorAsPrimitive_Result* out_result);
+
+    // Caller provides the backing storage for FIDL message via request and response buffers.
+    zx_status_t ErrorAsPrimitive(::fidl::BytePart _response_buffer, WithErrorSyntax_ErrorAsPrimitive_Result* out_result);
+
+    // Messages are encoded and decoded in-place.
+    ::fidl::DecodeResult<ErrorAsPrimitiveResponse> ErrorAsPrimitive(::fidl::BytePart response_buffer);
+
+    zx_status_t ErrorAsEnum(WithErrorSyntax_ErrorAsEnum_Result* out_result);
+
+    // Caller provides the backing storage for FIDL message via request and response buffers.
+    zx_status_t ErrorAsEnum(::fidl::BytePart _response_buffer, WithErrorSyntax_ErrorAsEnum_Result* out_result);
+
+    // Messages are encoded and decoded in-place.
+    ::fidl::DecodeResult<ErrorAsEnumResponse> ErrorAsEnum(::fidl::BytePart response_buffer);
+
+   private:
+    ::zx::channel channel_;
+  };
+
+  // Pure-virtual interface to be implemented by a server.
+  class Interface {
+   public:
+    Interface() = default;
+    virtual ~Interface() = default;
+    using _Outer = WithErrorSyntax;
+    using _Base = ::fidl::CompleterBase;
+
+    class ErrorAsPrimitiveCompleterBase : public _Base {
+     public:
+      void Reply(WithErrorSyntax_ErrorAsPrimitive_Result result);
+      void Reply(::fidl::BytePart _buffer, WithErrorSyntax_ErrorAsPrimitive_Result result);
+      void Reply(::fidl::DecodedMessage<ErrorAsPrimitiveResponse> params);
+
+     protected:
+      using ::fidl::CompleterBase::CompleterBase;
+    };
+
+    using ErrorAsPrimitiveCompleter = ::fidl::Completer<ErrorAsPrimitiveCompleterBase>;
+
+    virtual void ErrorAsPrimitive(ErrorAsPrimitiveCompleter::Sync _completer) = 0;
+
+    class ErrorAsEnumCompleterBase : public _Base {
+     public:
+      void Reply(WithErrorSyntax_ErrorAsEnum_Result result);
+      void Reply(::fidl::BytePart _buffer, WithErrorSyntax_ErrorAsEnum_Result result);
+      void Reply(::fidl::DecodedMessage<ErrorAsEnumResponse> params);
+
+     protected:
+      using ::fidl::CompleterBase::CompleterBase;
+    };
+
+    using ErrorAsEnumCompleter = ::fidl::Completer<ErrorAsEnumCompleterBase>;
+
+    virtual void ErrorAsEnum(ErrorAsEnumCompleter::Sync _completer) = 0;
+
+  };
+
+  // Attempts to dispatch the incoming message to a handler function in the server implementation.
+  // If there is no matching handler, it returns false, leaving the message and transaction intact.
+  // In all other cases, it consumes the message and returns true.
+  // It is possible to chain multiple TryDispatch functions in this manner.
+  static bool TryDispatch(Interface* impl, fidl_msg_t* msg, ::fidl::Transaction* txn);
+
+  // Dispatches the incoming message to one of the handlers functions in the interface.
+  // If there is no matching handler, it closes all the handles in |msg| and closes the channel with
+  // a |ZX_ERR_NOT_SUPPORTED| epitaph, before returning false. The message should then be discarded.
+  static bool Dispatch(Interface* impl, fidl_msg_t* msg, ::fidl::Transaction* txn);
+
+  // Same as |Dispatch|, but takes a |void*| instead of |Interface*|. Only used with |fidl::Bind|
+  // to reduce template expansion.
+  // Do not call this method manually. Use |Dispatch| instead.
+  static bool TypeErasedDispatch(void* impl, fidl_msg_t* msg, ::fidl::Transaction* txn) {
+    return Dispatch(static_cast<Interface*>(impl), msg, txn);
+  }
+
+};
+
 }  // namespace name
 }  // namespace test
 
 namespace fidl {
 
+template <>
+struct IsFidlType<::test::name::WithErrorSyntax_ErrorAsPrimitive_Response> : public std::true_type {};
+static_assert(std::is_standard_layout_v<::test::name::WithErrorSyntax_ErrorAsPrimitive_Response>);
+static_assert(offsetof(::test::name::WithErrorSyntax_ErrorAsPrimitive_Response, __reserved) == 0);
+static_assert(sizeof(::test::name::WithErrorSyntax_ErrorAsPrimitive_Response) == ::test::name::WithErrorSyntax_ErrorAsPrimitive_Response::PrimarySize);
+
+template <>
+struct IsFidlType<::test::name::WithErrorSyntax_ErrorAsPrimitive_Result> : public std::true_type {};
+static_assert(std::is_standard_layout_v<::test::name::WithErrorSyntax_ErrorAsPrimitive_Result>);
+
+template <>
+struct IsFidlType<::test::name::WithErrorSyntax_ErrorAsEnum_Response> : public std::true_type {};
+static_assert(std::is_standard_layout_v<::test::name::WithErrorSyntax_ErrorAsEnum_Response>);
+static_assert(offsetof(::test::name::WithErrorSyntax_ErrorAsEnum_Response, __reserved) == 0);
+static_assert(sizeof(::test::name::WithErrorSyntax_ErrorAsEnum_Response) == ::test::name::WithErrorSyntax_ErrorAsEnum_Response::PrimarySize);
+
 template <>
 struct IsFidlType<::test::name::KitchenSink::MethodARequest> : public std::true_type {};
 template <>
@@ -974,4 +1266,24 @@ static_assert(sizeof(::test::name::WithAndWithoutRequestResponse::OnWithResponse
     == ::test::name::WithAndWithoutRequestResponse::OnWithResponseResponse::PrimarySize);
 static_assert(offsetof(::test::name::WithAndWithoutRequestResponse::OnWithResponseResponse, ret) == 16);
 
+template <>
+struct IsFidlType<::test::name::WithErrorSyntax_ErrorAsEnum_Result> : public std::true_type {};
+static_assert(std::is_standard_layout_v<::test::name::WithErrorSyntax_ErrorAsEnum_Result>);
+
+template <>
+struct IsFidlType<::test::name::WithErrorSyntax::ErrorAsPrimitiveResponse> : public std::true_type {};
+template <>
+struct IsFidlMessage<::test::name::WithErrorSyntax::ErrorAsPrimitiveResponse> : public std::true_type {};
+static_assert(sizeof(::test::name::WithErrorSyntax::ErrorAsPrimitiveResponse)
+    == ::test::name::WithErrorSyntax::ErrorAsPrimitiveResponse::PrimarySize);
+static_assert(offsetof(::test::name::WithErrorSyntax::ErrorAsPrimitiveResponse, result) == 16);
+
+template <>
+struct IsFidlType<::test::name::WithErrorSyntax::ErrorAsEnumResponse> : public std::true_type {};
+template <>
+struct IsFidlMessage<::test::name::WithErrorSyntax::ErrorAsEnumResponse> : public std::true_type {};
+static_assert(sizeof(::test::name::WithErrorSyntax::ErrorAsEnumResponse)
+    == ::test::name::WithErrorSyntax::ErrorAsEnumResponse::PrimarySize);
+static_assert(offsetof(::test::name::WithErrorSyntax::ErrorAsEnumResponse, result) == 16);
+
 }  // namespace fidl
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.cc.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.cc.golden
index fb9b26c2b45de7e013f0d193512f54c3fecddcea..7c8279bd59994870b894dfaacca1ecd41a7e7ac5 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.cc.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.cc.golden
@@ -4,6 +4,9 @@
   namespace test {
   namespace name {
   
+  
+  
+  
       
         
 namespace {
@@ -264,5 +267,9 @@ void OvernetInternalProtocol_Stub::EventA(int64_t a, int64_t b) {
   
       
   
+  
+  
+      
+  
   }  // namespace name
   }  // namespace test
\ No newline at end of file
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.h.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.h.golden
index d98f9f21c56493d676d4d5071dc32036840eefd8..87d5c98a5d7fbbebc2abb23ce925334f4861b243 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.h.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.overnet_internal.h.golden
@@ -5,6 +5,9 @@
   namespace test {
   namespace name {
   
+  
+  
+  
       
         
 class KitchenSink;
@@ -26,6 +29,13 @@ class OvernetInternalProtocol_Stub;
       
   
   
+  
+      
+  
+  
+  
+  
+  
       
         
 
@@ -117,6 +127,13 @@ class OvernetInternalProtocol_Stub : public ::overnet::FidlStream, public Overne
       
   
   
+  
+      
+  
+  
+  
+  
+  
       
         
       
@@ -128,6 +145,10 @@ class OvernetInternalProtocol_Stub : public ::overnet::FidlStream, public Overne
       
         
       
+  
+      
+  
+  
   
       
   
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden
index 95d0930616e80d542735b20acbe2bdf97a13710a..d86201adbceff560524e95185d6a20d9cadffb02 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden
@@ -22,6 +22,30 @@ use fidl::{
 };
 
 
+fidl_enum! {
+  ErrorEnun(u32) {
+    ErrFoo = 1,
+    ErrBar = 2,
+  }
+}
+
+
+type WithErrorSyntaxErrorAsPrimitiveResult = std::result::Result< WithErrorSyntaxErrorAsPrimitiveResponse , u32 >;
+
+
+type WithErrorSyntaxErrorAsEnumResult = std::result::Result< WithErrorSyntaxErrorAsEnumResponse , ErrorEnun >;
+
+
+
+fidl_empty_struct!(
+	WithErrorSyntaxErrorAsPrimitiveResponse
+);
+
+
+fidl_empty_struct!(
+	WithErrorSyntaxErrorAsEnumResponse
+);
+
 
 #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
 pub struct WithAndWithoutRequestResponseMarker;
@@ -1431,6 +1455,748 @@ impl WithAndWithoutRequestResponseWithRequestWithResponseResponder {
 }
 
 
+#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
+pub struct WithErrorSyntaxMarker;
+
+impl fidl::endpoints::ServiceMarker for WithErrorSyntaxMarker {
+	type Proxy = WithErrorSyntaxProxy;
+	type RequestStream = WithErrorSyntaxRequestStream;
+	const NAME: &'static str = "";
+}
+
+pub trait WithErrorSyntaxProxyInterface: Send + Sync {
+	type ErrorAsPrimitiveResponseFut: futures::Future<Output = Result<(WithErrorSyntaxErrorAsPrimitiveResult), fidl::Error>> + Send;
+	fn error_as_primitive(&self,
+	)-> Self::ErrorAsPrimitiveResponseFut;
+	type ErrorAsEnumResponseFut: futures::Future<Output = Result<(WithErrorSyntaxErrorAsEnumResult), fidl::Error>> + Send;
+	fn error_as_enum(&self,
+	)-> Self::ErrorAsEnumResponseFut;
+}
+
+#[derive(Debug)]
+pub struct WithErrorSyntaxSynchronousProxy {
+	client: fidl::client::sync::Client,
+}
+
+impl WithErrorSyntaxSynchronousProxy {
+	pub fn new(channel: zx::Channel) -> Self {
+		Self { client: fidl::client::sync::Client::new(channel) }
+	}
+
+	pub fn into_channel(self) -> zx::Channel {
+		self.client.into_channel()
+	}
+	pub fn error_as_primitive(&mut self,___deadline: zx::Time,) -> Result<(WithErrorSyntaxErrorAsPrimitiveResult), fidl::Error> {self.client.send_query(&mut (),
+				2069369145,
+				___deadline,
+			)}
+	pub fn error_as_enum(&mut self,___deadline: zx::Time,) -> Result<(WithErrorSyntaxErrorAsEnumResult), fidl::Error> {self.client.send_query(&mut (),
+				1284890143,
+				___deadline,
+			)}
+}
+
+#[derive(Debug, Clone)]
+pub struct WithErrorSyntaxProxy {
+	client: fidl::client::Client,
+}
+
+impl fidl::endpoints::Proxy for WithErrorSyntaxProxy {
+	type Service = WithErrorSyntaxMarker;
+	fn from_channel(inner: ::fuchsia_async::Channel) -> Self {
+		Self::new(inner)
+	}
+}
+
+impl ::std::ops::Deref for WithErrorSyntaxProxy {
+	type Target = fidl::client::Client;
+
+	fn deref(&self) -> &Self::Target {
+		&self.client
+	}
+}
+
+/// Proxy object for communicating with interface WithErrorSyntax
+impl WithErrorSyntaxProxy {
+	/// Create a new Proxy for WithErrorSyntax
+	pub fn new(channel: ::fuchsia_async::Channel) -> Self {
+		Self { client: fidl::client::Client::new(channel) }
+	}
+
+	/// Attempt to convert the Proxy back into a channel.
+	///
+	/// This will only succeed if there are no active clones of this Proxy
+	/// and no currently-alive EventStream or response futures that came from
+	/// this Proxy.
+	pub fn into_channel(self) -> Result<::fuchsia_async::Channel, Self> {
+		self.client.into_channel().map_err(|client| Self { client })
+	}
+
+	/// Get a Stream of events from the remote end of the WithErrorSyntax interface
+	pub fn take_event_stream(&self) -> WithErrorSyntaxEventStream {
+		WithErrorSyntaxEventStream {
+			event_receiver: self.client.take_event_receiver(),
+		}
+	}
+	pub fn error_as_primitive(&self,
+	)-> fidl::client::QueryResponseFut<(WithErrorSyntaxErrorAsPrimitiveResult)> {
+		WithErrorSyntaxProxyInterface::error_as_primitive(self,
+		)
+	}
+	pub fn error_as_enum(&self,
+	)-> fidl::client::QueryResponseFut<(WithErrorSyntaxErrorAsEnumResult)> {
+		WithErrorSyntaxProxyInterface::error_as_enum(self,
+		)
+	}
+}
+
+impl WithErrorSyntaxProxyInterface for WithErrorSyntaxProxy {
+	type ErrorAsPrimitiveResponseFut = fidl::client::QueryResponseFut<(WithErrorSyntaxErrorAsPrimitiveResult)>;
+	fn error_as_primitive(&self,
+	)-> Self::ErrorAsPrimitiveResponseFut {
+		self.client.send_query(&mut (), 2069369145)
+	}
+	type ErrorAsEnumResponseFut = fidl::client::QueryResponseFut<(WithErrorSyntaxErrorAsEnumResult)>;
+	fn error_as_enum(&self,
+	)-> Self::ErrorAsEnumResponseFut {
+		self.client.send_query(&mut (), 1284890143)
+	}}
+
+pub struct WithErrorSyntaxEventStream {
+	event_receiver: fidl::client::EventReceiver,
+}
+
+impl ::std::marker::Unpin for WithErrorSyntaxEventStream {}
+
+impl futures::stream::FusedStream for WithErrorSyntaxEventStream {
+	fn is_terminated(&self) -> bool {
+		self.event_receiver.is_terminated()
+	}
+}
+
+impl futures::Stream for WithErrorSyntaxEventStream {
+	type Item = Result<WithErrorSyntaxEvent, fidl::Error>;
+
+	fn poll_next(mut self: ::std::pin::Pin<&mut Self>, lw: &futures::task::Waker)
+		-> futures::Poll<Option<Self::Item>>
+	{
+		let mut buf = match futures::ready!(
+			futures::stream::StreamExt::poll_next_unpin(&mut self.event_receiver, lw)?
+		) {
+			Some(buf) => buf,
+			None => return futures::Poll::Ready(None),
+		};
+		let (bytes, _handles) = buf.split_mut();
+		let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
+
+		#[allow(unreachable_patterns)] // GenOrdinal and Ordinal can overlap
+		futures::Poll::Ready(Some(match tx_header.ordinal {
+			_ => Err(fidl::Error::UnknownOrdinal {
+				ordinal: tx_header.ordinal,
+				service_name: <WithErrorSyntaxMarker as fidl::endpoints::ServiceMarker>::NAME,
+			})
+		}))
+	}
+}
+
+#[derive(Debug)]
+pub enum WithErrorSyntaxEvent {
+	
+	
+	}
+
+pub struct WithErrorSyntaxEventSender<'a> {
+	// Some protocols don't define events which would render this channel unused.
+	#[allow(unused)]
+	channel: zx::Unowned<'a, zx::Channel>,
+}
+impl <'a> WithErrorSyntaxEventSender<'a> {
+	pub fn new(channel: zx::Unowned<'a, zx::Channel>) -> Self {
+		Self { channel }
+	}
+}
+
+#[deprecated(note = "use WithErrorSyntaxRequestStream instead")]
+pub trait WithErrorSyntax {
+	type OnOpenFut: futures::Future<Output = ()> + Send;
+	fn on_open(&mut self, control_handle: WithErrorSyntaxControlHandle) -> Self::OnOpenFut;
+	type ErrorAsPrimitiveFut: futures::Future<Output = ()> + Send;
+	fn error_as_primitive (&mut self,
+		response_chan: WithErrorSyntaxErrorAsPrimitiveResponder,
+	) -> Self::ErrorAsPrimitiveFut;
+	
+	type ErrorAsEnumFut: futures::Future<Output = ()> + Send;
+	fn error_as_enum (&mut self,
+		response_chan: WithErrorSyntaxErrorAsEnumResponder,
+	) -> Self::ErrorAsEnumFut;
+	
+
+	fn serve(mut self, channel: ::fuchsia_async::Channel)
+		-> WithErrorSyntaxServer<Self>
+	where Self: Sized
+	{
+		let inner = ::std::sync::Arc::new(fidl::ServeInner::new(channel));
+		let on_open_fut = self.on_open(
+			WithErrorSyntaxControlHandle {
+				inner: inner.clone(),
+			}
+		);
+		WithErrorSyntaxServer {
+			server: self,
+			inner: inner.clone(),
+			on_open_fut: Some(on_open_fut),error_as_primitive_futures: futures::stream::FuturesUnordered::new(),error_as_enum_futures: futures::stream::FuturesUnordered::new(),
+		}
+	}
+}
+
+pub struct WithErrorSyntaxServer<T: WithErrorSyntax> {
+	#[allow(dead_code)] // not used if no methods are present
+	server: T,
+	inner: ::std::sync::Arc<fidl::ServeInner>,
+	on_open_fut: Option<T::OnOpenFut>,error_as_primitive_futures: futures::stream::FuturesUnordered<T::ErrorAsPrimitiveFut>,error_as_enum_futures: futures::stream::FuturesUnordered<T::ErrorAsEnumFut>,
+}
+
+// Safety: only the OnOpen fut is held directly, so it's the only one that
+// is projected to, so it's the only one that needs to be Unpin for the Impl
+// struct to be Unpin.
+impl<T: WithErrorSyntax> ::std::marker::Unpin for WithErrorSyntaxServer<T>
+where T::OnOpenFut: ::std::marker::Unpin,
+{}
+
+impl<T: WithErrorSyntax> WithErrorSyntaxServer<T> {
+	pub fn control_handle(&self) -> WithErrorSyntaxControlHandle {
+		WithErrorSyntaxControlHandle {
+			inner: self.inner.clone(),
+		}
+	}
+}
+
+impl<T: WithErrorSyntax> futures::Future for WithErrorSyntaxServer<T> {
+	type Output = Result<(), fidl::Error>;
+
+	fn poll(
+		mut self: ::std::pin::Pin<&mut Self>,
+		lw: &futures::task::Waker,
+	) -> futures::Poll<Self::Output> {
+		// safety: the only potentially !Unpin field is on_open_fut, which we make sure
+		// isn't moved below
+		let this = unsafe { ::std::pin::Pin::get_unchecked_mut(self) };
+		loop {
+		let mut made_progress_this_loop_iter = false;
+
+		if this.inner.poll_shutdown(lw) {
+			return futures::Poll::Ready(Ok(()));
+		}
+
+		unsafe {
+			// Safety: ensure that on_open isn't moved
+			let completed_on_open = if let Some(on_open_fut) = &mut this.on_open_fut {
+				match futures::Future::poll(::std::pin::Pin::new_unchecked(on_open_fut), lw) {
+					futures::Poll::Ready(()) => true,
+					futures::Poll::Pending => false,
+				}
+			} else {
+				false
+			};
+
+			if completed_on_open {
+				made_progress_this_loop_iter = true;
+				this.on_open_fut = None;
+			}
+		}match futures::stream::StreamExt::poll_next_unpin(
+			&mut this.error_as_primitive_futures, lw
+		) {
+			futures::Poll::Ready(Some(())) => made_progress_this_loop_iter = true,
+			_ => {},
+		}match futures::stream::StreamExt::poll_next_unpin(
+			&mut this.error_as_enum_futures, lw
+		) {
+			futures::Poll::Ready(Some(())) => made_progress_this_loop_iter = true,
+			_ => {},
+		}
+
+		let poll_done = ::fidl::encoding::with_tls_coding_bufs(|bytes, handles| {
+			match ::futures::ready!(this.inner.channel().read(bytes, handles, lw)) {
+				Ok(()) => {},
+				Err(zx::Status::PEER_CLOSED) => return futures::Poll::Ready(Ok(true)),
+				Err(e) => return futures::Poll::Ready(Err(fidl::Error::ServerRequestRead(e))),
+			}
+
+			{
+				// A message has been received from the channel
+				let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
+
+				#[allow(unreachable_patterns)] // GenOrdinal and Ordinal can overlap
+				match header.ordinal {
+						2069369145 | 2069369145 => {
+							let mut req: () = fidl::encoding::Decodable::new_empty();
+							fidl::encoding::Decoder::decode_into(_body_bytes, handles, &mut req)?;
+							let control_handle = WithErrorSyntaxControlHandle {
+								inner: this.inner.clone(),
+							};
+							this.error_as_primitive_futures.push(
+								this.server.error_as_primitive(WithErrorSyntaxErrorAsPrimitiveResponder {
+											control_handle: ::std::mem::ManuallyDrop::new(control_handle),
+											tx_id: header.tx_id,
+											ordinal: header.ordinal,
+										})
+							);
+							::futures::Poll::Ready(Ok(false))
+						}
+						1284890143 | 1284890143 => {
+							let mut req: () = fidl::encoding::Decodable::new_empty();
+							fidl::encoding::Decoder::decode_into(_body_bytes, handles, &mut req)?;
+							let control_handle = WithErrorSyntaxControlHandle {
+								inner: this.inner.clone(),
+							};
+							this.error_as_enum_futures.push(
+								this.server.error_as_enum(WithErrorSyntaxErrorAsEnumResponder {
+											control_handle: ::std::mem::ManuallyDrop::new(control_handle),
+											tx_id: header.tx_id,
+											ordinal: header.ordinal,
+										})
+							);
+							::futures::Poll::Ready(Ok(false))
+						}
+					// TODO(cramertj) handle control/fileio messages
+					_ => return futures::Poll::Ready(Err(fidl::Error::UnknownOrdinal {
+						ordinal: header.ordinal,
+						service_name: "unknown fidl", // TODO(cramertj)
+					})),
+				}
+			}
+		})?;
+
+		match poll_done {
+			::futures::Poll::Ready(true) => return ::futures::Poll::Ready(Ok(())),
+			::futures::Poll::Ready(false) => {},
+			::futures::Poll::Pending if made_progress_this_loop_iter => {}, // continue
+			::futures::Poll::Pending => return ::futures::Poll::Pending,
+		}
+	}}
+}
+
+/// A Stream of incoming requests for WithErrorSyntax
+pub struct WithErrorSyntaxRequestStream {
+	inner: ::std::sync::Arc<fidl::ServeInner>,
+	is_terminated: bool,
+}
+
+impl ::std::marker::Unpin for WithErrorSyntaxRequestStream {}
+
+impl futures::stream::FusedStream for WithErrorSyntaxRequestStream {
+	fn is_terminated(&self) -> bool {
+		self.is_terminated
+	}
+}
+
+impl fidl::endpoints::RequestStream for WithErrorSyntaxRequestStream {
+	type Service = WithErrorSyntaxMarker;
+
+	/// Consume a channel to make a WithErrorSyntaxRequestStream
+	fn from_channel(channel: ::fuchsia_async::Channel) -> Self {
+		Self {
+			inner: ::std::sync::Arc::new(fidl::ServeInner::new(channel)),
+			is_terminated: false,
+		}
+	}
+
+	/// ControlHandle for the remote connection
+	type ControlHandle = WithErrorSyntaxControlHandle;
+
+	/// ControlHandle for the remote connection
+	fn control_handle(&self) -> Self::ControlHandle {
+		WithErrorSyntaxControlHandle { 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 WithErrorSyntaxRequestStream {
+	type Item = Result<WithErrorSyntaxRequest, fidl::Error>;
+
+	fn poll_next(mut self: ::std::pin::Pin<&mut Self>, lw: &futures::task::Waker)
+		-> futures::Poll<Option<Self::Item>>
+	{
+		let this = &mut *self;
+		if this.inner.poll_shutdown(lw) {
+			this.is_terminated = true;
+			return futures::Poll::Ready(None);
+		}
+		if this.is_terminated {
+			panic!("polled WithErrorSyntaxRequestStream after completion");
+		}
+		::fidl::encoding::with_tls_coding_bufs(|bytes, handles| {
+			match this.inner.channel().read(bytes, handles, lw) {
+				futures::Poll::Ready(Ok(())) => {},
+				futures::Poll::Pending => return futures::Poll::Pending,
+				futures::Poll::Ready(Err(zx::Status::PEER_CLOSED)) => {
+					this.is_terminated = true;
+					return futures::Poll::Ready(None)
+				},
+				futures::Poll::Ready(Err(e)) =>
+				return futures::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)?;
+
+			#[allow(unreachable_patterns)] // GenOrdinal and Ordinal can overlap
+			futures::Poll::Ready(Some(match header.ordinal {
+				2069369145 | 2069369145 => {
+					let mut req: () = fidl::encoding::Decodable::new_empty();
+					fidl::encoding::Decoder::decode_into(_body_bytes, handles, &mut req)?;
+					let control_handle = WithErrorSyntaxControlHandle {
+						inner: this.inner.clone(),
+					};
+
+					Ok(WithErrorSyntaxRequest::ErrorAsPrimitive {responder:WithErrorSyntaxErrorAsPrimitiveResponder {
+								control_handle: ::std::mem::ManuallyDrop::new(control_handle),
+								tx_id: header.tx_id,
+								ordinal: header.ordinal,
+							},})
+				}
+				1284890143 | 1284890143 => {
+					let mut req: () = fidl::encoding::Decodable::new_empty();
+					fidl::encoding::Decoder::decode_into(_body_bytes, handles, &mut req)?;
+					let control_handle = WithErrorSyntaxControlHandle {
+						inner: this.inner.clone(),
+					};
+
+					Ok(WithErrorSyntaxRequest::ErrorAsEnum {responder:WithErrorSyntaxErrorAsEnumResponder {
+								control_handle: ::std::mem::ManuallyDrop::new(control_handle),
+								tx_id: header.tx_id,
+								ordinal: header.ordinal,
+							},})
+				}
+				_ => Err(fidl::Error::UnknownOrdinal {
+					ordinal: header.ordinal,
+					service_name: <WithErrorSyntaxMarker as fidl::endpoints::ServiceMarker>::NAME,
+				}),
+			}))
+		})
+	}
+}
+pub enum WithErrorSyntaxRequest {
+	ErrorAsPrimitive {
+		responder: WithErrorSyntaxErrorAsPrimitiveResponder,},
+	ErrorAsEnum {
+		responder: WithErrorSyntaxErrorAsEnumResponder,},
+}
+
+pub struct WithErrorSyntaxEncoder;
+impl WithErrorSyntaxEncoder {
+	pub fn encode_error_as_primitive_request<'a>(
+		out_bytes: &'a mut Vec<u8>,
+		out_handles: &'a mut Vec<zx::Handle>,
+		tx_id: u32,) -> Result<(), fidl::Error> {
+		let header = fidl::encoding::TransactionHeader {
+			tx_id,flags: 0,
+			ordinal: 2069369145,
+		};
+		let mut body = ();
+		let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };
+		fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
+		Ok(())
+	}
+	pub fn encode_error_as_primitive_response<'a>(
+		out_bytes: &'a mut Vec<u8>,
+		out_handles: &'a mut Vec<zx::Handle>,
+		tx_id: u32,mut in_result: &mut WithErrorSyntaxErrorAsPrimitiveResult,) -> Result<(), fidl::Error> {
+		let header = fidl::encoding::TransactionHeader {
+			tx_id,flags: 0,
+			ordinal: 2069369145,
+		};
+		let mut body = (in_result,);
+		let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };
+		fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
+		Ok(())
+	}
+	pub fn encode_error_as_enum_request<'a>(
+		out_bytes: &'a mut Vec<u8>,
+		out_handles: &'a mut Vec<zx::Handle>,
+		tx_id: u32,) -> Result<(), fidl::Error> {
+		let header = fidl::encoding::TransactionHeader {
+			tx_id,flags: 0,
+			ordinal: 1284890143,
+		};
+		let mut body = ();
+		let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };
+		fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
+		Ok(())
+	}
+	pub fn encode_error_as_enum_response<'a>(
+		out_bytes: &'a mut Vec<u8>,
+		out_handles: &'a mut Vec<zx::Handle>,
+		tx_id: u32,mut in_result: &mut WithErrorSyntaxErrorAsEnumResult,) -> Result<(), fidl::Error> {
+		let header = fidl::encoding::TransactionHeader {
+			tx_id,flags: 0,
+			ordinal: 1284890143,
+		};
+		let mut body = (in_result,);
+		let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };
+		fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
+		Ok(())
+	}}
+
+#[deprecated(note = "use WithErrorSyntaxRequestStream instead")]
+pub struct WithErrorSyntaxImpl<
+	State,
+OnOpen: FnMut(&mut State, WithErrorSyntaxControlHandle) -> OnOpenFut,
+OnOpenFut: futures::Future<Output = ()> + Send,
+	ErrorAsPrimitive: FnMut(&mut State,WithErrorSyntaxErrorAsPrimitiveResponder) -> ErrorAsPrimitiveFut,
+	ErrorAsPrimitiveFut: futures::Future<Output = ()> + Send,
+	ErrorAsEnum: FnMut(&mut State,WithErrorSyntaxErrorAsEnumResponder) -> ErrorAsEnumFut,
+	ErrorAsEnumFut: futures::Future<Output = ()> + Send,
+> {
+	pub state: State,
+	pub on_open: OnOpen,
+	pub error_as_primitive: ErrorAsPrimitive,
+	pub error_as_enum: ErrorAsEnum,
+}
+
+// Unpin is never projected for the Impl struct
+impl<
+	State,
+OnOpen: FnMut(&mut State, WithErrorSyntaxControlHandle) -> OnOpenFut,
+OnOpenFut: futures::Future<Output = ()> + Send,
+	ErrorAsPrimitive: FnMut(&mut State,WithErrorSyntaxErrorAsPrimitiveResponder) -> ErrorAsPrimitiveFut,
+	ErrorAsPrimitiveFut: futures::Future<Output = ()> + Send,
+	ErrorAsEnum: FnMut(&mut State,WithErrorSyntaxErrorAsEnumResponder) -> ErrorAsEnumFut,
+	ErrorAsEnumFut: futures::Future<Output = ()> + Send,
+> ::std::marker::Unpin for WithErrorSyntaxImpl<State, OnOpen, OnOpenFut,
+	ErrorAsPrimitive,
+	ErrorAsPrimitiveFut,
+	ErrorAsEnum,
+	ErrorAsEnumFut,
+>
+{}
+
+impl<
+	State,
+OnOpen: FnMut(&mut State, WithErrorSyntaxControlHandle) -> OnOpenFut,
+OnOpenFut: futures::Future<Output = ()> + Send,
+	ErrorAsPrimitive: FnMut(&mut State,WithErrorSyntaxErrorAsPrimitiveResponder) -> ErrorAsPrimitiveFut,
+	ErrorAsPrimitiveFut: futures::Future<Output = ()> + Send,
+	ErrorAsEnum: FnMut(&mut State,WithErrorSyntaxErrorAsEnumResponder) -> ErrorAsEnumFut,
+	ErrorAsEnumFut: futures::Future<Output = ()> + Send,
+> WithErrorSyntax for WithErrorSyntaxImpl<State, OnOpen, OnOpenFut,
+	ErrorAsPrimitive,
+	ErrorAsPrimitiveFut,
+	ErrorAsEnum,
+	ErrorAsEnumFut,
+>
+{
+	type OnOpenFut = OnOpenFut;
+	fn on_open(&mut self, response_chan: WithErrorSyntaxControlHandle) -> Self::OnOpenFut {
+		(self.on_open)(&mut self.state, response_chan)
+	}
+	type ErrorAsPrimitiveFut = ErrorAsPrimitiveFut;
+	fn error_as_primitive (&mut self,
+		response_chan: WithErrorSyntaxErrorAsPrimitiveResponder
+	) -> Self::ErrorAsPrimitiveFut
+	{
+		(self.error_as_primitive)(
+			&mut self.state,
+			response_chan
+		)
+	}
+	
+	type ErrorAsEnumFut = ErrorAsEnumFut;
+	fn error_as_enum (&mut self,
+		response_chan: WithErrorSyntaxErrorAsEnumResponder
+	) -> Self::ErrorAsEnumFut
+	{
+		(self.error_as_enum)(
+			&mut self.state,
+			response_chan
+		)
+	}
+	
+}
+
+#[derive(Clone)]
+pub struct WithErrorSyntaxControlHandle {
+	inner: ::std::sync::Arc<fidl::ServeInner>,
+}
+
+impl ::std::ops::Deref for WithErrorSyntaxControlHandle {
+	type Target = ::std::sync::Arc<fidl::ServeInner>;
+
+	fn deref(&self) -> &Self::Target {
+		&self.inner
+	}
+}
+
+
+impl WithErrorSyntaxControlHandle {
+	pub fn shutdown(&self) {
+		self.inner.shutdown()
+	}}
+
+/* beginning of response types */
+#[must_use = "FIDL methods require a response to be sent"]
+pub struct WithErrorSyntaxErrorAsPrimitiveResponder {
+	control_handle: ::std::mem::ManuallyDrop<WithErrorSyntaxControlHandle>,
+	tx_id: u32,
+	ordinal: u32,
+}
+
+impl ::std::ops::Drop for WithErrorSyntaxErrorAsPrimitiveResponder {
+	fn drop(&mut self) {
+		// Shutdown the channel if the responder is dropped without sending a response
+		// so that the client doesn't hang. To prevent this behavior, some methods
+		// call "drop_without_shutdown"
+		self.control_handle.shutdown();
+		// Safety: drops once, never accessed again
+		unsafe { ::std::mem::ManuallyDrop::drop(&mut self.control_handle) };
+	}
+}
+
+impl WithErrorSyntaxErrorAsPrimitiveResponder {
+	pub fn control_handle(&self) -> &WithErrorSyntaxControlHandle {
+		&self.control_handle
+	}
+
+	/// Drop the Responder without setting the channel to shutdown.
+	///
+	/// This method shouldn't normally be used-- instead, send a response
+	/// to prevent the channel from shutting down.
+	pub fn drop_without_shutdown(mut self) {
+		// Safety: drops once, never accessed again due to mem::forget
+		unsafe { ::std::mem::ManuallyDrop::drop(&mut self.control_handle) };
+		// Prevent Drop from running (which would shut down the channel)
+		::std::mem::forget(self);
+	}
+
+	/// Sends a response to the FIDL transaction.
+	///
+	/// Sets the channel to shutdown if an error occurs.
+	pub fn send(self,mut result: &mut WithErrorSyntaxErrorAsPrimitiveResult,) -> Result<(), fidl::Error> {
+		let r = self.send_raw(result,);
+		if r.is_err() {
+			self.control_handle.shutdown();
+		}
+		self.drop_without_shutdown();
+		r
+	}
+
+	/// Similar to "send" but does not shutdown the channel if
+	/// an error occurs.
+	pub fn send_no_shutdown_on_err(self,mut result: &mut WithErrorSyntaxErrorAsPrimitiveResult,) -> Result<(), fidl::Error> {
+		let r = self.send_raw(result,);
+		self.drop_without_shutdown();
+		r
+	}
+
+	fn send_raw(&self,mut result: &mut WithErrorSyntaxErrorAsPrimitiveResult,) -> Result<(), fidl::Error> {
+		let header = fidl::encoding::TransactionHeader {
+			tx_id: self.tx_id,
+			flags: 0,
+			ordinal: self.ordinal,
+		};
+
+		let mut response = (result);
+
+		let mut msg = fidl::encoding::TransactionMessage {
+			header,
+			body: &mut response,
+		};
+
+		::fidl::encoding::with_tls_coding_bufs(|bytes, handles| {
+			::fidl::encoding::Encoder::encode(bytes, handles, &mut msg)?;
+			self.control_handle.inner.channel().write(&*bytes, &mut *handles)
+				.map_err(fidl::Error::ServerResponseWrite)?;
+			Ok(())
+		})
+	}
+}
+#[must_use = "FIDL methods require a response to be sent"]
+pub struct WithErrorSyntaxErrorAsEnumResponder {
+	control_handle: ::std::mem::ManuallyDrop<WithErrorSyntaxControlHandle>,
+	tx_id: u32,
+	ordinal: u32,
+}
+
+impl ::std::ops::Drop for WithErrorSyntaxErrorAsEnumResponder {
+	fn drop(&mut self) {
+		// Shutdown the channel if the responder is dropped without sending a response
+		// so that the client doesn't hang. To prevent this behavior, some methods
+		// call "drop_without_shutdown"
+		self.control_handle.shutdown();
+		// Safety: drops once, never accessed again
+		unsafe { ::std::mem::ManuallyDrop::drop(&mut self.control_handle) };
+	}
+}
+
+impl WithErrorSyntaxErrorAsEnumResponder {
+	pub fn control_handle(&self) -> &WithErrorSyntaxControlHandle {
+		&self.control_handle
+	}
+
+	/// Drop the Responder without setting the channel to shutdown.
+	///
+	/// This method shouldn't normally be used-- instead, send a response
+	/// to prevent the channel from shutting down.
+	pub fn drop_without_shutdown(mut self) {
+		// Safety: drops once, never accessed again due to mem::forget
+		unsafe { ::std::mem::ManuallyDrop::drop(&mut self.control_handle) };
+		// Prevent Drop from running (which would shut down the channel)
+		::std::mem::forget(self);
+	}
+
+	/// Sends a response to the FIDL transaction.
+	///
+	/// Sets the channel to shutdown if an error occurs.
+	pub fn send(self,mut result: &mut WithErrorSyntaxErrorAsEnumResult,) -> Result<(), fidl::Error> {
+		let r = self.send_raw(result,);
+		if r.is_err() {
+			self.control_handle.shutdown();
+		}
+		self.drop_without_shutdown();
+		r
+	}
+
+	/// Similar to "send" but does not shutdown the channel if
+	/// an error occurs.
+	pub fn send_no_shutdown_on_err(self,mut result: &mut WithErrorSyntaxErrorAsEnumResult,) -> Result<(), fidl::Error> {
+		let r = self.send_raw(result,);
+		self.drop_without_shutdown();
+		r
+	}
+
+	fn send_raw(&self,mut result: &mut WithErrorSyntaxErrorAsEnumResult,) -> Result<(), fidl::Error> {
+		let header = fidl::encoding::TransactionHeader {
+			tx_id: self.tx_id,
+			flags: 0,
+			ordinal: self.ordinal,
+		};
+
+		let mut response = (result);
+
+		let mut msg = fidl::encoding::TransactionMessage {
+			header,
+			body: &mut response,
+		};
+
+		::fidl::encoding::with_tls_coding_bufs(|bytes, handles| {
+			::fidl::encoding::Encoder::encode(bytes, handles, &mut msg)?;
+			self.control_handle.inner.channel().write(&*bytes, &mut *handles)
+				.map_err(fidl::Error::ServerResponseWrite)?;
+			Ok(())
+		})
+	}
+}
+
+
 #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
 pub struct OvernetInternalProtocolMarker;
 
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json_test_base.h.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json_test_base.h.golden
index ecdef0664c7444d87ccd1a777b1e4f0e2c9d7dda..e85ad056fb9d71eefcd1b06166780e25ea93f0fd 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json_test_base.h.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json_test_base.h.golden
@@ -82,6 +82,19 @@ class WithAndWithoutRequestResponse_TestBase : public WithAndWithoutRequestRespo
     NotImplemented_("WithRequestWithResponse");
   }
 
+};
+
+class WithErrorSyntax_TestBase : public WithErrorSyntax {
+  public:
+  virtual ~WithErrorSyntax_TestBase() { }
+  virtual void NotImplemented_(const std::string& name) = 0;
+  void ErrorAsPrimitive(ErrorAsPrimitiveCallback callback) override {
+    NotImplemented_("ErrorAsPrimitive");
+  }
+  void ErrorAsEnum(ErrorAsEnumCallback callback) override {
+    NotImplemented_("ErrorAsEnum");
+  }
+
 };
 }  // namespace testing
 }  // namespace name
diff --git a/garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl b/garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl
index 9fea07204f08d8b1e91a1dda98fedf134167216b..63578a635b65d0900bc54245ff3d60fccce592d7 100644
--- a/garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl
+++ b/garnet/go/src/fidl/compiler/backend/typestest/protocols.test.fidl
@@ -11,6 +11,16 @@ protocol WithAndWithoutRequestResponse {
     -> OnWithResponse(string ret);
 };
 
+enum ErrorEnun {
+    ERR_FOO = 1;
+    ERR_BAR = 2;
+};
+
+protocol WithErrorSyntax {
+    ErrorAsPrimitive() -> () error uint32;
+    ErrorAsEnum() -> () error ErrorEnun;
+};
+
 [Transport="OvernetInternal"]
 protocol OvernetInternalProtocol {
     MethodA(int64 a, int64 b);