mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Fix #2029 Eumerated array of procs literal crashes the compiler with an llvm error
This commit is contained in:
@@ -297,12 +297,16 @@ LLVMValueRef lb_build_constant_array_values(lbModule *m, Type *type, Type *elem_
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!is_const) {
|
if (!is_const) {
|
||||||
|
LLVMTypeRef llvm_elem_type = lb_type(m, elem_type);
|
||||||
lbProcedure *p = m->curr_procedure;
|
lbProcedure *p = m->curr_procedure;
|
||||||
GB_ASSERT(p != nullptr);
|
GB_ASSERT(p != nullptr);
|
||||||
lbAddr v = lb_add_local_generated(p, type, false);
|
lbAddr v = lb_add_local_generated(p, type, false);
|
||||||
lbValue ptr = lb_addr_get_ptr(p, v);
|
lbValue ptr = lb_addr_get_ptr(p, v);
|
||||||
for (isize i = 0; i < count; i++) {
|
for (isize i = 0; i < count; i++) {
|
||||||
lbValue elem = lb_emit_array_epi(p, ptr, i);
|
lbValue elem = lb_emit_array_epi(p, ptr, i);
|
||||||
|
if (is_type_proc(elem_type)) {
|
||||||
|
values[i] = LLVMConstPointerCast(values[i], llvm_elem_type);
|
||||||
|
}
|
||||||
LLVMBuildStore(p->builder, values[i], elem.value);
|
LLVMBuildStore(p->builder, values[i], elem.value);
|
||||||
}
|
}
|
||||||
return lb_addr_load(p, v).value;
|
return lb_addr_load(p, v).value;
|
||||||
|
|||||||
@@ -877,18 +877,6 @@ bool lb_is_type_proc_recursive(Type *t) {
|
|||||||
case Type_Pointer:
|
case Type_Pointer:
|
||||||
t = t->Pointer.elem;
|
t = t->Pointer.elem;
|
||||||
break;
|
break;
|
||||||
case Type_Array:
|
|
||||||
t = t->Array.elem;
|
|
||||||
break;
|
|
||||||
case Type_EnumeratedArray:
|
|
||||||
t = t->EnumeratedArray.elem;
|
|
||||||
break;
|
|
||||||
case Type_Slice:
|
|
||||||
t = t->Slice.elem;
|
|
||||||
break;
|
|
||||||
case Type_DynamicArray:
|
|
||||||
t = t->DynamicArray.elem;
|
|
||||||
break;
|
|
||||||
case Type_Proc:
|
case Type_Proc:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
@@ -1890,16 +1878,16 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
|
|||||||
return LLVMPointerType(lb_type(m, type->Pointer.elem), 0);
|
return LLVMPointerType(lb_type(m, type->Pointer.elem), 0);
|
||||||
|
|
||||||
case Type_Array: {
|
case Type_Array: {
|
||||||
m->internal_type_level -= 1;
|
|
||||||
LLVMTypeRef t = LLVMArrayType(lb_type(m, type->Array.elem), cast(unsigned)type->Array.count);
|
|
||||||
m->internal_type_level += 1;
|
m->internal_type_level += 1;
|
||||||
|
LLVMTypeRef t = LLVMArrayType(lb_type(m, type->Array.elem), cast(unsigned)type->Array.count);
|
||||||
|
m->internal_type_level -= 1;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Type_EnumeratedArray: {
|
case Type_EnumeratedArray: {
|
||||||
m->internal_type_level -= 1;
|
|
||||||
LLVMTypeRef t = LLVMArrayType(lb_type(m, type->EnumeratedArray.elem), cast(unsigned)type->EnumeratedArray.count);
|
|
||||||
m->internal_type_level += 1;
|
m->internal_type_level += 1;
|
||||||
|
LLVMTypeRef t = LLVMArrayType(lb_type(m, type->EnumeratedArray.elem), cast(unsigned)type->EnumeratedArray.count);
|
||||||
|
m->internal_type_level -= 1;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2101,14 +2089,11 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case Type_Proc:
|
case Type_Proc:
|
||||||
// if (m->internal_type_level > 256) { // TODO HACK(bill): is this really enough?
|
{
|
||||||
if (m->internal_type_level > 1) { // TODO HACK(bill): is this really enough?
|
|
||||||
return LLVMPointerType(LLVMIntTypeInContext(m->ctx, 8), 0);
|
|
||||||
} else {
|
|
||||||
LLVMTypeRef proc_raw_type = lb_type_internal_for_procedures_raw(m, type);
|
LLVMTypeRef proc_raw_type = lb_type_internal_for_procedures_raw(m, type);
|
||||||
return LLVMPointerType(proc_raw_type, 0);
|
gb_unused(proc_raw_type);
|
||||||
|
return LLVMPointerType(LLVMIntTypeInContext(m->ctx, 8), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case Type_BitSet:
|
case Type_BitSet:
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user