commit ef5ac4a6e8831874b370529cd530e2207a750a61
parent 7d764e57584acb74f6895bb809d79d5593c74078
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Thu, 27 Jan 2022 19:18:03 -0600
parse: enforce that if conditions are booleans with new class
Diffstat:
3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/nooc.h b/nooc.h
@@ -222,6 +222,7 @@ enum exprkind {
enum class {
C_INT = 1,
+ C_BOOL,
C_REF,
C_STR,
C_PROC,
diff --git a/parse.c b/parse.c
@@ -144,6 +144,8 @@ parseexpr(struct block *block)
expr.kind = EXPR_COND;
tok = tok->next;
expr.d.cond.cond = parseexpr(block);
+ if (exprs.data[expr.d.cond.cond].class != C_BOOL)
+ error(expr.start->line, expr.start->col, "expected boolean expression for if condition");
parseblock(&expr.d.cond.bif);
if (tok->type == TOK_ELSE) {
tok = tok->next;
@@ -238,11 +240,19 @@ parseexpr(struct block *block)
case TOK_EQUAL:
expr.kind = EXPR_BINARY;
expr.d.bop.kind = BOP_EQUAL;
- goto binary_common;
+ goto bool_common;
case TOK_GREATER:
expr.kind = EXPR_BINARY;
expr.d.bop.kind = BOP_GREATER;
- goto binary_common;
+bool_common:
+ expr.start = tok;
+ tok = tok->next;
+ expr.d.bop.left = parseexpr(block);
+ expr.d.bop.right = parseexpr(block);
+ if (exprs.data[expr.d.bop.left].class != exprs.data[expr.d.bop.right].class)
+ error(tok->line, tok->col, "expected boolean expression operands to be of same class");
+ expr.class = C_BOOL;
+ break;
case TOK_PLUS:
expr.kind = EXPR_BINARY;
expr.d.bop.kind = BOP_PLUS;
diff --git a/test/if_nobool.fail.nooc b/test/if_nobool.fail.nooc
@@ -0,0 +1,4 @@
+let main proc() = proc () {
+ if + 1 2 {
+ }
+}+
\ No newline at end of file