aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2023-10-06 15:06:40 +0100
committerGitHub <noreply@github.com>2023-10-06 15:06:40 +0100
commit96778c69bcb6feebd92009c32f89aed2d52cb802 (patch)
treebbfb4f8ee3a356565072885734892e14db928bc0 /src
parent2cca00505601f0b0e76719d366a037cdb4cf794c (diff)
parent394c12f68dc380aea93ad447f5f348383811d09f (diff)
Merge pull request #2836 from jakubtomsu/fix-zero-length-enum-array
Allow zero-length enum array (to stay consistent with `[0]T`)
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp2
-rw-r--r--src/types.cpp8
2 files changed, 7 insertions, 3 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index a43c296a6..d66b196bc 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -2797,7 +2797,7 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T
Type *bt = base_type(index);
GB_ASSERT(bt->kind == Type_Enum);
- Type *t = alloc_type_enumerated_array(elem, index, bt->Enum.min_value, bt->Enum.max_value, Token_Invalid);
+ Type *t = alloc_type_enumerated_array(elem, index, bt->Enum.min_value, bt->Enum.max_value, bt->Enum.fields.count, Token_Invalid);
bool is_sparse = false;
if (at->tag != nullptr) {
diff --git a/src/types.cpp b/src/types.cpp
index f3062365f..574e628c5 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -983,7 +983,7 @@ gb_internal Type *alloc_type_matrix(Type *elem, i64 row_count, i64 column_count,
}
-gb_internal Type *alloc_type_enumerated_array(Type *elem, Type *index, ExactValue const *min_value, ExactValue const *max_value, TokenKind op) {
+gb_internal Type *alloc_type_enumerated_array(Type *elem, Type *index, ExactValue const *min_value, ExactValue const *max_value, isize count, TokenKind op) {
Type *t = alloc_type(Type_EnumeratedArray);
t->EnumeratedArray.elem = elem;
t->EnumeratedArray.index = index;
@@ -993,7 +993,11 @@ gb_internal Type *alloc_type_enumerated_array(Type *elem, Type *index, ExactValu
gb_memmove(t->EnumeratedArray.max_value, max_value, gb_size_of(ExactValue));
t->EnumeratedArray.op = op;
- t->EnumeratedArray.count = 1 + exact_value_to_i64(exact_value_sub(*max_value, *min_value));
+ if (count == 0) {
+ t->EnumeratedArray.count = 0;
+ } else {
+ t->EnumeratedArray.count = 1 + exact_value_to_i64(exact_value_sub(*max_value, *min_value));
+ }
return t;
}