aboutsummaryrefslogtreecommitdiff
path: root/src/checker.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-02-22 15:55:20 +0000
committergingerBill <bill@gingerbill.org>2024-02-22 15:55:54 +0000
commita4b8c1ea1779ce93349b203aaf56c5aeca316b61 (patch)
tree3252615386a0d4840f87210286dca6a484176d3b /src/checker.cpp
parentb12ba1508eb5d7f53f0952e0267eb7b5b3dce463 (diff)
Begin work adding `bit_field`
Diffstat (limited to 'src/checker.cpp')
-rw-r--r--src/checker.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index 569a3c76f..5827fc695 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -313,6 +313,7 @@ gb_internal void add_scope(CheckerContext *c, Ast *node, Scope *scope) {
case Ast_StructType: node->StructType.scope = scope; break;
case Ast_UnionType: node->UnionType.scope = scope; break;
case Ast_EnumType: node->EnumType.scope = scope; break;
+ case Ast_BitFieldType: node->BitFieldType.scope = scope; break;
default: GB_PANIC("Invalid node for add_scope: %.*s", LIT(ast_strings[node->kind]));
}
}
@@ -334,6 +335,7 @@ gb_internal Scope *scope_of_node(Ast *node) {
case Ast_StructType: return node->StructType.scope;
case Ast_UnionType: return node->UnionType.scope;
case Ast_EnumType: return node->EnumType.scope;
+ case Ast_BitFieldType: return node->BitFieldType.scope;
}
GB_PANIC("Invalid node for add_scope: %.*s", LIT(ast_strings[node->kind]));
return nullptr;
@@ -355,6 +357,7 @@ gb_internal void check_open_scope(CheckerContext *c, Ast *node) {
case Ast_EnumType:
case Ast_UnionType:
case Ast_BitSetType:
+ case Ast_BitFieldType:
scope->flags |= ScopeFlag_Type;
break;
}
@@ -2060,6 +2063,12 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) {
add_type_info_type_internal(c, bt->SoaPointer.elem);
break;
+ case Type_BitField:
+ add_type_info_type_internal(c, bt->BitField.backing_type);
+ for (Entity *f : bt->BitField.fields) {
+ add_type_info_type_internal(c, f->type);
+ }
+ break;
case Type_Generic:
break;
@@ -2309,6 +2318,13 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) {
add_min_dep_type_info(c, bt->SoaPointer.elem);
break;
+ case Type_BitField:
+ add_min_dep_type_info(c, bt->BitField.backing_type);
+ for (Entity *f : bt->BitField.fields) {
+ add_min_dep_type_info(c, f->type);
+ }
+ break;
+
default:
GB_PANIC("Unhandled type: %*.s", LIT(type_strings[bt->kind]));
break;
@@ -2907,6 +2923,7 @@ gb_internal void init_core_type_info(Checker *c) {
t_type_info_relative_multi_pointer = find_core_type(c, str_lit("Type_Info_Relative_Multi_Pointer"));
t_type_info_matrix = find_core_type(c, str_lit("Type_Info_Matrix"));
t_type_info_soa_pointer = find_core_type(c, str_lit("Type_Info_Soa_Pointer"));
+ t_type_info_bit_field = find_core_type(c, str_lit("Type_Info_Bit_Field"));
t_type_info_named_ptr = alloc_type_pointer(t_type_info_named);
t_type_info_integer_ptr = alloc_type_pointer(t_type_info_integer);
@@ -2936,6 +2953,7 @@ gb_internal void init_core_type_info(Checker *c) {
t_type_info_relative_multi_pointer_ptr = alloc_type_pointer(t_type_info_relative_multi_pointer);
t_type_info_matrix_ptr = alloc_type_pointer(t_type_info_matrix);
t_type_info_soa_pointer_ptr = alloc_type_pointer(t_type_info_soa_pointer);
+ t_type_info_bit_field_ptr = alloc_type_pointer(t_type_info_bit_field);
}
gb_internal void init_mem_allocator(Checker *c) {