Module Name:    src
Committed By:   rillig
Date:           Sun Aug 18 15:21:09 UTC 2024

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

Log Message:
lint: add value propagation for '/' combined with bit operations

Fixes __SHIFTIN/__SHIFTOUT expressions, as in PR toolchain/58617.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/tests/usr.bin/xlint/lint1/msg_132.c
cvs rdiff -u -r1.649 -r1.650 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/msg_132.c
diff -u src/tests/usr.bin/xlint/lint1/msg_132.c:1.41 src/tests/usr.bin/xlint/lint1/msg_132.c:1.42
--- src/tests/usr.bin/xlint/lint1/msg_132.c:1.41	Sun Aug 18 15:11:43 2024
+++ src/tests/usr.bin/xlint/lint1/msg_132.c	Sun Aug 18 15:21:09 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_132.c,v 1.41 2024/08/18 15:11:43 rillig Exp $	*/
+/*	$NetBSD: msg_132.c,v 1.42 2024/08/18 15:21:09 rillig Exp $	*/
 # 3 "msg_132.c"
 
 // Test for message: conversion from '%s' to '%s' may lose accuracy [132]
@@ -458,6 +458,5 @@ binary_operators_on_bit_fields(void)
 unsigned char
 combine_arithmetic_and_bit_operations(unsigned int c32)
 {
-	/* expect+1: warning: conversion from 'unsigned int' to 'unsigned char' may lose accuracy [132] */
 	return 0xc0 | (c32 & 0x07c0) / 64;
 }

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.649 src/usr.bin/xlint/lint1/tree.c:1.650
--- src/usr.bin/xlint/lint1/tree.c:1.649	Wed Jul 10 20:33:37 2024
+++ src/usr.bin/xlint/lint1/tree.c	Sun Aug 18 15:21:09 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.649 2024/07/10 20:33:37 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.650 2024/08/18 15:21:09 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.649 2024/07/10 20:33:37 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.650 2024/08/18 15:21:09 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -172,7 +172,7 @@ ic_bitand(integer_constraints a, integer
 	c.smin = INT64_MIN;
 	c.smax = INT64_MAX;
 	c.umin = 0;
-	c.umax = UINT64_MAX;
+	c.umax = ~(a.bclr | b.bclr);
 	c.bset = a.bset & b.bset;
 	c.bclr = a.bclr | b.bclr;
 	return c;
@@ -186,7 +186,7 @@ ic_bitor(integer_constraints a, integer_
 	c.smin = INT64_MIN;
 	c.smax = INT64_MAX;
 	c.umin = 0;
-	c.umax = UINT64_MAX;
+	c.umax = ~(a.bclr & b.bclr);
 	c.bset = a.bset | b.bset;
 	c.bclr = a.bclr & b.bclr;
 	return c;
@@ -210,6 +210,23 @@ ic_mod(const type_t *tp, integer_constra
 }
 
 static integer_constraints
+ic_div(const type_t *tp, integer_constraints a, integer_constraints b)
+{
+	integer_constraints c;
+
+	if (ic_maybe_signed(tp, &a) || ic_maybe_signed(tp, &b) || b.umin == 0)
+		return ic_any(tp);
+
+	c.smin = INT64_MIN;
+	c.smax = INT64_MAX;
+	c.umin = a.umin / b.umax;
+	c.umax = a.umax / b.umin;
+	c.bset = 0;
+	c.bclr = ~u64_fill_right(c.umax);
+	return c;
+}
+
+static integer_constraints
 ic_shl(const type_t *tp, integer_constraints a, integer_constraints b)
 {
 	integer_constraints c;
@@ -288,6 +305,10 @@ ic_expr(const tnode_t *tn)
 			return ic_any(tn->tn_type);
 		lc = ic_expr(tn->u.ops.left);
 		return ic_cvt(tn->tn_type, tn->u.ops.left->tn_type, lc);
+	case DIV:
+		lc = ic_expr(before_conversion(tn->u.ops.left));
+		rc = ic_expr(before_conversion(tn->u.ops.right));
+		return ic_div(tn->tn_type, lc, rc);
 	case MOD:
 		lc = ic_expr(before_conversion(tn->u.ops.left));
 		rc = ic_expr(before_conversion(tn->u.ops.right));

Reply via email to