aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-06-10 15:09:04 +0100
committergingerBill <bill@gingerbill.org>2020-06-10 15:09:04 +0100
commite86fde3cb16d2977054aa727c32cd4efcb1bd8a7 (patch)
tree0a6c76afcbecffef255fd2ce6d50758d2f900d36
parent99944f3b02dd8aef610bdc19e31a790939e29cdd (diff)
Fix #648
-rw-r--r--src/array.cpp10
-rw-r--r--src/check_decl.cpp6
-rw-r--r--src/check_expr.cpp9
3 files changed, 23 insertions, 2 deletions
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 <typename T> void array_reserve (Array<T> *array, isize capac
template <typename T> void array_resize (Array<T> *array, isize count);
template <typename T> void array_set_capacity (Array<T> *array, isize capacity);
template <typename T> Array<T> array_slice (Array<T> const &array, isize lo, isize hi);
+template <typename T> Array<T> array_clone (gbAllocator const &a, Array<T> const &array);
@@ -243,6 +244,15 @@ gb_inline Array<T> array_slice(Array<T> const &array, isize lo, isize hi) {
}
return out;
}
+
+template <typename T>
+Array<T> array_clone(gbAllocator const &allocator, Array<T> const &array) {
+ auto clone = array_make<T>(allocator, array.count, array.count);
+ array_copy(&clone, array, 0);
+ return clone;
+}
+
+
template <typename T>
void array_ordered_remove(Array<T> *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);