diff options
| author | gingerBill <bill@gingerbill.org> | 2023-11-04 11:22:06 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-11-04 11:22:06 +0000 |
| commit | ce5e7998ba235d3f444220f4093bf52d8615af21 (patch) | |
| tree | cd7206561e7fd7a64ea5c89a4b8027b37090e199 /src/check_expr.cpp | |
| parent | e206d6ba35796e2aab97c7741dc52d44317350c1 (diff) | |
Add warning for things like `1.0 / some_int`
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 24 |
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; |