aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.c
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-02-01 17:52:55 +0000
committerGinger Bill <bill@gingerbill.org>2017-02-01 17:52:55 +0000
commit4e7082a68dd5261c3c36eccf92a62a0ce84995a8 (patch)
tree01b5d690870b28b43a5e5c0c434495e56059babc /src/check_expr.c
parent502e63b9c50e71735c7989e59155a490bca991d2 (diff)
Change internals of `context`; Disable `immutable`
Diffstat (limited to 'src/check_expr.c')
-rw-r--r--src/check_expr.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/check_expr.c b/src/check_expr.c
index f8d966319..c8b1c3175 100644
--- a/src/check_expr.c
+++ b/src/check_expr.c
@@ -876,6 +876,7 @@ void check_identifier(Checker *c, Operand *o, AstNode *n, Type *named_type, Type
o->mode = Addressing_Invalid;
o->expr = n;
String name = n->Ident.string;
+
Entity *e = scope_lookup_entity(c->context.scope, name);
if (e == NULL) {
if (str_eq(name, str_lit("_"))) {
@@ -3987,6 +3988,23 @@ ExprKind check__expr_base(Checker *c, Operand *o, AstNode *node, Type *type_hint
goto error;
case_end;
+ case_ast_node(i, Implicit, node)
+ switch (i->kind) {
+ case Token_context:
+ if (c->context.proc_name.len == 0) {
+ error_node(node, "`context` is only allowed within procedures");
+ goto error;
+ }
+
+ o->mode = Addressing_Value;
+ o->type = t_context;
+ break;
+ default:
+ error_node(node, "Illegal implicit name `%.*s`", LIT(i->string));
+ goto error;
+ }
+ case_end;
+
case_ast_node(i, Ident, node);
check_identifier(c, o, node, NULL, type_hint);
case_end;