| ... | @@ -776,6 +776,28 @@ pub const DeclGen = struct { | ... | @@ -776,6 +776,28 @@ pub const DeclGen = struct { |
| 776 | }; | 776 | }; |
| 777 | return try self.spv.resolveType(SpvType.initPayload(&payload.base)); | 777 | return try self.spv.resolveType(SpvType.initPayload(&payload.base)); |
| 778 | }, | 778 | }, |
| | 779 | .Optional => { |
| | 780 | var buf: Type.Payload.ElemType = undefined; |
| | 781 | const payload_ty = ty.optionalChild(&buf); |
| | 782 | if (!payload_ty.hasRuntimeBitsIgnoreComptime()) { |
| | 783 | // Just use a bool. |
| | 784 | return try self.resolveType(Type.initTag(.bool), repr); |
| | 785 | } |
| | 786 | |
| | 787 | const payload_ty_ref = try self.resolveType(payload_ty, .indirect); |
| | 788 | if (ty.optionalReprIsPayload()) { |
| | 789 | // Optional is actually a pointer. |
| | 790 | return payload_ty_ref; |
| | 791 | } |
| | 792 | |
| | 793 | const bool_ty_ref = try self.resolveType(Type.initTag(.bool), .indirect); |
| | 794 | |
| | 795 | // its an actual optional |
| | 796 | return try self.simpleStructType(&.{ |
| | 797 | .{ .ty = payload_ty_ref, .name = "payload" }, |
| | 798 | .{ .ty = bool_ty_ref, .name = "valid" }, |
| | 799 | }); |
| | 800 | }, |
| 779 | .Null, | 801 | .Null, |
| 780 | .Undefined, | 802 | .Undefined, |
| 781 | .EnumLiteral, | 803 | .EnumLiteral, |