From 884d5fed9f2894a91ede38fb073338b1fe94a483 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 16 Aug 2018 15:16:57 +0100 Subject: bit_set['A'..'Z'], bit_set[0..8] --- src/check_expr.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src/check_expr.cpp') diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 1bcac33ae..3b7571f74 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2047,14 +2047,23 @@ void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, bool use_lhs_as ExactValue v = exact_value_to_integer(y->value); GB_ASSERT(k.kind == ExactValue_Integer); GB_ASSERT(v.kind == ExactValue_Integer); - i64 bit = 1ll<mode = Addressing_Constant; - x->type = t_untyped_bool; - x->value = exact_value_bool((bit & bits) != 0); - x->expr = node; - return; + i64 key = big_int_to_i64(&k.value_integer); + i64 lower = yt->BitSet.lower; + i64 upper = yt->BitSet.upper; + + if (lower <= key && key <= upper) { + i64 bit = 1ll<mode = Addressing_Constant; + x->type = t_untyped_bool; + x->value = exact_value_bool((bit & bits) != 0); + x->expr = node; + return; + } else { + error(x->expr, "key '%lld' out of range of bit set, %lld..%lld", key, lower, upper); + x->mode = Addressing_Invalid; + } } } else { @@ -5591,7 +5600,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type if (is_type_bit_set(type)) { // NOTE(bill): Encode as an integer - i64 lower = base_type(type)->BitSet.min; + i64 lower = base_type(type)->BitSet.lower; u64 bits = 0; for_array(index, cl->elems) { -- cgit v1.2.3