aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-08-18 22:52:57 +0100
committergingerBill <bill@gingerbill.org>2024-08-18 22:52:57 +0100
commitd99a6ad003a3606f877abfc1745090007674b76b (patch)
treed3f1ce6a82bb9d8e51b5b021d753d1d9d30310a0 /src/check_expr.cpp
parent95c3b8a8def04c7725d6e8b3523d28be7c48046c (diff)
Add suggestion for `~uint(0)` if `cast(uint)-1` is done
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index df138f77c..f4d5cc5a4 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -2332,14 +2332,24 @@ gb_internal bool check_integer_exceed_suggestion(CheckerContext *c, Operand *o,
}
BigInt *bi = &o->value.value_integer;
if (is_type_unsigned(type)) {
+ BigInt one = big_int_make_u64(1);
+ BigInt max_size = big_int_make_u64(1);
+ BigInt bits = big_int_make_i64(bit_size);
+ big_int_shl_eq(&max_size, &bits);
+ big_int_sub_eq(&max_size, &one);
+
if (big_int_is_neg(bi)) {
error_line("\tA negative value cannot be represented by the unsigned integer type '%s'\n", b);
+ BigInt dst = {};
+ big_int_neg(&dst, bi);
+ if (big_int_cmp(&dst, &max_size) < 0) {
+ big_int_sub_eq(&dst, &one);
+ String dst_str = big_int_to_string(temporary_allocator(), &dst);
+ gbString t = type_to_string(type);
+ error_line("\tSuggestion: ~%s(%.*s)\n", t, LIT(dst_str));
+ gb_string_free(t);
+ }
} else {
- BigInt one = big_int_make_u64(1);
- BigInt max_size = big_int_make_u64(1);
- BigInt bits = big_int_make_i64(bit_size);
- big_int_shl_eq(&max_size, &bits);
- big_int_sub_eq(&max_size, &one);
String max_size_str = big_int_to_string(temporary_allocator(), &max_size);
if (size_changed) {