Module Name: src
Committed By: rillig
Date: Thu Jan 2 18:36:52 UTC 2025
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_132.c
src/usr.bin/xlint/lint1: tree.c
Log Message:
lint: fix assertion failure in pointer subtraction
To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/tests/usr.bin/xlint/lint1/msg_132.c
cvs rdiff -u -r1.667 -r1.668 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.50 src/tests/usr.bin/xlint/lint1/msg_132.c:1.51
--- src/tests/usr.bin/xlint/lint1/msg_132.c:1.50 Thu Jan 2 17:35:02 2025
+++ src/tests/usr.bin/xlint/lint1/msg_132.c Thu Jan 2 18:36:52 2025
@@ -1,10 +1,8 @@
-/* $NetBSD: msg_132.c,v 1.50 2025/01/02 17:35:02 rillig Exp $ */
+/* $NetBSD: msg_132.c,v 1.51 2025/01/02 18:36:52 rillig Exp $ */
# 3 "msg_132.c"
// Test for message: conversion from '%s' to '%s' may lose accuracy [132]
-/* lint1-extra-flags: -X 351 */
-
/*
* NetBSD's default lint flags only include a single -a, which only flags
* narrowing conversions from long. To get warnings for all narrowing
@@ -13,7 +11,7 @@
* https://gnats.netbsd.org/14531
*/
-/* lint1-extra-flags: -aa */
+/* lint1-extra-flags: -aa -X 351 */
typedef unsigned char u8_t;
typedef unsigned short u16_t;
@@ -37,6 +35,8 @@ s16_t s16;
s32_t s32;
s64_t s64;
+const char *ptr;
+
struct bit_fields {
unsigned u1:1;
unsigned u2:2;
@@ -376,6 +376,8 @@ test_ic_plus(void)
u16 = u32 % 0x00010000 + 0xffff0000 + 0x00010000;
s8 = '0' + s64 % 10;
+
+ ptr = ptr + 3;
}
void
@@ -400,6 +402,11 @@ test_ic_minus(void)
u16 = s16 - -0x8000;
u32 = s32 - -0x80000000;
u64 = s64 - -0x8000000000000000;
+
+ ptr = ptr - 3;
+ s64 = ptr + 3 - ptr;
+ /* expect+1: warning: conversion from 'long' to 'unsigned int' may lose accuracy [132] */
+ u32 = ptr + 3 - ptr;
}
void
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.667 src/usr.bin/xlint/lint1/tree.c:1.668
--- src/usr.bin/xlint/lint1/tree.c:1.667 Thu Jan 2 17:35:01 2025
+++ src/usr.bin/xlint/lint1/tree.c Thu Jan 2 18:36:51 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.667 2025/01/02 17:35:01 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.668 2025/01/02 18:36:51 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.667 2025/01/02 17:35:01 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.668 2025/01/02 18:36:51 rillig Exp $");
#endif
#include <float.h>
@@ -439,16 +439,16 @@ ic_con(const type_t *tp, const val_t *v)
static integer_constraints
ic_cvt(const type_t *ntp, const type_t *otp, integer_constraints a)
{
- unsigned nw = width_in_bits(ntp);
- unsigned ow = width_in_bits(otp);
- bool nu = is_uinteger(ntp->t_tspec);
- bool ou = is_uinteger(otp->t_tspec);
+ unsigned new_width = width_in_bits(ntp);
+ unsigned old_width = width_in_bits(otp);
+ bool new_unsigned = is_uinteger(ntp->t_tspec);
+ bool old_unsigned = is_uinteger(otp->t_tspec);
- if (nw >= ow && nu == ou)
+ if (new_width >= old_width && new_unsigned == old_unsigned)
return a;
- if (nw > ow && ou)
+ if (new_width > old_width && old_unsigned)
return a;
- if (nu && (~value_bits(nw) & ~a.bclr) == 0)
+ if (new_unsigned && (~value_bits(new_width) & ~a.bclr) == 0)
return a;
return ic_any(ntp);
}
@@ -478,6 +478,8 @@ ic_expr(const tnode_t *tn)
rc = ic_expr(before_conversion(tn->u.ops.right));
return ic_plus(tn->tn_type, lc, rc);
case MINUS:
+ if (tn->u.ops.left->tn_type->t_tspec == PTR)
+ return ic_any(tn->tn_type);
lc = ic_expr(before_conversion(tn->u.ops.left));
rc = ic_expr(before_conversion(tn->u.ops.right));
return ic_minus(tn->tn_type, lc, rc);