Browse Source

Correct `add_to_seen_map` logic

gingerBill 3 years ago
parent
commit
dd84b61cc8
2 changed files with 10 additions and 6 deletions
  1. 7 3
      src/check_expr.cpp
  2. 3 3
      src/check_stmt.cpp

+ 7 - 3
src/check_expr.cpp

@@ -7018,7 +7018,7 @@ void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind upper_op, Ope
 		Type *bt = base_type(x.type);
 		Type *bt = base_type(x.type);
 		GB_ASSERT(bt->kind == Type_Enum);
 		GB_ASSERT(bt->kind == Type_Enum);
 		for (i64 vi = v0; vi <= v1; vi++) {
 		for (i64 vi = v0; vi <= v1; vi++) {
-			if (upper_op != Token_GtEq && vi == v1) {
+			if (upper_op != Token_LtEq && vi == v1) {
 				break;
 				break;
 			}
 			}
 
 
@@ -7040,7 +7040,7 @@ void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind upper_op, Ope
 		}
 		}
 	} else {
 	} else {
 		add_constant_switch_case(ctx, seen, lhs);
 		add_constant_switch_case(ctx, seen, lhs);
-		if (upper_op == Token_GtEq) {
+		if (upper_op == Token_LtEq) {
 			add_constant_switch_case(ctx, seen, rhs);
 			add_constant_switch_case(ctx, seen, rhs);
 		}
 		}
 	}
 	}
@@ -8036,7 +8036,11 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
 
 
 						is_constant = is_constant && operand.mode == Addressing_Constant;
 						is_constant = is_constant && operand.mode == Addressing_Constant;
 
 
-						add_to_seen_map(c, &seen, op.kind, x, x, y);
+						TokenKind upper_op = Token_LtEq;
+						if (op.kind == Token_RangeHalf) {
+							upper_op = Token_Lt;
+						}
+						add_to_seen_map(c, &seen, upper_op, x, x, y);
 					} else {
 					} else {
 						Operand op_index = {};
 						Operand op_index = {};
 						check_expr_with_type_hint(c, &op_index, fv->field, index_type);
 						check_expr_with_type_hint(c, &op_index, fv->field, index_type);

+ 3 - 3
src/check_stmt.cpp

@@ -961,9 +961,9 @@ void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) {
 
 
 				TokenKind upper_op = Token_Invalid;
 				TokenKind upper_op = Token_Invalid;
 				switch (be->op.kind) {
 				switch (be->op.kind) {
-				case Token_Ellipsis:  upper_op = Token_GtEq; break;
-				case Token_RangeFull: upper_op = Token_GtEq; break;
-				case Token_RangeHalf: upper_op = Token_Gt;   break;
+				case Token_Ellipsis:  upper_op = Token_LtEq; break;
+				case Token_RangeFull: upper_op = Token_LtEq; break;
+				case Token_RangeHalf: upper_op = Token_Lt;   break;
 				default: GB_PANIC("Invalid range operator"); break;
 				default: GB_PANIC("Invalid range operator"); break;
 				}
 				}