aboutsummaryrefslogtreecommitdiff
path: root/src/checker/stmt.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-08-25 19:52:51 +0100
committerGinger Bill <bill@gingerbill.org>2016-08-25 19:52:51 +0100
commit3a189b9c1ca273105ba030322e151efd85825482 (patch)
tree126679aa7ec0bffb6752045419087416be3588bf /src/checker/stmt.cpp
parentf93cf3827ba5cde4f054db99b9815cb2a18ba861 (diff)
Save before Demo 001
Diffstat (limited to 'src/checker/stmt.cpp')
-rw-r--r--src/checker/stmt.cpp40
1 files changed, 31 insertions, 9 deletions
diff --git a/src/checker/stmt.cpp b/src/checker/stmt.cpp
index e4dc5f7f3..7b9664595 100644
--- a/src/checker/stmt.cpp
+++ b/src/checker/stmt.cpp
@@ -359,16 +359,30 @@ void check_const_decl(Checker *c, Entity *e, AstNode *type_expr, AstNode *init_e
check_init_constant(c, e, &operand);
}
-void check_type_decl(Checker *c, Entity *e, AstNode *type_expr, Type *named_type) {
+void check_type_decl(Checker *c, Entity *e, AstNode *type_expr, Type *def, CycleChecker *cycle_checker) {
GB_ASSERT(e->type == NULL);
Type *named = make_type_named(c->allocator, e->token.string, NULL, e);
named->Named.type_name = e;
- set_base_type(named_type, named);
+ if (def != NULL && def->kind == Type_Named) {
+ def->Named.base = named;
+ }
e->type = named;
- check_type(c, type_expr, named);
+ CycleChecker local_cycle_checker = {};
+ if (cycle_checker == NULL) {
+ cycle_checker = &local_cycle_checker;
+ }
+ defer (if (local_cycle_checker.path != NULL) {
+ gb_array_free(local_cycle_checker.path);
+ });
+
+ check_type(c, type_expr, named, cycle_checker_add(cycle_checker, e));
+
- set_base_type(named, get_base_type(get_base_type(named)));
+ named->Named.base = get_base_type(named->Named.base);
+ if (named->Named.base == t_invalid) {
+ gb_printf("%s\n", type_to_string(named));
+ }
}
void check_proc_body(Checker *c, Token token, DeclInfo *decl, Type *type, AstNode *body) {
@@ -486,7 +500,7 @@ void check_var_decl(Checker *c, Entity *e, Entity **entities, isize entity_count
-void check_entity_decl(Checker *c, Entity *e, DeclInfo *d, Type *named_type) {
+void check_entity_decl(Checker *c, Entity *e, DeclInfo *d, Type *named_type, CycleChecker *cycle_checker) {
if (e->type != NULL)
return;
switch (e->kind) {
@@ -498,9 +512,17 @@ void check_entity_decl(Checker *c, Entity *e, DeclInfo *d, Type *named_type) {
c->context.decl = d;
check_var_decl(c, e, d->entities, d->entity_count, d->type_expr, d->init_expr);
break;
- case Entity_TypeName:
- check_type_decl(c, e, d->type_expr, named_type);
- break;
+ case Entity_TypeName: {
+ CycleChecker local_cycle_checker = {};
+ if (cycle_checker == NULL) {
+ cycle_checker = &local_cycle_checker;
+ }
+ check_type_decl(c, e, d->type_expr, named_type, cycle_checker);
+
+ if (local_cycle_checker.path != NULL) {
+ gb_array_free(local_cycle_checker.path);
+ }
+ } break;
case Entity_Procedure:
check_proc_decl(c, e, d, true);
break;
@@ -875,7 +897,7 @@ void check_stmt(Checker *c, AstNode *node, u32 flags) {
ast_node(name, Ident, td->name);
Entity *e = make_entity_type_name(c->allocator, c->context.scope, name->token, NULL);
add_entity(c, c->context.scope, td->name, e);
- check_type_decl(c, e, td->type, NULL);
+ check_type_decl(c, e, td->type, NULL, NULL);
case_end;
}
}