gingerBill 10 months ago
parent
commit
417e9bb37f
1 changed files with 8 additions and 2 deletions
  1. 8 2
      src/check_expr.cpp

+ 8 - 2
src/check_expr.cpp

@@ -285,7 +285,7 @@ gb_internal void error_operand_no_value(Operand *o) {
 	if (o->mode == Addressing_NoValue) {
 		Ast *x = unparen_expr(o->expr);
 
-		if (x->kind == Ast_CallExpr) {
+		if (x != nullptr && x->kind == Ast_CallExpr) {
 			Ast *p = unparen_expr(x->CallExpr.proc);
 			if (p->kind == Ast_BasicDirective) {
 				String tag = p->BasicDirective.name.string;
@@ -297,7 +297,7 @@ gb_internal void error_operand_no_value(Operand *o) {
 		}
 
 		gbString err = expr_to_string(o->expr);
-		if (x->kind == Ast_CallExpr) {
+		if (x != nullptr && x->kind == Ast_CallExpr) {
 			error(o->expr, "'%s' call does not return a value and cannot be used as a value", err);
 		} else {
 			error(o->expr, "'%s' used as a value", err);
@@ -3901,6 +3901,12 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ
 		// IMPORTANT NOTE(bill): This uses right-left evaluation in type checking only no in
 		check_expr(c, y, be->right);
 		Type *rhs_type = type_deref(y->type);
+		if (rhs_type == nullptr) {
+			error(y->expr, "Cannot use '%.*s' on an expression with no value", LIT(op.string));
+			x->mode = Addressing_Invalid;
+			x->expr = node;
+			return;
+		}
 
 		if (is_type_bit_set(rhs_type)) {
 			Type *elem = base_type(rhs_type)->BitSet.elem;