summaryrefslogtreecommitdiff
path: root/types.c
diff options
context:
space:
mode:
Diffstat (limited to 'types.c')
-rw-r--r--types.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/types.c b/types.c
index 3e038e6..517c1b7 100644
--- a/types.c
+++ b/types.c
@@ -155,24 +155,7 @@ static bool expr_must_lval(Expression *e) {
return false;
}
return true;
- case EXPR_CAST:
- case EXPR_NEW:
- case EXPR_FN:
- case EXPR_LITERAL_FLOAT:
- case EXPR_LITERAL_CHAR:
- case EXPR_LITERAL_STR:
- case EXPR_LITERAL_INT:
- case EXPR_LITERAL_BOOL:
- case EXPR_IF:
- case EXPR_WHILE:
- case EXPR_FOR:
- case EXPR_CALL:
- case EXPR_C:
- case EXPR_BUILTIN:
- case EXPR_BLOCK:
- case EXPR_SLICE:
- case EXPR_TYPE:
- case EXPR_VAL: {
+ default: {
err_print(e->where, "Cannot use %s as l-value.", expr_kind_to_str(e->kind));
return false;
}
@@ -190,7 +173,7 @@ static bool type_is_compileonly(Type *t) {
case TYPE_UNKNOWN:
return false;
case TYPE_BUILTIN:
- return t->builtin == BUILTIN_TYPE;
+ return t->builtin == BUILTIN_TYPE || t->builtin == BUILTIN_NMS;
case TYPE_PTR:
return type_is_compileonly(t->ptr);
case TYPE_SLICE:
@@ -611,6 +594,7 @@ static bool type_can_be_truthy(Type *t) {
case TYPE_BUILTIN:
switch (t->builtin) {
case BUILTIN_TYPE:
+ case BUILTIN_NMS:
return false;
case BUILTIN_I8:
case BUILTIN_U8:
@@ -677,6 +661,7 @@ static Status type_cast_status(Type *from, Type *to) {
case BUILTIN_CHAR:
return STATUS_NONE;
case BUILTIN_TYPE:
+ case BUILTIN_NMS:
return STATUS_ERR;
}
assert(0);
@@ -707,6 +692,7 @@ static Status type_cast_status(Type *from, Type *to) {
return STATUS_NONE;
case BUILTIN_CHAR:
case BUILTIN_TYPE:
+ case BUILTIN_NMS:
return STATUS_ERR;
}
assert(0);
@@ -718,6 +704,7 @@ static Status type_cast_status(Type *from, Type *to) {
case BUILTIN_BOOL:
return type_can_be_truthy(to) ? STATUS_NONE : STATUS_ERR;
case BUILTIN_TYPE:
+ case BUILTIN_NMS:
return STATUS_ERR;
}
break;
@@ -2137,6 +2124,12 @@ static bool types_expr(Typer *tr, Expression *e) {
t->kind = TYPE_BUILTIN;
t->builtin = BUILTIN_TYPE;
break;
+ case EXPR_NMS: {
+ if (!types_block(tr, &e->nms.body))
+ return false;
+ t->kind = TYPE_BUILTIN;
+ t->builtin = BUILTIN_NMS;
+ } break;
case EXPR_VAL:
assert(0);
return false;
@@ -2194,6 +2187,7 @@ static bool types_block(Typer *tr, Block *b) {
arr_remove_lasta(&b->stmts, tr->allocr);
}
}
+
}
ret:
typer_block_exit(tr);
@@ -2439,7 +2433,6 @@ static void typer_create(Typer *tr, Evaluator *ev, ErrCtx *err_ctx, Allocator *a
tr->fn = NULL;
tr->evalr = ev;
tr->err_ctx = err_ctx;
- tr->exptr = NULL; /* by default, don't set an exporter */
tr->in_decls = NULL;
tr->in_expr_decls = NULL;
tr->allocr = allocr;