Commit 73a751911e
Changed files (3)
src
test
src/codegen.cpp
@@ -2181,6 +2181,30 @@ static LLVMValueRef ir_render_struct_init(CodeGen *g, IrExecutable *executable,
return instruction->tmp_ptr;
}
+static LLVMValueRef ir_render_container_init_list(CodeGen *g, IrExecutable *executable,
+ IrInstructionContainerInitList *instruction)
+{
+ TypeTableEntry *array_type = instruction->base.value.type;
+ assert(array_type->id == TypeTableEntryIdArray);
+ LLVMValueRef tmp_array_ptr = instruction->tmp_ptr;
+ assert(tmp_array_ptr);
+
+ size_t field_count = instruction->item_count;
+
+ TypeTableEntry *child_type = array_type->data.array.child_type;
+ for (size_t i = 0; i < field_count; i += 1) {
+ LLVMValueRef elem_val = ir_llvm_value(g, instruction->items[i]);
+ LLVMValueRef indices[] = {
+ LLVMConstNull(g->builtin_types.entry_usize->type_ref),
+ LLVMConstInt(g->builtin_types.entry_usize->type_ref, i, false),
+ };
+ LLVMValueRef elem_ptr = LLVMBuildInBoundsGEP(g->builder, tmp_array_ptr, indices, 2, "");
+ gen_assign_raw(g, elem_ptr, elem_val, child_type);
+ }
+
+ return tmp_array_ptr;
+}
+
static void set_debug_location(CodeGen *g, IrInstruction *instruction) {
AstNode *source_node = instruction->source_node;
Scope *scope = instruction->scope;
@@ -2323,10 +2347,10 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
return ir_render_pointer_reinterpret(g, executable, (IrInstructionPointerReinterpret *)instruction);
case IrInstructionIdWidenOrShorten:
return ir_render_widen_or_shorten(g, executable, (IrInstructionWidenOrShorten *)instruction);
+ case IrInstructionIdContainerInitList:
+ return ir_render_container_init_list(g, executable, (IrInstructionContainerInitList *)instruction);
case IrInstructionIdSwitchVar:
zig_panic("TODO render switch var instruction to LLVM");
- case IrInstructionIdContainerInitList:
- zig_panic("TODO render container init list instruction to LLVM");
}
zig_unreachable();
}
test/cases/eval.zig
@@ -94,6 +94,21 @@ fn makePoint(x: i32, y: i32) -> Point {
}
+fn staticEvalListInit() {
+ @setFnTest(this);
+
+ assert(static_vec3.data[2] == 1.0);
+ assert(vec3(0.0, 0.0, 3.0).data[2] == 3.0);
+}
+const static_vec3 = vec3(0.0, 0.0, 1.0);
+pub const Vec3 = struct {
+ data: [3]f32,
+};
+pub fn vec3(x: f32, y: f32, z: f32) -> Vec3 {
+ Vec3 {
+ .data = []f32 { x, y, z, },
+ }
+}
// TODO const assert = @import("std").debug.assert;
fn assert(ok: bool) {
test/self_hosted.zig
@@ -4,20 +4,6 @@ const str = std.str;
const cstr = std.cstr;
-fn staticEvalListInit() {
- @setFnTest(this);
-
- assert(static_vec3.data[2] == 1.0);
-}
-const static_vec3 = vec3(0.0, 0.0, 1.0);
-pub const Vec3 = struct {
- data: [3]f32,
-};
-pub fn vec3(x: f32, y: f32, z: f32) -> Vec3 {
- Vec3 {
- .data = []f32 { x, y, z, },
- }
-}
fn genericFnWithImplicitCast() {
@setFnTest(this, true);