aboutsummaryrefslogtreecommitdiff
path: root/src/checker/stmt.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-02 15:51:48 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-02 15:51:48 +0100
commite1a6775661d1ef57b84effa9b4c567c030b87556 (patch)
tree47de7c1dee8b691d750c1b35833194c8b0fe8d8a /src/checker/stmt.cpp
parent25e9b9bc87a5b4fa14fc7d47ca3077849ee5648d (diff)
Runtime assert
Diffstat (limited to 'src/checker/stmt.cpp')
-rw-r--r--src/checker/stmt.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/checker/stmt.cpp b/src/checker/stmt.cpp
index ed8b340d8..3508321c7 100644
--- a/src/checker/stmt.cpp
+++ b/src/checker/stmt.cpp
@@ -203,6 +203,21 @@ Type *check_init_variable(Checker *c, Entity *e, Operand *operand, String contex
if (operand->mode == Addressing_Invalid ||
operand->type == t_invalid ||
e->type == t_invalid) {
+
+ if (operand->mode == Addressing_Builtin) {
+ gbString expr_str = expr_to_string(operand->expr);
+ defer (gb_string_free(expr_str));
+
+ // TODO(bill): is this a good enough error message?
+ error(&c->error_collector, ast_node_token(operand->expr),
+ "Cannot assign builtin procedure `%s` in %.*s",
+ expr_str,
+ LIT(context_name));
+
+ operand->mode = Addressing_Invalid;
+ }
+
+
if (e->type == NULL)
e->type = t_invalid;
return NULL;
@@ -530,7 +545,7 @@ void check_entity_decl(Checker *c, Entity *e, DeclInfo *d, Type *named_type, Cyc
-void check_var_decl(Checker *c, AstNode *node) {
+void check_var_decl_node(Checker *c, AstNode *node) {
ast_node(vd, VarDecl, node);
isize entity_count = vd->name_count;
isize entity_index = 0;
@@ -1150,7 +1165,7 @@ void check_stmt(Checker *c, AstNode *node, u32 flags) {
if (vd->name_count > 1 && vd->type != NULL) {
error(&c->error_collector, us->token, "`using` can only be applied to one variable of the same type");
}
- check_var_decl(c, us->node);
+ check_var_decl_node(c, us->node);
for (AstNode *item = vd->name_list; item != NULL; item = item->next) {
ast_node(i, Ident, item);
@@ -1191,7 +1206,7 @@ void check_stmt(Checker *c, AstNode *node, u32 flags) {
case_ast_node(vd, VarDecl, node);
- check_var_decl(c, node);
+ check_var_decl_node(c, node);
case_end;
case_ast_node(pd, ProcDecl, node);