diff options
| author | Robin Voetter <robin@voetter.nl> | 2022-12-10 01:44:05 +0100 |
|---|---|---|
| committer | Robin Voetter <robin@voetter.nl> | 2023-04-09 01:51:52 +0200 |
| commit | 27833004dbf066158ddf9574acbdef5c695941fa (patch) | |
| tree | 009a7573af34ece625ad5e205d9eb4fcd3e9ef89 /src/codegen | |
| parent | 3c7f93aa69e495820448a17869bd4663ed396ff2 (diff) | |
| download | zig-27833004dbf066158ddf9574acbdef5c695941fa.tar.gz zig-27833004dbf066158ddf9574acbdef5c695941fa.zip | |
spirv: optional types
Implements lowering optional types in the SPIR-V backend.
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/spirv.zig | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 1e50645c91..f81a248f63 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -776,6 +776,28 @@ pub const DeclGen = struct { }; return try self.spv.resolveType(SpvType.initPayload(&payload.base)); }, + .Optional => { + var buf: Type.Payload.ElemType = undefined; + const payload_ty = ty.optionalChild(&buf); + if (!payload_ty.hasRuntimeBitsIgnoreComptime()) { + // Just use a bool. + return try self.resolveType(Type.initTag(.bool), repr); + } + + const payload_ty_ref = try self.resolveType(payload_ty, .indirect); + if (ty.optionalReprIsPayload()) { + // Optional is actually a pointer. + return payload_ty_ref; + } + + const bool_ty_ref = try self.resolveType(Type.initTag(.bool), .indirect); + + // its an actual optional + return try self.simpleStructType(&.{ + .{ .ty = payload_ty_ref, .name = "payload" }, + .{ .ty = bool_ty_ref, .name = "valid" }, + }); + }, .Null, .Undefined, .EnumLiteral, |
