Module Name: src
Committed By: rillig
Date: Tue May 4 05:40:10 UTC 2021
Modified Files:
src/tests/usr.bin/xlint/lint1: gcc_bit_field_types.c
src/usr.bin/xlint/lint1: tree.c
Log Message:
lint: fix assertion failure when promoting a bit-field larger than int
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/xlint/lint1/gcc_bit_field_types.c
cvs rdiff -u -r1.280 -r1.281 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/gcc_bit_field_types.c
diff -u src/tests/usr.bin/xlint/lint1/gcc_bit_field_types.c:1.4 src/tests/usr.bin/xlint/lint1/gcc_bit_field_types.c:1.5
--- src/tests/usr.bin/xlint/lint1/gcc_bit_field_types.c:1.4 Tue May 4 05:32:52 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_bit_field_types.c Tue May 4 05:40:10 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_bit_field_types.c,v 1.4 2021/05/04 05:32:52 rillig Exp $ */
+/* $NetBSD: gcc_bit_field_types.c,v 1.5 2021/05/04 05:40:10 rillig Exp $ */
# 3 "gcc_bit_field_types.c"
/*
@@ -32,6 +32,5 @@ promote_large_bit_field(struct large_bit
* lint: assertion "len == size_in_bits(INT)" failed
* in promote at tree.c:1698
*/
- /* TODO: remove the cast since it hides an assertion failure */
- return (unsigned long long)lbf.member & 0xf;
+ return lbf.member & 0xf;
}
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.280 src/usr.bin/xlint/lint1/tree.c:1.281
--- src/usr.bin/xlint/lint1/tree.c:1.280 Sun Apr 18 17:54:33 2021
+++ src/usr.bin/xlint/lint1/tree.c Tue May 4 05:40:10 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.280 2021/04/18 17:54:33 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.281 2021/05/04 05:40:10 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.280 2021/04/18 17:54:33 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.281 2021/05/04 05:40:10 rillig Exp $");
#endif
#include <float.h>
@@ -1686,21 +1686,18 @@ promote(op_t op, bool farg, tnode_t *tn)
if (!tflag) {
/*
- * ANSI C requires that the result is always of type INT
- * if INT can represent all possible values of the previous
- * type.
+ * C99 6.3.1.1p2 requires for types with lower rank than int
+ * that "If an int can represent all the values of the
+ * original type, the value is converted to an int; otherwise
+ * it is converted to an unsigned int", and that "All other
+ * types are unchanged by the integer promotions".
*/
if (tn->tn_type->t_bitfield) {
len = tn->tn_type->t_flen;
- if (size_in_bits(INT) > len) {
+ if (len < size_in_bits(INT)) {
t = INT;
- } else {
- lint_assert(len == size_in_bits(INT));
- if (is_uinteger(t)) {
- t = UINT;
- } else {
- t = INT;
- }
+ } else if (len == size_in_bits(INT)) {
+ t = is_uinteger(t) ? UINT : INT;
}
} else if (t == CHAR || t == UCHAR || t == SCHAR) {
t = (size_in_bits(CHAR) < size_in_bits(INT)