diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-02-01 17:52:55 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-02-01 17:52:55 +0000 |
| commit | 4e7082a68dd5261c3c36eccf92a62a0ce84995a8 (patch) | |
| tree | 01b5d690870b28b43a5e5c0c434495e56059babc /src/check_expr.c | |
| parent | 502e63b9c50e71735c7989e59155a490bca991d2 (diff) | |
Change internals of `context`; Disable `immutable`
Diffstat (limited to 'src/check_expr.c')
| -rw-r--r-- | src/check_expr.c | 18 |
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; |