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);