Module Name:    src
Committed By:   rillig
Date:           Sat Mar  9 23:55:11 UTC 2024

Modified Files:
        src/tests/usr.bin/xlint/lint1: expr_fold.c
        src/usr.bin/xlint/lint1: tree.c

Log Message:
lint: fix excessive overflow warning after division by zero


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/xlint/lint1/expr_fold.c
cvs rdiff -u -r1.613 -r1.614 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.11 src/tests/usr.bin/xlint/lint1/expr_fold.c:1.12
--- src/tests/usr.bin/xlint/lint1/expr_fold.c:1.11	Sat Jan  6 15:05:24 2024
+++ src/tests/usr.bin/xlint/lint1/expr_fold.c	Sat Mar  9 23:55:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: expr_fold.c,v 1.11 2024/01/06 15:05:24 rillig Exp $	*/
+/*	$NetBSD: expr_fold.c,v 1.12 2024/03/09 23:55:11 rillig Exp $	*/
 # 3 "expr_fold.c"
 
 /*
@@ -114,9 +114,7 @@ fold_mult(void)
 void
 fold_div(void)
 {
-	/* expect+3: error: division by 0 [139] */
-	/* XXX: The following message is redundant. */
-	/* expect+1: warning: operator '/' produces integer overflow [141] */
+	/* expect+1: error: division by 0 [139] */
 	take_int(0 / 0);
 
 	/* expect+1: warning: conversion of 'long' to 'int' is out of range, arg #1 [295] */

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.613 src/usr.bin/xlint/lint1/tree.c:1.614
--- src/usr.bin/xlint/lint1/tree.c:1.613	Sat Mar  9 14:54:14 2024
+++ src/usr.bin/xlint/lint1/tree.c	Sat Mar  9 23:55:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.613 2024/03/09 14:54:14 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.614 2024/03/09 23:55:11 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.613 2024/03/09 14:54:14 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.614 2024/03/09 23:55:11 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -809,6 +809,8 @@ fold_constant_integer(tnode_t *tn)
 		ur = sr = tn->u.ops.right->u.value.u.integer;
 
 	uint64_t mask = value_bits(size_in_bits(t));
+	int64_t max_value = (int64_t)(mask >> 1);
+	int64_t min_value = -max_value - 1;
 	bool ovfl = false;
 
 	int64_t si;
@@ -841,11 +843,9 @@ fold_constant_integer(tnode_t *tn)
 		if (sr == 0) {
 			/* division by 0 */
 			error(139);
-			si = utyp ? -1 : INT64_MAX;
-		} else if (!utyp
-		    && (sl & mask) == (mask ^ (mask >> 1)) && sr == -1) {
-			/* operator '%s' produces integer overflow */
-			warning(141, op_name(DIV));
+			si = utyp ? -1 : max_value;
+		} else if (!utyp && sl == min_value && sr == -1) {
+			ovfl = true;
 			si = sl;
 		} else
 			si = utyp ? (int64_t)(ul / ur) : sl / sr;

Reply via email to