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;