From de24cea2cff33654ee41369517144bb94f6d139d Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 9 Sep 2022 15:19:51 +0300 Subject: [PATCH] Sema: handle empty_struct_value in beginComptimePtrMutation Closes #12794 --- src/Sema.zig | 14 +++++++++++++ test/behavior.zig | 1 + test/behavior/bugs/12794.zig | 38 ++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 test/behavior/bugs/12794.zig diff --git a/src/Sema.zig b/src/Sema.zig index 1afecef461..d96363b160 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -24770,6 +24770,20 @@ fn beginComptimePtrMutation( else => unreachable, }, + .empty_struct_value => { + const duped = try sema.arena.create(Value); + duped.* = Value.initTag(.the_only_possible_value); + return beginComptimePtrMutationInner( + sema, + block, + src, + parent.ty.structFieldType(field_index), + duped, + ptr_elem_ty, + parent.decl_ref_mut, + ); + }, + else => unreachable, }, .reinterpret => |reinterpret| { diff --git a/test/behavior.zig b/test/behavior.zig index db107bcbb1..e11cda3b27 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -87,6 +87,7 @@ test { _ = @import("behavior/bugs/12486.zig"); _ = @import("behavior/bugs/12680.zig"); _ = @import("behavior/bugs/12776.zig"); + _ = @import("behavior/bugs/12794.zig"); _ = @import("behavior/byteswap.zig"); _ = @import("behavior/byval_arg_var.zig"); _ = @import("behavior/call.zig"); diff --git a/test/behavior/bugs/12794.zig b/test/behavior/bugs/12794.zig new file mode 100644 index 0000000000..530f81cff2 --- /dev/null +++ b/test/behavior/bugs/12794.zig @@ -0,0 +1,38 @@ +const std = @import("std"); + +fn NamespacedComponents(comptime modules: anytype) type { + return @Type(.{ + .Struct = .{ + .layout = .Auto, + .is_tuple = false, + .fields = &.{.{ + .name = "components", + .field_type = @TypeOf(modules.components), + .default_value = null, + .is_comptime = false, + .alignment = @alignOf(@TypeOf(modules.components)), + }}, + .decls = &[_]std.builtin.Type.Declaration{}, + }, + }); +} + +fn namespacedComponents(comptime modules: anytype) NamespacedComponents(modules) { + var x: NamespacedComponents(modules) = undefined; + x.components = modules.components; + return x; +} + +pub fn World(comptime modules: anytype) type { + const all_components = namespacedComponents(modules); + _ = all_components; + return struct {}; +} + +test { + _ = World(.{ + .components = .{ + .location = struct {}, + }, + }); +}