aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-11-04 11:22:06 +0000
committergingerBill <bill@gingerbill.org>2023-11-04 11:22:06 +0000
commitce5e7998ba235d3f444220f4093bf52d8615af21 (patch)
treecd7206561e7fd7a64ea5c89a4b8027b37090e199 /src/check_expr.cpp
parente206d6ba35796e2aab97c7741dc52d44317350c1 (diff)
Add warning for things like `1.0 / some_int`
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 2ee761b9c..d85f119c3 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -3558,6 +3558,30 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ
return;
}
+ switch (op.kind) {
+ case Token_Quo:
+ case Token_Mod:
+ case Token_ModMod:
+ case Token_QuoEq:
+ case Token_ModEq:
+ case Token_ModModEq:
+ if (is_type_integer(y->type) && !is_type_untyped(y->type) &&
+ is_type_float(x->type) && is_type_untyped(x->type)) {
+ char const *suggestion = "\tSuggestion: Try explicitly casting the constant value for clarity";
+
+ gbString t = type_to_string(y->type);
+ if (x->value.kind != ExactValue_Invalid) {
+ gbString s = exact_value_to_string(x->value);
+ warning(node, "Dividing an untyped float '%s' by '%s' will perform integer division\n%s", s, t, suggestion);
+ gb_string_free(s);
+ } else {
+ warning(node, "Dividing an untyped float by '%s' will perform integer division\n%s", t, suggestion);
+ }
+ gb_string_free(t);
+ }
+ break;
+ }
+
convert_to_typed(c, x, y->type);
if (x->mode == Addressing_Invalid) {
return;