aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-10-30 14:12:49 +0000
committergingerBill <bill@gingerbill.org>2024-10-30 14:12:49 +0000
commit2392300ffbc86b09fde2a4d170b8c38f8ad0d382 (patch)
treefc9f2b91842f8652a3b7216b5fed77a1408451a5 /src
parent35d818bb4ee041741e64101da9ea957feae9e99d (diff)
Add warning for `unsigned >= 0` like conditions in a `for` loop
Diffstat (limited to 'src')
-rw-r--r--src/check_stmt.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp
index 74a9e8825..2418fcc5c 100644
--- a/src/check_stmt.cpp
+++ b/src/check_stmt.cpp
@@ -2600,6 +2600,23 @@ gb_internal void check_for_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) {
check_expr(ctx, &o, fs->cond);
if (o.mode != Addressing_Invalid && !is_type_boolean(o.type)) {
error(fs->cond, "Non-boolean condition in 'for' statement");
+ } else {
+ Ast *cond = unparen_expr(o.expr);
+ if (cond && cond->kind == Ast_BinaryExpr &&
+ cond->BinaryExpr.left && cond->BinaryExpr.right &&
+ cond->BinaryExpr.op.kind == Token_GtEq &&
+ is_type_unsigned(type_of_expr(cond->BinaryExpr.left)) &&
+ cond->BinaryExpr.right->tav.value.kind == ExactValue_Integer &&
+ is_exact_value_zero(cond->BinaryExpr.right->tav.value)) {
+ warning(cond, "Expression is always true since unsigned numbers are always >= 0");
+ } else if (cond && cond->kind == Ast_BinaryExpr &&
+ cond->BinaryExpr.left && cond->BinaryExpr.right &&
+ cond->BinaryExpr.op.kind == Token_LtEq &&
+ is_type_unsigned(type_of_expr(cond->BinaryExpr.right)) &&
+ cond->BinaryExpr.left->tav.value.kind == ExactValue_Integer &&
+ is_exact_value_zero(cond->BinaryExpr.left->tav.value)) {
+ warning(cond, "Expression is always true since unsigned numbers are always >= 0");
+ }
}
}
if (fs->post != nullptr) {