mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 23:58:50 +00:00
Fix Crash when compiling for loop with parens around array expression #506
This commit is contained in:
+7
-7
@@ -9674,13 +9674,13 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
|
|||||||
} else if (tav.mode == Addressing_Type) {
|
} else if (tav.mode == Addressing_Type) {
|
||||||
ir_build_range_enum(proc, type_deref(tav.type), val0_type, &val, &key, &loop, &done);
|
ir_build_range_enum(proc, type_deref(tav.type), val0_type, &val, &key, &loop, &done);
|
||||||
} else {
|
} else {
|
||||||
Type *expr_type = type_of_expr(rs->expr);
|
Type *expr_type = type_of_expr(expr);
|
||||||
Type *et = base_type(type_deref(expr_type));
|
Type *et = base_type(type_deref(expr_type));
|
||||||
switch (et->kind) {
|
switch (et->kind) {
|
||||||
case Type_Map: {
|
case Type_Map: {
|
||||||
is_map = true;
|
is_map = true;
|
||||||
gbAllocator a = ir_allocator();
|
gbAllocator a = ir_allocator();
|
||||||
irAddr const &addr = ir_build_addr(proc, rs->expr);
|
irAddr const &addr = ir_build_addr(proc, expr);
|
||||||
irValue *map = ir_addr_get_ptr(proc, addr);
|
irValue *map = ir_addr_get_ptr(proc, addr);
|
||||||
if (is_type_pointer(type_deref(ir_addr_type(addr)))) {
|
if (is_type_pointer(type_deref(ir_addr_type(addr)))) {
|
||||||
map = ir_addr_load(proc, addr);
|
map = ir_addr_load(proc, addr);
|
||||||
@@ -9692,7 +9692,7 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
|
|||||||
}
|
}
|
||||||
case Type_Array: {
|
case Type_Array: {
|
||||||
irValue *count_ptr = nullptr;
|
irValue *count_ptr = nullptr;
|
||||||
irValue *array = ir_build_addr_ptr(proc, rs->expr);
|
irValue *array = ir_build_addr_ptr(proc, expr);
|
||||||
if (is_type_pointer(type_deref(ir_type(array)))) {
|
if (is_type_pointer(type_deref(ir_type(array)))) {
|
||||||
array = ir_emit_load(proc, array);
|
array = ir_emit_load(proc, array);
|
||||||
}
|
}
|
||||||
@@ -9703,7 +9703,7 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
|
|||||||
}
|
}
|
||||||
case Type_DynamicArray: {
|
case Type_DynamicArray: {
|
||||||
irValue *count_ptr = nullptr;
|
irValue *count_ptr = nullptr;
|
||||||
irValue *array = ir_build_addr_ptr(proc, rs->expr);
|
irValue *array = ir_build_addr_ptr(proc, expr);
|
||||||
if (is_type_pointer(type_deref(ir_type(array)))) {
|
if (is_type_pointer(type_deref(ir_type(array)))) {
|
||||||
array = ir_emit_load(proc, array);
|
array = ir_emit_load(proc, array);
|
||||||
}
|
}
|
||||||
@@ -9713,7 +9713,7 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
|
|||||||
}
|
}
|
||||||
case Type_Slice: {
|
case Type_Slice: {
|
||||||
irValue *count_ptr = nullptr;
|
irValue *count_ptr = nullptr;
|
||||||
irValue *slice = ir_build_expr(proc, rs->expr);
|
irValue *slice = ir_build_expr(proc, expr);
|
||||||
if (is_type_pointer(ir_type(slice))) {
|
if (is_type_pointer(ir_type(slice))) {
|
||||||
count_ptr = ir_emit_struct_ep(proc, slice, 1);
|
count_ptr = ir_emit_struct_ep(proc, slice, 1);
|
||||||
slice = ir_emit_load(proc, slice);
|
slice = ir_emit_load(proc, slice);
|
||||||
@@ -9725,7 +9725,7 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type_Basic: {
|
case Type_Basic: {
|
||||||
irValue *string = ir_build_expr(proc, rs->expr);
|
irValue *string = ir_build_expr(proc, expr);
|
||||||
if (is_type_pointer(ir_type(string))) {
|
if (is_type_pointer(ir_type(string))) {
|
||||||
string = ir_emit_load(proc, string);
|
string = ir_emit_load(proc, string);
|
||||||
}
|
}
|
||||||
@@ -9740,7 +9740,7 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type_Tuple:
|
case Type_Tuple:
|
||||||
ir_build_range_tuple(proc, rs->expr, val0_type, val1_type, &val, &key, &loop, &done);
|
ir_build_range_tuple(proc, expr, val0_type, val1_type, &val, &key, &loop, &done);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
GB_PANIC("Cannot range over %s", type_to_string(expr_type));
|
GB_PANIC("Cannot range over %s", type_to_string(expr_type));
|
||||||
|
|||||||
Reference in New Issue
Block a user