aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-09-29 21:35:59 +0100
committerGinger Bill <bill@gingerbill.org>2017-09-29 21:35:59 +0100
commit8c7cf0dbb0b4cf9730788c619c8cb9adf8f284a1 (patch)
tree4c1c42933a94a52a7eb7bed7868ffe0a985558bf /src/ir.cpp
parente6e9375b091ad7ecf83be53a081e08ee87482118 (diff)
Fix union array bug (Issue #112)
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp44
1 files changed, 22 insertions, 22 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 2fbcee70a..743e97071 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -5077,7 +5077,7 @@ irValue *ir_get_using_variable(irProcedure *proc, Entity *e) {
}
bool ir_is_elem_const(irModule *m, AstNode *elem, Type *elem_type) {
- if (base_type(elem_type) == t_any) {
+ if (!elem_type_can_be_constant(elem_type)) {
return false;
}
if (elem->kind == AstNode_FieldValue) {
@@ -5592,6 +5592,27 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) {
}
} break;
+ case Type_Map: {
+ if (cl->elems.count == 0) {
+ break;
+ }
+ gbAllocator a = proc->module->allocator;
+ {
+ irValue **args = gb_alloc_array(a, irValue *, 2);
+ args[0] = ir_gen_map_header(proc, v, type);
+ args[1] = ir_const_int(a, 2*cl->elems.count);
+ ir_emit_global_call(proc, "__dynamic_map_reserve", args, 2);
+ }
+ for_array(field_index, cl->elems) {
+ AstNode *elem = cl->elems[field_index];
+ ast_node(fv, FieldValue, elem);
+
+ irValue *key = ir_build_expr(proc, fv->field);
+ irValue *value = ir_build_expr(proc, fv->value);
+ ir_insert_dynamic_map_key_and_value(proc, v, type, key, value);
+ }
+ } break;
+
case Type_DynamicArray: {
if (cl->elems.count == 0) {
break;
@@ -5630,27 +5651,6 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) {
}
} break;
- case Type_Map: {
- if (cl->elems.count == 0) {
- break;
- }
- gbAllocator a = proc->module->allocator;
- {
- irValue **args = gb_alloc_array(a, irValue *, 2);
- args[0] = ir_gen_map_header(proc, v, type);
- args[1] = ir_const_int(a, 2*cl->elems.count);
- ir_emit_global_call(proc, "__dynamic_map_reserve", args, 2);
- }
- for_array(field_index, cl->elems) {
- AstNode *elem = cl->elems[field_index];
- ast_node(fv, FieldValue, elem);
-
- irValue *key = ir_build_expr(proc, fv->field);
- irValue *value = ir_build_expr(proc, fv->value);
- ir_insert_dynamic_map_key_and_value(proc, v, type, key, value);
- }
- } break;
-
case Type_Array: {
if (cl->elems.count > 0) {
ir_emit_store(proc, v, ir_add_module_constant(proc->module, type, exact_value_compound(expr)));