Module Name:    src
Committed By:   rillig
Date:           Sun Mar 10 19:45:14 UTC 2024

Modified Files:
        src/tests/usr.bin/xlint/lint1: expr_fold.c msg_141.c
            platform_ilp32_int.c platform_ilp32_long.c platform_lp64.c
        src/usr.bin/xlint/lint1: err.c tree.c

Log Message:
lint: add details to the message about integer overflow

Having only the operator was too unspecific to be actionable, so add the
actual numbers and the data type.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/tests/usr.bin/xlint/lint1/expr_fold.c
cvs rdiff -u -r1.15 -r1.16 src/tests/usr.bin/xlint/lint1/msg_141.c
cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c
cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/xlint/lint1/platform_lp64.c
cvs rdiff -u -r1.231 -r1.232 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.622 -r1.623 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.14 src/tests/usr.bin/xlint/lint1/expr_fold.c:1.15
--- src/tests/usr.bin/xlint/lint1/expr_fold.c:1.14	Sun Mar 10 14:32:30 2024
+++ src/tests/usr.bin/xlint/lint1/expr_fold.c	Sun Mar 10 19:45:14 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: expr_fold.c,v 1.14 2024/03/10 14:32:30 rillig Exp $	*/
+/*	$NetBSD: expr_fold.c,v 1.15 2024/03/10 19:45:14 rillig Exp $	*/
 # 3 "expr_fold.c"
 
 /*
@@ -59,9 +59,9 @@ fold_uminus(void)
 	/* The '-' is an operator, it is not part of the integer constant. */
 	take_int(-2147483648);
 
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */
 	take_int(-(2147483647 + 1));
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '-(-2147483648)' overflows 'int' [141] */
 	take_int(-(-2147483647 - 1));
 	/* expect+1: warning: conversion of 'long' to 'int' is out of range, arg #1 [295] */
 	take_int(-(4294967295));
@@ -99,14 +99,14 @@ void
 fold_mult(void)
 {
 	take_int(32767 * 65536);
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '32768 * 65536' overflows 'int' [141] */
 	take_int(32768 * 65536);
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '65536 * 65536' overflows 'int' [141] */
 	take_int(65536 * 65536);
 
 	take_uint(32767 * 65536U);
 	take_uint(32768 * 65536U);
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '65536 * 65536' overflows 'unsigned int' [141] */
 	take_uint(65536 * 65536U);
 }
 
