From 48aedc924cdc739d99964a583d854a1a798a89fe Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Sun, 13 Apr 2025 15:37:09 -0600 Subject: [PATCH] Struct zero --- src/bootstrap.zig | 22 +++++++++++++++++++--- src/main.zig | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/bootstrap.zig b/src/bootstrap.zig index 3905def..6f2da59 100644 --- a/src/bootstrap.zig +++ b/src/bootstrap.zig @@ -5762,14 +5762,23 @@ pub const Module = struct { }, .structure => |structure| switch (aggregate_initialization.is_constant) { true => blk: { - _ = structure; var constant_buffer: [64]*llvm.Constant = undefined; - const constants = constant_buffer[0..aggregate_initialization.values.len]; + const constants = constant_buffer[0..structure.fields.len]; _ = &constant_buffer; - for (aggregate_initialization.values, constants) |field_value, *constant| { + for (aggregate_initialization.values, constants[0..aggregate_initialization.values.len]) |field_value, *constant| { module.emit_value(function, field_value); constant.* = field_value.llvm.?.to_constant(); } + + if (aggregate_initialization.zero) { + if (aggregate_initialization.values.len == structure.fields.len) { + module.report_error(); + } + + for (constants[aggregate_initialization.values.len..], structure.fields[aggregate_initialization.values.len..]) |*constant, *field| { + constant.* = field.type.resolve(module).handle.get_zero(); + } + } const constant_struct = value_type.resolve(module).handle.to_struct().get_constant(constants); break :blk constant_struct.to_value(); }, @@ -6198,6 +6207,10 @@ pub const Module = struct { }; module.emit_assignment(function, destination_value, initialization_value); } + + if (aggregate_initialization.zero) { + @trap(); + } }, }, .string_literal => |string_literal| { @@ -6368,6 +6381,9 @@ pub const Module = struct { else => @trap(), } }, + .zero => { + _ = module.llvm.builder.create_memset(left.llvm.?, module.integer_type(8, false).resolve(module).handle.get_zero().to_value(), module.integer_type(64, false).resolve(module).handle.to_integer().get_constant(value_type.get_byte_size(), 0).to_value(), pointer_type.bb.pointer.alignment); + }, else => @trap(), }, .complex => @trap(), diff --git a/src/main.zig b/src/main.zig index 0f176c8..c1b6d79 100644 --- a/src/main.zig +++ b/src/main.zig @@ -234,4 +234,5 @@ const names = &[_][]const u8{ "struct", "struct_u64_u64", "struct_varargs", + "struct_zero", };