Module Name: src
Committed By: rillig
Date: Mon Feb 24 19:49:00 UTC 2025
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_153.c msg_177.c msg_309.c
Log Message:
tests/lint: add tests for constants, pointers and lost bits
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/tests/usr.bin/xlint/lint1/msg_153.c
cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/xlint/lint1/msg_177.c
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_309.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_153.c
diff -u src/tests/usr.bin/xlint/lint1/msg_153.c:1.9 src/tests/usr.bin/xlint/lint1/msg_153.c:1.10
--- src/tests/usr.bin/xlint/lint1/msg_153.c:1.9 Sat Nov 23 16:48:35 2024
+++ src/tests/usr.bin/xlint/lint1/msg_153.c Mon Feb 24 19:49:00 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_153.c,v 1.9 2024/11/23 16:48:35 rillig Exp $ */
+/* $NetBSD: msg_153.c,v 1.10 2025/02/24 19:49:00 rillig Exp $ */
# 3 "msg_153.c"
// Test for message: converting '%s' to incompatible '%s' for argument %d [153]
@@ -7,10 +7,14 @@
typedef double (*unary_operator)(double);
+typedef unsigned char sixteen_bytes[16];
void sink_function_pointer(unary_operator);
void sink_int_pointer(int *);
void sink_qualifiers(char *, const char *, volatile char *, const volatile char *);
+void take_pointer_to_sixteen_bytes(sixteen_bytes *);
+
+sixteen_bytes bytes;
void
to_function_pointer(int *x)
@@ -36,3 +40,11 @@ qualifiers(char *ptr, const volatile cha
/* expect+1: warning: passing 'pointer to const volatile char' to argument 3 discards 'const' [383] */
sink_qualifiers(cvptr, cvptr, cvptr, cvptr);
}
+
+void
+pass_pointer_to_array(void)
+{
+ // FIXME: Must be a pointer to 16 bytes, not to 1 byte.
+ /* expect+1: warning: converting 'pointer to unsigned char' to incompatible 'pointer to array[16] of unsigned char' for argument 1 [153] */
+ take_pointer_to_sixteen_bytes(&bytes);
+}
Index: src/tests/usr.bin/xlint/lint1/msg_177.c
diff -u src/tests/usr.bin/xlint/lint1/msg_177.c:1.4 src/tests/usr.bin/xlint/lint1/msg_177.c:1.5
--- src/tests/usr.bin/xlint/lint1/msg_177.c:1.4 Tue Mar 28 14:44:35 2023
+++ src/tests/usr.bin/xlint/lint1/msg_177.c Mon Feb 24 19:49:00 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_177.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_177.c,v 1.5 2025/02/24 19:49:00 rillig Exp $ */
# 3 "msg_177.c"
// Test for message: non-constant initializer [177]
@@ -14,3 +14,7 @@ const int var = not_a_constant;
/* expect+1: error: non-constant initializer [177] */
const int calling_function = function();
+
+// A compound expression is not a constant expression.
+/* expect+1: error: non-constant initializer [177] */
+const int compound_expression = (int){ 3 };
Index: src/tests/usr.bin/xlint/lint1/msg_309.c
diff -u src/tests/usr.bin/xlint/lint1/msg_309.c:1.7 src/tests/usr.bin/xlint/lint1/msg_309.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_309.c:1.7 Fri Jul 7 19:45:22 2023
+++ src/tests/usr.bin/xlint/lint1/msg_309.c Mon Feb 24 19:49:00 2025
@@ -1,19 +1,28 @@
-/* $NetBSD: msg_309.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_309.c,v 1.8 2025/02/24 19:49:00 rillig Exp $ */
# 3 "msg_309.c"
// Test for message: extra bits set to 0 in conversion of '%s' to '%s', op '%s' [309]
/* lint1-extra-flags: -X 351 */
-int
-scale(unsigned long long x) {
+typedef unsigned char u8_t;
+typedef unsigned int u32_t;
+typedef unsigned long long u64_t;
+
+u8_t u8;
+u32_t u32;
+u64_t u64;
+
+
+void
+test(void)
+{
/*
* Both operands of '&' have the same type, therefore no conversion
* is necessary and no bits can get lost.
*/
- if ((x & 0xffffffff00000000ULL) != 0)
- return 32;
+ u64 = u64 & 0xffffffff00000000ULL;
/*
* The constant has type 'unsigned 32-bit'. The usual arithmetic
@@ -23,8 +32,7 @@ scale(unsigned long long x) {
* 32-bit to a 64-bit platform.
*/
/* expect+1: warning: extra bits set to 0 in conversion of 'unsigned int' to 'unsigned long long', op '&' [309] */
- if ((x & 0xffff0000) != 0)
- return 16;
+ u64 = u64 & 0xffff0000;
/*
* The integer constant is explicitly unsigned. Even in this case,
@@ -33,8 +41,7 @@ scale(unsigned long long x) {
* bits.
*/
/* expect+1: warning: extra bits set to 0 in conversion of 'unsigned int' to 'unsigned long long', op '&' [309] */
- if ((x & 0xffff0000U) != 0)
- return 16;
+ u64 = u64 & 0xffff0000U;
/*
* Even if the expression is written as '& ~', which makes the
@@ -43,27 +50,29 @@ scale(unsigned long long x) {
* the code to a 64-bit platform, the upper 32 bits are preserved.
*/
/* expect+1: warning: extra bits set to 0 in conversion of 'unsigned int' to 'unsigned long long', op '&' [309] */
- if ((x & ~0xffffU) != 0)
- return 16;
+ u64 = u64 & ~0xffffU;
/*
* Casting the integer constant to the proper type removes all
* ambiguities about the programmer's intention.
*/
- if ((x & (unsigned long long)~0xffffU) != 0)
- return 16;
+ u64 = u64 & (unsigned long long)~0xffffU;
/*
* In the remaining cases, the constant does not have its most
* significant bit set, therefore there is no ambiguity.
*/
- if ((x & 0xff00) != 0)
- return 8;
- if ((x & 0xf0) != 0)
- return 4;
- if ((x & 0xc) != 0)
- return 2;
- if ((x & 0x2) != 0)
- return 1;
- return (int)(x & 0x1);
+ u64 = u64 & 0xff00;
+ u64 = u64 & 0xf0;
+ u64 = u64 & 0xc;
+ u64 = u64 & 0x2;
+ u64 = u64 & 0x1;
+
+ u8 = u8 & 0x7f;
+ u8 = u8 & 0x80;
+ u8 = u8 & -0x80;
+ /* expect+1: warning: extra bits set to 0 in conversion of 'unsigned char' to 'int', op '&' [309] */
+ u8 = u8 & (u8_t)-0x80;
+ /* expect+1: warning: extra bits set to 0 in conversion of 'unsigned char' to 'int', op '&' [309] */
+ u8 = u8 & (u8_t)-0x80U;
}