error message when case expressions aren't CT
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 13 Apr 2021 17:58:15 +0000 (12:58 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 13 Apr 2021 17:58:15 +0000 (12:58 -0500)
bin/onyx
src/onyxchecker.c

index 2659edc1821c2a41c6594e663a15c256466cd5d0..d65379e6bef26769a5cc99665db366d6b4eee585 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 83602da106054ea638ac9f2cba860154303d42c0..48f21eee41cac098a6dc38a2dedda6d25913370f 100644 (file)
@@ -267,7 +267,11 @@ CheckStatus check_switch(AstSwitch* switchnode) {
                 AstRangeLiteral* rl = (AstRangeLiteral *) (*value);
                 resolve_expression_type(rl->low);
                 resolve_expression_type(rl->high);
-                assert(rl->low->kind == Ast_Kind_NumLit && rl->high->kind == Ast_Kind_NumLit);
+
+                if (rl->low->kind != Ast_Kind_NumLit || rl->high->kind != Ast_Kind_NumLit) {
+                    onyx_report_error(rl->token->pos, "case statement expected compile time known range.");
+                    return Check_Error;
+                }
 
                 promote_numlit_to_larger((AstNumLit *) rl->low);
                 promote_numlit_to_larger((AstNumLit *) rl->high);
@@ -568,9 +572,21 @@ CheckStatus check_binop_assignment(AstBinaryOp* binop, b32 assignment_is_ok) {
 
             if (binop->right->type->kind == Type_Kind_Compound) {
                 AstCompound* lhs = (AstCompound *) binop->left;
-                assert(lhs->kind == Ast_Kind_Compound);
+                if (lhs->kind != Ast_Kind_Compound) {
+                    onyx_report_error(binop->token->pos,
+                            "Expected left hand side to have %d expressions.",
+                            binop->right->type->Compound.count);
+                    return Check_Error;
+                }
 
                 i32 expr_count = binop->right->type->Compound.count;
+                if (bh_arr_length(lhs->exprs) != expr_count) {
+                    onyx_report_error(binop->token->pos,
+                            "Expected left hand side to have %d expressions.",
+                            binop->right->type->Compound.count);
+                    return Check_Error;
+                }
+
                 fori (i, 0, expr_count) {
                     lhs->exprs[i]->type = binop->right->type->Compound.types[i];
                 }
@@ -1346,7 +1362,6 @@ CheckStatus check_expression(AstTyped** pexpr) {
             break;
 
         case Ast_Kind_NumLit:
-            // NOTE: Literal types should have been decided in the parser (for now).
             assert(expr->type != NULL);
             break;