diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2026-01-24 14:32:33 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-24 14:32:33 +0100 |
| commit | cd684ed7a06173cd6164b9511f467a4e7828f3a0 (patch) | |
| tree | 53ab14c961b9dc32b28fd7f1b4792f33bb25ab81 /src/check_expr.cpp | |
| parent | 756c17ef7848bd6ffb6289361213178cc7d7e47b (diff) | |
| parent | 5e4895e76dc5bb5ee4357037433825907403457e (diff) | |
Merge pull request #6159 from Barinzaya/fix-const-bitset-contains
Fix `in`/`not_in` on constant `bit_set`s
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 4e791af16..42a398597 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4125,15 +4125,19 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ i64 upper = yt->BitSet.upper; if (lower <= key && key <= upper) { - i64 bit = 1ll<<key; - i64 bits = big_int_to_i64(&v.value_integer); + BigInt idx = big_int_make_i64(key - lower); + BigInt bit = big_int_make_i64(1); + big_int_shl_eq(&bit, &idx); + + BigInt mask = {}; + big_int_and(&mask, &bit, &v.value_integer); x->mode = Addressing_Constant; x->type = t_untyped_bool; if (op.kind == Token_in) { - x->value = exact_value_bool((bit & bits) != 0); + x->value = exact_value_bool(!big_int_is_zero(&mask)); } else { - x->value = exact_value_bool((bit & bits) == 0); + x->value = exact_value_bool(big_int_is_zero(&mask)); } x->expr = node; return; |