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

Reply via email to