summaryrefslogtreecommitdiff
path: root/types.c
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2019-10-01 23:04:42 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2019-10-01 23:04:42 -0400
commit7aa7c668521caede54307fe4047cbe72f0ed5244 (patch)
treed157daf659fde834ea605f4627f5b43de7c2e4b1 /types.c
parent99a5f596a49123195c231e55564557d89506a030 (diff)
restarted eval, this time with macros!
Diffstat (limited to 'types.c')
-rw-r--r--types.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/types.c b/types.c
index 0a861cf..150a994 100644
--- a/types.c
+++ b/types.c
@@ -281,11 +281,18 @@ static bool type_resolve(Typer *tr, Type *t) {
free(s);
return false;
}
- if (!eval_expr(tr->evalr, n_expr, &val)) return false; /* resolve N */
- Integer size = val.intv;
- if (size < 0) {
- err_print(t->arr.n_expr->where, "Negative array length (" INTEGER_FMT ")", size);
- return false;
+ eval_expr(tr->evalr, n_expr, &val);
+
+ U64 size;
+ if (type_builtin_is_signed(n_expr->type.builtin)) {
+ I64 ssize = val_to_i64(&val, n_expr->type.builtin);
+ if (ssize < 0) {
+ err_print(t->arr.n_expr->where, "Negative array length (" INTEGER_FMT ")", ssize);
+ return false;
+ }
+ size = (U64)ssize;
+ } else {
+ size = val_to_u64(&val, n_expr->type.builtin);
}
t->arr.n = (UInteger)size;
} break;
@@ -773,6 +780,11 @@ static bool types_expr(Typer *tr, Expression *e) {
free(s);
return false;
}
+ if (!type_builtin_is_signed(of_type->builtin)) {
+ char *s = type_to_str(of_type);
+ warn_print(e->where, "Applying unary - to unsigned type %s may cause overflow.", s);
+ free(s);
+ }
*t = *of_type;
break;
case UNARY_ADDRESS:
@@ -833,8 +845,8 @@ static bool types_expr(Typer *tr, Expression *e) {
return false;
}
/* fallthrough */
- case BINARY_PLUS:
- case BINARY_MINUS:
+ case BINARY_ADD:
+ case BINARY_SUB:
case BINARY_MUL:
case BINARY_DIV:
case BINARY_LT:
@@ -1000,10 +1012,7 @@ static bool types_decl(Typer *tr, Declaration *d) {
if (d->flags & DECL_FLAG_CONST) {
if (!d->val) {
d->val = typer_malloc(tr, sizeof *d->val); /* OPTIM */
- if (!eval_expr(tr->evalr, &d->expr, d->val)) {
- success = false;
- goto ret;
- }
+ eval_expr(tr->evalr, &d->expr, d->val);
}
}
}