@@ -138,13 +138,13 @@ fold_mod(void)
 void
 fold_plus(void)
 {
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */
 	take_int(2147483647 + 1);
 
 	/* Assume two's complement, so no overflow. */
 	take_int(-2147483647 + -1);
 
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '-2147483647 + -2' overflows 'int' [141] */
 	take_int(-2147483647 + -2);
 
 	/*
@@ -161,25 +161,25 @@ fold_plus(void)
 void
 fold_minus(void)
 {
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '2147483647 - -1' overflows 'int' [141] */
 	take_int(2147483647 - -1);
 	/* Assume two's complement. */
 	take_int(-2147483647 - 1);
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '-2147483647 - 2' overflows 'int' [141] */
 	take_int(-2147483647 - 2);
 
 	take_int(0 - 2147483648);
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '0 - 2147483648' overflows 'unsigned int' [141] */
 	take_uint(0 - 2147483648U);
 }
 
 void
 fold_shl(void)
 {
-	/* expect+1: warning: operator '<<' produces integer overflow [141] */
+	/* expect+1: warning: '16777216 << 24' overflows 'int' [141] */
 	take_int(1 << 24 << 24);
 
-	/* expect+1: warning: operator '<<' produces integer overflow [141] */
+	/* expect+1: warning: '16777216 << 24' overflows 'unsigned int' [141] */
 	take_uint(1U << 24 << 24);
 
 	/* expect+1: warning: shift amount 104 is greater than bit-size 32 of 'unsigned int' [122] */

Index: src/tests/usr.bin/xlint/lint1/msg_141.c
diff -u src/tests/usr.bin/xlint/lint1/msg_141.c:1.15 src/tests/usr.bin/xlint/lint1/msg_141.c:1.16
--- src/tests/usr.bin/xlint/lint1/msg_141.c:1.15	Sun Mar 10 15:49:12 2024
+++ src/tests/usr.bin/xlint/lint1/msg_141.c	Sun Mar 10 19:45:14 2024
@@ -1,7 +1,7 @@
-/*	$NetBSD: msg_141.c,v 1.15 2024/03/10 15:49:12 rillig Exp $	*/
+/*	$NetBSD: msg_141.c,v 1.16 2024/03/10 19:45:14 rillig Exp $	*/
 # 3 "msg_141.c"
 
-// Test for message: operator '%s' produces integer overflow [141]
+// Test for message: '%s' overflows '%s' [141]
 
 /* lint1-extra-flags: -h -X 351 */
 
@@ -89,7 +89,7 @@ uplus_u64(void)
 void
 uminus_s32(void)
 {
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '-(-2147483648)' overflows 'int' [141] */
 	s32 = -(-0x7fffffff - 1);
 	s32 = - -1;
 	s32 = -0;
@@ -108,7 +108,7 @@ uminus_u32(void)
 void
 uminus_s64(void)
 {
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '-(-9223372036854775808)' overflows 'long long' [141] */
 	s64 = -(-0x7fffffffffffffffLL - 1LL);
 	s64 = - -1LL;
 	s64 = -0LL;
@@ -127,11 +127,11 @@ uminus_u64(void)
 void
 mult_s32(void)
 {
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '-65536 * 65536' overflows 'int' [141] */
 	s32 = -0x00010000 * +0x00010000;	// -0x0100000000
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '-3 * 715827883' overflows 'int' [141] */
 	s32 = -0x00000003 * +0x2aaaaaab;	// -0x80000001
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '715827883 * -3' overflows 'int' [141] */
 	s32 = +0x2aaaaaab * -0x00000003;	// -0x80000001
 	s32 = -0x00000008 * +0x10000000;	// -0x80000000
 	s32 = +0x10000000 * -0x00000008;	// -0x80000000
@@ -139,13 +139,13 @@ mult_s32(void)
 	s32 = +0x3fffffff * +0x00000002;	// +0x7ffffffe
 	s32 = +0x7fffffff * +0x00000001;	// +0x7fffffff
 	s32 = +0x00000001 * +0x7fffffff;	// +0x7fffffff
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '2 * 1073741824' overflows 'int' [141] */
 	s32 = +0x00000002 * +0x40000000;	// +0x80000000
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '1073741824 * 2' overflows 'int' [141] */
 	s32 = +0x40000000 * +0x00000002;	// +0x80000000
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '65535 * 65537' overflows 'int' [141] */
 	s32 = +0x0000ffff * +0x00010001;	// +0xffffffff
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '65536 * 65536' overflows 'int' [141] */
 	s32 = +0x00010000 * +0x00010000;	// +0x0100000000
 }
 
@@ -153,18 +153,18 @@ void
 mult_u32(void)
 {
 	u32 = 0xffffU * 0x10001U;		// +0xffffffff
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '65536 * 65536' overflows 'unsigned int' [141] */
 	u32 = 0x10000U * 0x10000U;		// +0x0100000000
 }
 
 void
 mult_s64(void)
 {
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '-4294967296 * 4294967296' overflows 'long long' [141] */
 	s64 = -0x100000000LL * 0x100000000LL;	// -0x010000000000000000
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '-3 * 3074457345618258603' overflows 'long long' [141] */
 	s64 = -3LL * 0x2aaaaaaaaaaaaaabLL;	// -0x8000000000000001
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '3074457345618258603 * -3' overflows 'long long' [141] */
 	s64 = 0x2aaaaaaaaaaaaaabLL * -3LL;	// -0x8000000000000001
 	s64 = -8LL * +0x1000000000000000LL;	// -0x8000000000000000
 	s64 = +0x1000000000000000LL * -8LL;	// -0x8000000000000000
@@ -172,13 +172,13 @@ mult_s64(void)
 	s64 = +0x3fffffffffffffffLL * +2LL;	// +0x7ffffffffffffffe
 	s64 = +0x7fffffffffffffffLL * +1LL;	// +0x7fffffffffffffff
 	s64 = +1LL * +0x7fffffffffffffffLL;	// +0x7fffffffffffffff
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '2 * 4611686018427387904' overflows 'long long' [141] */
 	s64 = +2LL * +0x4000000000000000LL;	// +0x8000000000000000
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '4611686018427387904 * 2' overflows 'long long' [141] */
 	s64 = +0x4000000000000000LL * +2LL;	// +0x8000000000000000
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '4294967295 * 4294967297' overflows 'long long' [141] */
 	s64 = +0xffffffffLL * +0x100000001LL;	// +0xffffffffffffffff
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '4294967296 * 4294967296' overflows 'long long' [141] */
 	s64 = +0x100000000LL * +0x100000000LL;	// +0x010000000000000000
 }
 
@@ -187,14 +187,14 @@ mult_u64(void)
 {
 	u64 = 0xffffffffULL * 0x100000001ULL;	// +0xffffffffffffffff
 	u64 = 0x00010000ULL * 0x00010000ULL;	// +0x0100000000
-	/* expect+1: warning: operator '*' produces integer overflow [141] */
+	/* expect+1: warning: '4294967296 * 4294967296' overflows 'unsigned long long' [141] */
 	u64 = 0x100000000ULL * 0x100000000ULL;	// +0x010000000000000000
 }
 
 void
 div_s32(void)
 {
-	/* expect+1: warning: operator '/' produces integer overflow [141] */
+	/* expect+1: warning: '-2147483648 / -1' overflows 'int' [141] */
 	s32 = (-0x7fffffff - 1) / -1;
 	s32 = (-0x7fffffff - 1) / 1;
 	s32 = 0x7fffffff / -1;
@@ -218,7 +218,7 @@ div_u32(void)
 void
 div_s64(void)
 {
-	/* expect+1: warning: operator '/' produces integer overflow [141] */
+	/* expect+1: warning: '-9223372036854775808 / -1' overflows 'long long' [141] */
 	s64 = (-0x7fffffffffffffffLL - 1LL) / -1LL;
 	s64 = (-0x7fffffffffffffffLL - 1LL) / 1LL;
 	s64 = (-0x7fffffffffffffffLL - 1LL) / 0x7fffffffffffffffLL;
@@ -247,7 +247,7 @@ mod_s32(void)
 {
 	s32 = -1 % (-0x7fffffff - 1);
 	s32 = -1 % 0x7fffffff;
-	/* expect+1: warning: operator '%' produces integer overflow [141] */
+	/* expect+1: warning: '-2147483648 % -1' overflows 'int' [141] */
 	s32 = (-0x7fffffff - 1) % -1;
 	s32 = 0x7fffffff % -1;
 }
@@ -268,7 +268,7 @@ mod_s64(void)
 {
 	s64 = -1LL % (-0x7fffffffffffffffLL - 1LL);
 	s64 = -1LL % 0x7fffffffffffffffLL;
-	/* expect+1: warning: operator '%' produces integer overflow [141] */
+	/* expect+1: warning: '-9223372036854775808 % -1' overflows 'long long' [141] */
 	s64 = (-0x7fffffffffffffffLL - 1LL) % -1LL;
 	s64 = 0x7fffffffffffffffLL % -1LL;
 }
@@ -287,11 +287,11 @@ mod_u64(void)
 void
 plus_s32(void)
 {
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '-2147483647 + -2147483647' overflows 'int' [141] */
 	s32 = -0x7fffffff + -0x7fffffff;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '-2147483647 + -2' overflows 'int' [141] */
 	s32 = -0x7fffffff + -2;			// INT_MIN - 1
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '-2 + -2147483647' overflows 'int' [141] */
 	s32 = -2 + -0x7fffffff;			// INT_MIN - 1
 	s32 = -0x7fffffff + -1;			// INT_MIN
 	s32 = -1 + -0x7fffffff;			// INT_MIN
@@ -303,13 +303,13 @@ plus_s32(void)
 	s32 = 1 + 0x7ffffffe;			// INT_MAX
 	s32 = 0x7fffffff + 0;			// INT_MAX
 	s32 = 0 + 0x7fffffff;			// INT_MAX
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */
 	s32 = 0x7fffffff + 1;			// INT_MAX + 1
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '1 + 2147483647' overflows 'int' [141] */
 	s32 = 1 + 0x7fffffff;			// INT_MAX + 1
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '1073741824 + 1073741824' overflows 'int' [141] */
 	s32 = 0x40000000 + 0x40000000;		// INT_MAX + 1
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '2147483647 + 2147483647' overflows 'int' [141] */
 	s32 = 0x7fffffff + 0x7fffffff;
 }
 
@@ -321,22 +321,22 @@ plus_u32(void)
 	u32 = 0xffffffffU + 0x00000000U;
 	u32 = 0x00000000U + 0xffffffffU;
 	u32 = 0xfffffffeU + 0x00000001U;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '4294967295 + 1' overflows 'unsigned int' [141] */
 	u32 = 0xffffffffU + 0x00000001U;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '1 + 4294967295' overflows 'unsigned int' [141] */
 	u32 = 0x00000001U + 0xffffffffU;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '4294967295 + 4294967295' overflows 'unsigned int' [141] */
 	u32 = 0xffffffffU + 0xffffffffU;
 }
 
 void
 plus_s64(void)
 {
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '-9223372036854775807 + -2' overflows 'long long' [141] */
 	s64 = -0x7fffffffffffffffLL + -2LL;
 	s64 = -0x7fffffffffffffffLL + -1LL;
 	s64 = 0x7ffffffffffffffeLL + 1LL;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '9223372036854775807 + 1' overflows 'long long' [141] */
 	s64 = 0x7fffffffffffffffLL + 1LL;
 }
 
@@ -347,18 +347,18 @@ plus_u64(void)
 	u64 = 0xffffffffffffffffULL + 0x0000000000000000ULL;
 	u64 = 0x0000000000000000ULL + 0xffffffffffffffffULL;
 	u64 = 0xfffffffffffffffeULL + 0x0000000000000001ULL;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '18446744073709551615 + 1' overflows 'unsigned long long' [141] */
 	u64 = 0xffffffffffffffffULL + 0x0000000000000001ULL;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '1 + 18446744073709551615' overflows 'unsigned long long' [141] */
 	u64 = 0x0000000000000001ULL + 0xffffffffffffffffULL;
-	/* expect+1: warning: operator '+' produces integer overflow [141] */
+	/* expect+1: warning: '18446744073709551615 + 18446744073709551615' overflows 'unsigned long long' [141] */
 	u64 = 0xffffffffffffffffULL + 0xffffffffffffffffULL;
 }
 
 void
 minus_s32(void)
 {
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '-2147483647 - 2' overflows 'int' [141] */
 	s32 = -0x7fffffff - 2;
 	s32 = -0x7fffffff - 1;
 	s32 = -0x7fffffff - 1 - 0;
@@ -366,7 +366,7 @@ minus_s32(void)
 	s32 = 0x7fffffff - 0x7fffffff;
 	s32 = 0x7fffffff - 1;
 	s32 = 0x7fffffff - 0;
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '2147483647 - -1' overflows 'int' [141] */
 	s32 = 0x7fffffff - -1;
 }
 
@@ -374,12 +374,12 @@ void
 minus_u32(void)
 {
 	u32 = 0x00000000U - 0x00000000U;
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '0 - 1' overflows 'unsigned int' [141] */
 	u32 = 0x00000000U - 0x00000001U;
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '0 - 2147483648' overflows 'unsigned int' [141] */
 	u32 = 0x00000000U - 0x80000000U;
 	u32 = 0x80000000U - 0x00000001U;
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '0 - 4294967295' overflows 'unsigned int' [141] */
 	u32 = 0x00000000U - 0xffffffffU;
 	u32 = 0xffffffffU - 0x00000000U;
 	u32 = 0xffffffffU - 0xffffffffU;
@@ -388,18 +388,18 @@ minus_u32(void)
 void
 minus_s64(void)
 {
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '-9223372036854775807 - 9223372036854775807' overflows 'long long' [141] */
 	s64 = -0x7fffffffffffffffLL - 0x7fffffffffffffffLL;
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '-9223372036854775807 - 2' overflows 'long long' [141] */
 	s64 = -0x7fffffffffffffffLL - 2LL;
 	s64 = -0x7fffffffffffffffLL - 1LL;
 	s64 = -0x7fffffffffffffffLL - 0LL;
 	s64 = -0x7fffffffffffffffLL - -1LL;
 	s64 = 0x7fffffffffffffffLL - 1LL;
 	s64 = 0x7fffffffffffffffLL - 0LL;
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '9223372036854775807 - -1' overflows 'long long' [141] */
 	s64 = 0x7fffffffffffffffLL - -1LL;
-	/* expect+1: warning: operator '-' produces integer overflow [141] */
+	/* expect+1: warning: '9223372036854775807 - -9223372036854775807' overflows 'long long' [141] */
 	s64 = 0x7fffffffffffffffLL - -0x7fffffffffffffffLL;
 }
 
@@ -412,9 +412,9 @@ minus_u64(void)
 void
 shl_s32(void)
 {
-	/* expect+1: warning: operator '<<' produces integer overflow [141] */
+	/* expect+1: warning: '256 << 23' overflows 'int' [141] */
 	s32 = 0x0100 << 23;
-	/* expect+1: warning: operator '<<' produces integer overflow [141] */
+	/* expect+1: warning: '256 << 24' overflows 'int' [141] */
 	s32 = 0x0100 << 24;
 	/* expect+1: warning: shift amount 18446744073709551615 is greater than bit-size 32 of 'int' [122] */
 	s32 = 0 << 0xffffffffffffffff;
@@ -424,7 +424,7 @@ void
 shl_u32(void)
 {
 	u32 = 0x0100U << 23;
-	/* expect+1: warning: operator '<<' produces integer overflow [141] */
+	/* expect+1: warning: '256 << 24' overflows 'unsigned int' [141] */
 	u32 = 0x0100U << 24;
 	/* expect+1: warning: negative shift [121] */
 	u32 = 0x0000U << -1;

Index: src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c
diff -u src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.5 src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.6
--- src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.5	Sun Mar 10 16:06:13 2024
+++ src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c	Sun Mar 10 19:45:14 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: platform_ilp32_int.c,v 1.5 2024/03/10 16:06:13 rillig Exp $	*/
+/*	$NetBSD: platform_ilp32_int.c,v 1.6 2024/03/10 19:45:14 rillig Exp $	*/
 # 3 "platform_ilp32_int.c"
 
 /*
@@ -64,22 +64,22 @@ array_index(void)
 
 	/* expect+1: warning: array subscript cannot be > 19: 16777215 [168] */
 	u64 += u64_buf[0x00ffffff];
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '2147483647 * 8' overflows 'int' [141] */
 	/* expect+1: warning: array subscript cannot be > 19: 268435455 [168] */
 	u64 += u64_buf[0x7fffffff];
 	/* expect+3: warning: conversion of 'long long' to 'int' is out of range [119] */
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */
 	/* expect+1: warning: array subscript cannot be negative: -268435456 [167] */
 	u64 += u64_buf[2147483648];
 	/* expect+3: warning: conversion of 'unsigned int' to 'int' is out of range [119] */
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */
 	/* expect+1: warning: array subscript cannot be negative: -268435456 [167] */
 	u64 += u64_buf[0x80000000];
 	/* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */
 	/* expect+1: warning: array subscript cannot be negative: -1 [167] */
 	u64 += u64_buf[0xffffffff];
 	/* expect+3: warning: conversion of 'unsigned int' to 'int' is out of range [119] */
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */
 	/* expect+1: warning: array subscript cannot be negative: -268435456 [167] */
 	u64 += u64_buf[0x80000000];
 	/* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */

Index: src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c
diff -u src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c:1.7 src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c:1.8
--- src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c:1.7	Sun Mar 10 16:06:13 2024
+++ src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c	Sun Mar 10 19:45:14 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: platform_ilp32_long.c,v 1.7 2024/03/10 16:06:13 rillig Exp $	*/
+/*	$NetBSD: platform_ilp32_long.c,v 1.8 2024/03/10 19:45:14 rillig Exp $	*/
 # 3 "platform_ilp32_long.c"
 
 /*
@@ -73,22 +73,22 @@ array_index(void)
 
 	/* expect+1: warning: array subscript cannot be > 19: 16777215 [168] */
 	u64 += u64_buf[0x00ffffff];
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '2147483647 * 8' overflows 'long' [141] */
 	/* expect+1: warning: array subscript cannot be > 19: 268435455 [168] */
 	u64 += u64_buf[0x7fffffff];
 	/* expect+3: warning: conversion of 'long long' to 'long' is out of range [119] */
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */
 	/* expect+1: warning: array subscript cannot be negative: -268435456 [167] */
 	u64 += u64_buf[2147483648];
 	/* expect+3: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */
 	/* expect+1: warning: array subscript cannot be negative: -268435456 [167] */
 	u64 += u64_buf[0x80000000];
 	/* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
 	/* expect+1: warning: array subscript cannot be negative: -1 [167] */
 	u64 += u64_buf[0xffffffff];
 	/* expect+3: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */
 	/* expect+1: warning: array subscript cannot be negative: -268435456 [167] */
 	u64 += u64_buf[0x80000000];
 	/* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */

Index: src/tests/usr.bin/xlint/lint1/platform_lp64.c
diff -u src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.11 src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.12
--- src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.11	Sun Mar 10 16:06:13 2024
+++ src/tests/usr.bin/xlint/lint1/platform_lp64.c	Sun Mar 10 19:45:14 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: platform_lp64.c,v 1.11 2024/03/10 16:06:13 rillig Exp $	*/
+/*	$NetBSD: platform_lp64.c,v 1.12 2024/03/10 19:45:14 rillig Exp $	*/
 # 3 "platform_lp64.c"
 
 /*
@@ -91,13 +91,13 @@ array_index(void)
 	u64 += u64_buf[0x00ffffffffffffff];
 	/* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */
 	u64 += u64_buf[0x0fffffffffffffff];
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '2305843009213693951 * 8' overflows 'long' [141] */
 	/* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */
 	u64 += u64_buf[0x1fffffffffffffff];
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '4611686018427387903 * 8' overflows 'long' [141] */
 	/* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */
 	u64 += u64_buf[0x3fffffffffffffff];
-	/* expect+2: warning: operator '*' produces integer overflow [141] */
+	/* expect+2: warning: '9223372036854775807 * 8' overflows 'long' [141] */
 	/* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */
 	u64 += u64_buf[0x7fffffffffffffff];
 	/* expect+1: warning: array subscript cannot be negative: -1 [167] */

Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.231 src/usr.bin/xlint/lint1/err.c:1.232
--- src/usr.bin/xlint/lint1/err.c:1.231	Sun Mar  3 13:09:22 2024
+++ src/usr.bin/xlint/lint1/err.c	Sun Mar 10 19:45:14 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: err.c,v 1.231 2024/03/03 13:09:22 rillig Exp $	*/
+/*	$NetBSD: err.c,v 1.232 2024/03/10 19:45:14 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: err.c,v 1.231 2024/03/03 13:09:22 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.232 2024/03/10 19:45:14 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -196,7 +196,7 @@ static const char *const msgs[] = {
 	"unknown operand size, op '%s'",				// 138
 	"division by 0",						// 139
 	"modulus by 0",							// 140
-	"operator '%s' produces integer overflow",			// 141
+	"'%s' overflows '%s'",						// 141
 	"operator '%s' produces floating point overflow",		// 142
 	"cannot take size/alignment of incomplete type",		// 143
 	"cannot take size/alignment of function type '%s'",		// 144

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.622 src/usr.bin/xlint/lint1/tree.c:1.623
--- src/usr.bin/xlint/lint1/tree.c:1.622	Sun Mar 10 16:06:13 2024
+++ src/usr.bin/xlint/lint1/tree.c	Sun Mar 10 19:45:14 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.622 2024/03/10 16:06:13 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.623 2024/03/10 19:45:14 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.622 2024/03/10 16:06:13 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.623 2024/03/10 19:45:14 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -967,6 +967,19 @@ fold_constant_integer(tnode_t *tn)
 		if (u_res > mask)
 			overflow = true;
 		res = (int64_t)u_res;
+		if (overflow && hflag) {
+			char buf[128];
+			if (is_binary(tn)) {
+				snprintf(buf, sizeof(buf), "%ju %s %ju",
+				    (uintmax_t)l, op_name(tn->tn_op),
+				    (uintmax_t)r);
+			} else {
+				snprintf(buf, sizeof(buf), "%s%ju",
+				    op_name(tn->tn_op), (uintmax_t)l);
+			}
+			/* '%s' overflows '%s' */
+			warning(141, buf, type_name(tn->tn_type));
+		}
 	} else {
 		int64_t max_value = (int64_t)(mask >> 1);
 		int64_t min_value = -max_value - 1;
@@ -974,12 +987,24 @@ fold_constant_integer(tnode_t *tn)
 		    l, r, min_value, max_value, &overflow);
 		if (res < min_value || res > max_value)
 			overflow = true;
+		if (overflow && hflag) {
+			char buf[128];
+			if (is_binary(tn)) {
+				snprintf(buf, sizeof(buf), "%jd %s %jd",
+				    (intmax_t)l, op_name(tn->tn_op),
+				    (intmax_t)r);
+			} else if (tn->tn_op == UMINUS && l < 0) {
+				snprintf(buf, sizeof(buf), "-(%jd)",
+				    (intmax_t)l);
+			} else {
+				snprintf(buf, sizeof(buf), "%s%jd",
+				    op_name(tn->tn_op), (intmax_t)l);
+			}
+			/* '%s' overflows '%s' */
+			warning(141, buf, type_name(tn->tn_type));
+		}
 	}
 
-	if (overflow && hflag)
-		/* operator '%s' produces integer overflow */
-		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(res, t, 0);

Reply via email to