Compiler segfault on global slice initialization with null[:0] #2404.

This commit is contained in:
Christoffer Lerno
2025-08-15 20:10:28 +02:00
parent 4b95d6be4c
commit b52ab886d2
5 changed files with 116 additions and 97 deletions

View File

@@ -2638,19 +2638,26 @@ static void llvm_emit_slice_values(GenContext *c, Expr *slice, BEValue *parent_r
ASSERT(slice->expr_kind == EXPR_SLICE);
Expr *parent_expr = exprptr(slice->subscript_expr.expr);
Type *parent_type = type_flatten(parent_expr->type);
parent_type = type_no_optional(parent_type);
BEValue parent_addr_x;
llvm_emit_expr(c, &parent_addr_x, parent_expr);
llvm_value_addr(c, &parent_addr_x);
LLVMValueRef parent_addr = parent_addr_x.value;
LLVMValueRef parent_load_value = NULL;
LLVMValueRef parent_base;
parent_type = type_no_optional(parent_type);
LLVMValueRef parent_addr;
if (parent_type->type_kind == TYPE_POINTER)
{
llvm_value_rvalue(c, &parent_addr_x);
parent_load_value = parent_base = parent_addr_x.value;
}
else
{
llvm_value_addr(c, &parent_addr_x);
parent_addr = parent_addr_x.value;
}
switch (parent_type->type_kind)
{
case TYPE_POINTER:
parent_load_value = parent_base = LLVMBuildLoad2(c->builder, llvm_get_type(c, parent_type), parent_addr, "");
break;
case TYPE_SLICE:
parent_load_value = LLVMBuildLoad2(c->builder, llvm_get_type(c, parent_type), parent_addr, "");