aboutsummaryrefslogtreecommitdiff
path: root/src/checker/expr.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-04 16:16:17 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-04 16:16:17 +0100
commitc2e3c3801acd8af32fcf6ea3ad2d3a2ddc94c870 (patch)
tree4686866a14b65f9d9c4a37567c8593f7951b1881 /src/checker/expr.cpp
parentcdd8eadda172b3ced7a774dfa1f22a976b3bdb7f (diff)
Type match statement for tagged unions
Diffstat (limited to 'src/checker/expr.cpp')
-rw-r--r--src/checker/expr.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/checker/expr.cpp b/src/checker/expr.cpp
index 60788a16c..a3ffd6ccc 100644
--- a/src/checker/expr.cpp
+++ b/src/checker/expr.cpp
@@ -296,12 +296,16 @@ void check_fields(Checker *c, AstNode *node, AstNode *decl_list,
ast_node(vd, VarDecl, decl);
if (vd->kind != Declaration_Mutable)
continue;
- Type *type = check_type(c, vd->type, NULL, cycle_checker);
+ Type *base_type = check_type(c, vd->type, NULL, cycle_checker);
for (AstNode *name = vd->name_list; name != NULL; name = name->next) {
Token name_token = name->Ident;
+ Type *type = make_type_named(c->allocator, name_token.string, base_type, NULL);
Entity *e = make_entity_type_name(c->allocator, c->context.scope, name_token, type);
+ type->Named.type_name = e;
+ add_entity(c, c->context.scope, name, e);
+
HashKey key = hash_string(name_token.string);
if (map_get(&entity_map, key) != NULL) {
// TODO(bill): Scope checking already checks the declaration
@@ -309,7 +313,6 @@ void check_fields(Checker *c, AstNode *node, AstNode *decl_list,
} else {
map_set(&entity_map, key, e);
fields[field_index++] = e;
- add_entity(c, c->context.scope, name, e);
}
add_entity_use(&c->info, name, e);
}
@@ -3154,7 +3157,9 @@ ExprKind check__expr_base(Checker *c, Operand *o, AstNode *node, Type *type_hint
goto error;
}
- check_index_value(c, ie->index, max_count, NULL);
+ i64 index = 0;
+ b32 ok = check_index_value(c, ie->index, max_count, &index);
+
case_end;