Module Name: src Committed By: rillig Date: Thu Feb 20 21:53:28 UTC 2025
Modified Files: src/tests/usr.bin/xlint/lint1: msg_306.c src/usr.bin/xlint/lint1: err.c tree.c Log Message: lint: add detail to message about truncated constant To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/msg_306.c cvs rdiff -u -r1.263 -r1.264 src/usr.bin/xlint/lint1/err.c cvs rdiff -u -r1.671 -r1.672 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_306.c diff -u src/tests/usr.bin/xlint/lint1/msg_306.c:1.5 src/tests/usr.bin/xlint/lint1/msg_306.c:1.6 --- src/tests/usr.bin/xlint/lint1/msg_306.c:1.5 Fri Jul 7 19:45:22 2023 +++ src/tests/usr.bin/xlint/lint1/msg_306.c Thu Feb 20 21:53:28 2025 @@ -1,32 +1,40 @@ -/* $NetBSD: msg_306.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */ +/* $NetBSD: msg_306.c,v 1.6 2025/02/20 21:53:28 rillig Exp $ */ # 3 "msg_306.c" -// Test for message: constant truncated by conversion, op '%s' [306] +// Test for message: constant %s truncated by conversion, op '%s' [306] /* lint1-extra-flags: -X 351 */ -unsigned char -to_u8(void) -{ - /* expect+1: warning: conversion of 'int' to 'unsigned char' is out of range [119] */ - return 12345; -} - -unsigned char -and_u8(unsigned char a) -{ - /* XXX: unused bits in constant */ - return a & 0x1234; -} +signed char s8; +unsigned char u8; -unsigned char -or_u8(unsigned char a) +void +msg_306(void) { - /* expect+1: warning: constant truncated by conversion, op '|=' [306] */ - a |= 0x1234; + u8 = 0xff; + /* expect+1: warning: constant truncated by assignment [165] */ + u8 = 0x100; + + u8 &= 0xff; + /* expect+1: warning: constant 0x100 truncated by conversion, op '&=' [306] */ + u8 &= 0x100; + /* XXX: Lint doesn't care about the expanded form of the same code. */ + u8 = u8 & 0x100; + u8 |= 0xff; + /* expect+1: warning: constant 0x100 truncated by conversion, op '|=' [306] */ + u8 |= 0x100; /* XXX: Lint doesn't care about the expanded form of the same code. */ - a = a | 0x1234; + u8 = u8 | 0x100; - return a; + s8 &= 0xff; + /* expect+1: warning: constant 0x100 truncated by conversion, op '&=' [306] */ + s8 &= 0x100; + /* XXX: Lint doesn't care about the expanded form of the same code. */ + s8 = s8 & 0x100; + s8 |= 0xff; + /* expect+1: warning: constant 0x100 truncated by conversion, op '|=' [306] */ + s8 |= 0x100; + /* XXX: Lint doesn't care about the expanded form of the same code. */ + s8 = s8 | 0x100; } Index: src/usr.bin/xlint/lint1/err.c diff -u src/usr.bin/xlint/lint1/err.c:1.263 src/usr.bin/xlint/lint1/err.c:1.264 --- src/usr.bin/xlint/lint1/err.c:1.263 Thu Feb 20 20:59:34 2025 +++ src/usr.bin/xlint/lint1/err.c Thu Feb 20 21:53:28 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: err.c,v 1.263 2025/02/20 20:59:34 rillig Exp $ */ +/* $NetBSD: err.c,v 1.264 2025/02/20 21:53:28 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: err.c,v 1.263 2025/02/20 20:59:34 rillig Exp $"); +__RCSID("$NetBSD: err.c,v 1.264 2025/02/20 21:53:28 rillig Exp $"); #endif #include <limits.h> @@ -361,7 +361,7 @@ static const char *const msgs[] = { "conversion of %s to %s requires a cast", // 303 "conversion of %s to %s requires a cast, arg #%d", // 304 "conversion of %s to %s requires a cast, op %s", // 305 - "constant truncated by conversion, op '%s'", // 306 + "constant %s truncated by conversion, op '%s'", // 306 "static variable '%s' set but not used", // 307 "invalid type for _Complex", // 308 "extra bits set to 0 in conversion of '%s' to '%s', op '%s'", // 309 Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.671 src/usr.bin/xlint/lint1/tree.c:1.672 --- src/usr.bin/xlint/lint1/tree.c:1.671 Thu Feb 20 20:59:34 2025 +++ src/usr.bin/xlint/lint1/tree.c Thu Feb 20 21:53:28 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.671 2025/02/20 20:59:34 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.672 2025/02/20 21:53:28 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.671 2025/02/20 20:59:34 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.672 2025/02/20 21:53:28 rillig Exp $"); #endif #include <float.h> @@ -4045,17 +4045,27 @@ convert_constant_to_floating(tspec_t nt, return true; } -/* - * Print a warning if bits which were set are lost due to the conversion. - * This can happen with operator ORASS only. - */ +static void +warn_constant_truncated(op_t op, const val_t *v) +{ + char buf[256]; + bool is_unsigned = is_uinteger(v->v_tspec); + int64_t val = v->u.integer; + unsigned long long abs_val = is_unsigned || val >= 0 + ? (unsigned long long)val + : -(unsigned long long)val; + const char *sign = is_unsigned || val >= 0 ? "" : "-"; + snprintf(buf, sizeof(buf), "%s%#llx", sign, abs_val); + /* constant %s truncated by conversion, op '%s' */ + warning(306, buf, op_name(op)); +} + static void convert_constant_check_range_bitor(size_t nsz, size_t osz, const val_t *v, uint64_t xmask, op_t op) { if (nsz < osz && (v->u.integer & xmask) != 0) - /* constant truncated by conversion, op '%s' */ - warning(306, op_name(op)); + warn_constant_truncated(op, v); } static void @@ -4073,8 +4083,7 @@ convert_constant_check_range_bitand(size } else if (nsz < osz && (v->u.integer & xmask) != xmask && (v->u.integer & xmask) != 0) - /* constant truncated by conversion, op '%s' */ - warning(306, op_name(op)); + warn_constant_truncated(op, v); } static void