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;