Module Name: src
Committed By: rillig
Date: Sun Mar 10 10:31:29 UTC 2024
Modified Files:
src/tests/usr.bin/xlint/lint1: expr_fold.c msg_141.c
src/usr.bin/xlint/lint1: tree.c
Log Message:
lint: remove wrong warning about overflow in unary '-' for unsigned
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/tests/usr.bin/xlint/lint1/expr_fold.c \
src/tests/usr.bin/xlint/lint1/msg_141.c
cvs rdiff -u -r1.616 -r1.617 src/usr.bin/xlint/lint1/tree.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/usr.bin/xlint/lint1/expr_fold.c
diff -u src/tests/usr.bin/xlint/lint1/expr_fold.c:1.12 src/tests/usr.bin/xlint/lint1/expr_fold.c:1.13
--- src/tests/usr.bin/xlint/lint1/expr_fold.c:1.12 Sat Mar 9 23:55:11 2024
+++ src/tests/usr.bin/xlint/lint1/expr_fold.c Sun Mar 10 10:31:29 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_fold.c,v 1.12 2024/03/09 23:55:11 rillig Exp $ */
+/* $NetBSD: expr_fold.c,v 1.13 2024/03/10 10:31:29 rillig Exp $ */
# 3 "expr_fold.c"
/*
@@ -292,7 +292,6 @@ struct ctassert5_struct {
void
unary_minus_overflow(unsigned long long val)
{
- /* expect+1: warning: operator '-' produces integer overflow [141] */
if (val > -(unsigned long long)(-0x7fffffffffffffffL - 1))
return;
}
Index: src/tests/usr.bin/xlint/lint1/msg_141.c
diff -u src/tests/usr.bin/xlint/lint1/msg_141.c:1.12 src/tests/usr.bin/xlint/lint1/msg_141.c:1.13
--- src/tests/usr.bin/xlint/lint1/msg_141.c:1.12 Sun Mar 10 10:15:52 2024
+++ src/tests/usr.bin/xlint/lint1/msg_141.c Sun Mar 10 10:31:29 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_141.c,v 1.12 2024/03/10 10:15:52 rillig Exp $ */
+/* $NetBSD: msg_141.c,v 1.13 2024/03/10 10:31:29 rillig Exp $ */
# 3 "msg_141.c"
// Test for message: operator '%s' produces integer overflow [141]
@@ -101,7 +101,6 @@ uminus_u32(void)
{
u32 = -0x00000000U;
u32 = -0x7fffffffU;
- /* expect+1: warning: operator '-' produces integer overflow [141] */
u32 = -0x80000000U;
u32 = -0xffffffffU;
}
@@ -121,7 +120,6 @@ uminus_u64(void)
{
u64 = -0x0000000000000000ULL;
u64 = -0x7fffffffffffffffULL;
- /* expect+1: warning: operator '-' produces integer overflow [141] */
u64 = -0x8000000000000000ULL;
u64 = -0xffffffffffffffffULL;
}
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.616 src/usr.bin/xlint/lint1/tree.c:1.617
--- src/usr.bin/xlint/lint1/tree.c:1.616 Sun Mar 10 10:15:51 2024
+++ src/usr.bin/xlint/lint1/tree.c Sun Mar 10 10:31:29 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.616 2024/03/10 10:15:51 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.617 2024/03/10 10:31:29 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.616 2024/03/10 10:15:51 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.617 2024/03/10 10:31:29 rillig Exp $");
#endif
#include <float.h>
@@ -797,9 +797,6 @@ static tnode_t *
fold_constant_integer(tnode_t *tn)
{
- val_t *v = xcalloc(1, sizeof(*v));
- v->v_tspec = tn->tn_type->t_tspec;
-
lint_assert(has_operands(tn));
tspec_t t = tn->u.ops.left->tn_type->t_tspec;
bool utyp = !is_integer(t) || is_uinteger(t);
@@ -822,9 +819,12 @@ fold_constant_integer(tnode_t *tn)
si = sl;
break;
case UMINUS:
- si = sl == INT64_MIN ? sl : -sl;
- if (sl != 0 && msb(si, t) == msb(sl, t))
- ovfl = true;
+ if (utyp)
+ si = (int64_t)-ul;
+ else {
+ ovfl = sl == min_value;
+ si = ovfl ? sl : -sl;
+ }
break;
case MULT:
if (utyp) {
@@ -937,6 +937,8 @@ fold_constant_integer(tnode_t *tn)
warning(141, op_name(tn->tn_op));
}
+ val_t *v = xcalloc(1, sizeof(*v));
+ v->v_tspec = tn->tn_type->t_tspec;
v->u.integer = convert_integer(si, t, 0);
tnode_t *cn = build_constant(tn->tn_type, v);