diff --git a/src/array.cpp b/src/array.cpp index 3df688e2e..6fe54b847 100644 --- a/src/array.cpp +++ b/src/array.cpp @@ -41,6 +41,7 @@ template void array_reserve (Array *array, isize capac template void array_resize (Array *array, isize count); template void array_set_capacity (Array *array, isize capacity); template Array array_slice (Array const &array, isize lo, isize hi); +template Array array_clone (gbAllocator const &a, Array const &array); @@ -243,6 +244,15 @@ gb_inline Array array_slice(Array const &array, isize lo, isize hi) { } return out; } + +template +Array array_clone(gbAllocator const &allocator, Array const &array) { + auto clone = array_make(allocator, array.count, array.count); + array_copy(&clone, array, 0); + return clone; +} + + template void array_ordered_remove(Array *array, isize index) { GB_ASSERT(0 <= index && index < array->count); diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 88e7be316..560518df9 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -435,7 +435,11 @@ void check_const_decl(CheckerContext *ctx, Entity *e, Ast *type_expr, Ast *init, case Addressing_ProcGroup: GB_ASSERT(operand.proc_group != nullptr); GB_ASSERT(operand.proc_group->kind == Entity_ProcGroup); - override_entity_in_scope(e, operand.proc_group); + // NOTE(bill, 2020-06-10): It is better to just clone the contents than overriding the entity in the scope + // Thank goodness I made entities a tagged union to allow for this implace patching + // override_entity_in_scope(e, operand.proc_group); + e->kind = Entity_ProcGroup; + e->ProcGroup.entities = array_clone(heap_allocator(), operand.proc_group->ProcGroup.entities); return; } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index c38bec9b7..a52295298 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3492,7 +3492,14 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ } check_entity_decl(c, entity, nullptr, nullptr); - GB_ASSERT(entity->type != nullptr); + if (entity->kind == Entity_ProcGroup) { + operand->mode = Addressing_ProcGroup; + operand->proc_group = entity; + + add_type_and_value(c->info, operand->expr, operand->mode, operand->type, operand->value); + return entity; + } + GB_ASSERT_MSG(entity->type != nullptr, "%.*s (%.*s)", LIT(entity->token.string), LIT(entity_strings[entity->kind])); if (!is_entity_exported(entity, allow_builtin)) { gbString sel_str = expr_to_string(selector);