Module Name:    src
Committed By:   rillig
Date:           Sat Jul  8 16:13:00 UTC 2023

Modified Files:
        src/tests/usr.bin/xlint/lint1: msg_247_ilp32_ldbl64.c
            msg_247_lp64_ldbl128.c msg_247_portable.c
        src/usr.bin/xlint/common: inittyp.c lint.h
        src/usr.bin/xlint/lint1: decl.c tree.c

Log Message:
lint: warn about pointer casts between different kinds of types

Pointer casts from an integer type to a floating-point type and vice
versa get a 'maybe troublesome' warning now.  The previous assumption
that all types of the same bit-size are convertible may have been valid
from a technical point of view, but still such code should get more
attention.

The rules for struct and union types could be made more fine-grained
later, if the need arises.  To suppress this warning, it's always
possible to cast to an intermediate 'void *'.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c \
    src/tests/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c \
    src/tests/usr.bin/xlint/lint1/msg_247_portable.c
cvs rdiff -u -r1.38 -r1.39 src/usr.bin/xlint/common/inittyp.c
cvs rdiff -u -r1.40 -r1.41 src/usr.bin/xlint/common/lint.h
cvs rdiff -u -r1.344 -r1.345 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.553 -r1.554 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_247_ilp32_ldbl64.c
diff -u src/tests/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c:1.3 src/tests/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c:1.4
--- src/tests/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c:1.3	Sat Jul  8 11:03:00 2023
+++ src/tests/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c	Sat Jul  8 16:13:00 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_247_ilp32_ldbl64.c,v 1.3 2023/07/08 11:03:00 rillig Exp $	*/
+/*	$NetBSD: msg_247_ilp32_ldbl64.c,v 1.4 2023/07/08 16:13:00 rillig Exp $	*/
 # 3 "msg_247_ilp32_ldbl64.c"
 
 // Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
@@ -63,6 +63,7 @@ all_casts(void)
 {
 	bool_ptr = (typeof(bool_ptr))bool_ptr;
 	bool_ptr = (typeof(bool_ptr))char_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to _Bool' may be troublesome [247] */
 	bool_ptr = (typeof(bool_ptr))schar_ptr;
 	bool_ptr = (typeof(bool_ptr))uchar_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to _Bool' may be troublesome [247] */
@@ -137,6 +138,7 @@ all_casts(void)
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to char' is questionable [229] */
 	char_ptr = (typeof(char_ptr))func_ptr;
 
+	/* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to signed char' may be troublesome [247] */
 	schar_ptr = (typeof(schar_ptr))bool_ptr;
 	schar_ptr = (typeof(schar_ptr))char_ptr;
 	schar_ptr = (typeof(schar_ptr))schar_ptr;
@@ -327,6 +329,7 @@ all_casts(void)
 	int_ptr = (typeof(int_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to int' may be troublesome [247] */
 	int_ptr = (typeof(int_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to int' may be troublesome [247] */
 	int_ptr = (typeof(int_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to int' may be troublesome [247] */
 	int_ptr = (typeof(int_ptr))double_ptr;
@@ -371,6 +374,7 @@ all_casts(void)
 	uint_ptr = (typeof(uint_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned int' may be troublesome [247] */
 	uint_ptr = (typeof(uint_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned int' may be troublesome [247] */
 	uint_ptr = (typeof(uint_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned int' may be troublesome [247] */
 	uint_ptr = (typeof(uint_ptr))double_ptr;
@@ -415,6 +419,7 @@ all_casts(void)
 	long_ptr = (typeof(long_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))double_ptr;
@@ -459,6 +464,7 @@ all_casts(void)
 	ulong_ptr = (typeof(ulong_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))double_ptr;
@@ -507,8 +513,11 @@ all_casts(void)
 	llong_ptr = (typeof(llong_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))double_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))dcomplex_ptr;
@@ -525,6 +534,7 @@ all_casts(void)
 	llong_ptr = (typeof(llong_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long long' is questionable [229] */
 	llong_ptr = (typeof(llong_ptr))func_ptr;
@@ -551,8 +561,11 @@ all_casts(void)
 	ullong_ptr = (typeof(ullong_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))double_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))dcomplex_ptr;
@@ -569,6 +582,7 @@ all_casts(void)
 	ullong_ptr = (typeof(ullong_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long long' is questionable [229] */
 	ullong_ptr = (typeof(ullong_ptr))func_ptr;
@@ -583,9 +597,13 @@ all_casts(void)
 	float_ptr = (typeof(float_ptr))short_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))ushort_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))int_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))uint_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))long_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))ulong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))llong_ptr;
@@ -611,6 +629,7 @@ all_casts(void)
 	float_ptr = (typeof(float_ptr))char_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))double_union_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))enum_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))double_array_ptr;
@@ -635,12 +654,15 @@ all_casts(void)
 	double_ptr = (typeof(double_ptr))long_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))float_ptr;
 	double_ptr = (typeof(double_ptr))double_ptr;
 	double_ptr = (typeof(double_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))dcomplex_ptr;
@@ -678,12 +700,15 @@ all_casts(void)
 	ldouble_ptr = (typeof(ldouble_ptr))long_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))float_ptr;
 	ldouble_ptr = (typeof(ldouble_ptr))double_ptr;
 	ldouble_ptr = (typeof(ldouble_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))dcomplex_ptr;
@@ -722,11 +747,15 @@ all_casts(void)
 	fcomplex_ptr = (typeof(fcomplex_ptr))long_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ldouble_ptr;
 	fcomplex_ptr = (typeof(fcomplex_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
@@ -744,6 +773,7 @@ all_casts(void)
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float _Complex' is questionable [229] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))func_ptr;
@@ -1083,6 +1113,7 @@ all_casts(void)
 	enum_ptr = (typeof(enum_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
 	enum_ptr = (typeof(enum_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to enum typedef int_enum' may be troublesome [247] */
 	enum_ptr = (typeof(enum_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
 	enum_ptr = (typeof(enum_ptr))double_ptr;
@@ -1127,12 +1158,15 @@ all_casts(void)
 	double_array_ptr = (typeof(double_array_ptr))long_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))float_ptr;
 	double_array_ptr = (typeof(double_array_ptr))double_ptr;
 	double_array_ptr = (typeof(double_array_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))dcomplex_ptr;
Index: src/tests/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c
diff -u src/tests/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c:1.3 src/tests/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c:1.4
--- src/tests/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c:1.3	Thu Jul  6 07:33:36 2023
+++ src/tests/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c	Sat Jul  8 16:13:00 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_247_lp64_ldbl128.c,v 1.3 2023/07/06 07:33:36 rillig Exp $	*/
+/*	$NetBSD: msg_247_lp64_ldbl128.c,v 1.4 2023/07/08 16:13:00 rillig Exp $	*/
 # 3 "msg_247_lp64_ldbl128.c"
 
 // Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
@@ -63,6 +63,7 @@ all_casts(void)
 {
 	bool_ptr = (typeof(bool_ptr))bool_ptr;
 	bool_ptr = (typeof(bool_ptr))char_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to _Bool' may be troublesome [247] */
 	bool_ptr = (typeof(bool_ptr))schar_ptr;
 	bool_ptr = (typeof(bool_ptr))uchar_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to _Bool' may be troublesome [247] */
@@ -137,6 +138,7 @@ all_casts(void)
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to char' is questionable [229] */
 	char_ptr = (typeof(char_ptr))func_ptr;
 
+	/* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to signed char' may be troublesome [247] */
 	schar_ptr = (typeof(schar_ptr))bool_ptr;
 	schar_ptr = (typeof(schar_ptr))char_ptr;
 	schar_ptr = (typeof(schar_ptr))schar_ptr;
@@ -329,6 +331,7 @@ all_casts(void)
 	int_ptr = (typeof(int_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to int' may be troublesome [247] */
 	int_ptr = (typeof(int_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to int' may be troublesome [247] */
 	int_ptr = (typeof(int_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to int' may be troublesome [247] */
 	int_ptr = (typeof(int_ptr))double_ptr;
@@ -375,6 +378,7 @@ all_casts(void)
 	uint_ptr = (typeof(uint_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned int' may be troublesome [247] */
 	uint_ptr = (typeof(uint_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned int' may be troublesome [247] */
 	uint_ptr = (typeof(uint_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned int' may be troublesome [247] */
 	uint_ptr = (typeof(uint_ptr))double_ptr;
@@ -421,9 +425,11 @@ all_casts(void)
 	long_ptr = (typeof(long_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))dcomplex_ptr;
@@ -440,6 +446,7 @@ all_casts(void)
 	long_ptr = (typeof(long_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long' is questionable [229] */
 	long_ptr = (typeof(long_ptr))func_ptr;
@@ -464,9 +471,11 @@ all_casts(void)
 	ulong_ptr = (typeof(ulong_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))dcomplex_ptr;
@@ -483,6 +492,7 @@ all_casts(void)
 	ulong_ptr = (typeof(ulong_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long' is questionable [229] */
 	ulong_ptr = (typeof(ulong_ptr))func_ptr;
@@ -507,9 +517,11 @@ all_casts(void)
 	llong_ptr = (typeof(llong_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))dcomplex_ptr;
@@ -526,6 +538,7 @@ all_casts(void)
 	llong_ptr = (typeof(llong_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long long' is questionable [229] */
 	llong_ptr = (typeof(llong_ptr))func_ptr;
@@ -550,9 +563,11 @@ all_casts(void)
 	ullong_ptr = (typeof(ullong_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))dcomplex_ptr;
@@ -569,6 +584,7 @@ all_casts(void)
 	ullong_ptr = (typeof(ullong_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long long' is questionable [229] */
 	ullong_ptr = (typeof(ullong_ptr))func_ptr;
@@ -583,7 +599,9 @@ all_casts(void)
 	float_ptr = (typeof(float_ptr))short_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))ushort_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))int_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))uint_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))long_ptr;
@@ -613,6 +631,7 @@ all_casts(void)
 	float_ptr = (typeof(float_ptr))char_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))double_union_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))enum_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))double_array_ptr;
@@ -633,15 +652,20 @@ all_casts(void)
 	double_ptr = (typeof(double_ptr))int_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))uint_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))long_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))float_ptr;
 	double_ptr = (typeof(double_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))dcomplex_ptr;
@@ -690,6 +714,7 @@ all_casts(void)
 	ldouble_ptr = (typeof(ldouble_ptr))ldouble_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))fcomplex_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))dcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long double' may be troublesome [247] */
 	ldouble_ptr = (typeof(ldouble_ptr))lcomplex_ptr;
@@ -723,12 +748,17 @@ all_casts(void)
 	fcomplex_ptr = (typeof(fcomplex_ptr))int_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))uint_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))long_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ldouble_ptr;
@@ -748,6 +778,7 @@ all_casts(void)
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float _Complex' is questionable [229] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))func_ptr;
@@ -778,6 +809,7 @@ all_casts(void)
 	dcomplex_ptr = (typeof(dcomplex_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to double _Complex' may be troublesome [247] */
 	dcomplex_ptr = (typeof(dcomplex_ptr))double_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double _Complex' may be troublesome [247] */
 	dcomplex_ptr = (typeof(dcomplex_ptr))ldouble_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double _Complex' may be troublesome [247] */
 	dcomplex_ptr = (typeof(dcomplex_ptr))fcomplex_ptr;
@@ -1090,6 +1122,7 @@ all_casts(void)
 	enum_ptr = (typeof(enum_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
 	enum_ptr = (typeof(enum_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to enum typedef int_enum' may be troublesome [247] */
 	enum_ptr = (typeof(enum_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
 	enum_ptr = (typeof(enum_ptr))double_ptr;
@@ -1130,15 +1163,20 @@ all_casts(void)
 	double_array_ptr = (typeof(double_array_ptr))int_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))uint_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))long_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))float_ptr;
 	double_array_ptr = (typeof(double_array_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))dcomplex_ptr;
Index: src/tests/usr.bin/xlint/lint1/msg_247_portable.c
diff -u src/tests/usr.bin/xlint/lint1/msg_247_portable.c:1.3 src/tests/usr.bin/xlint/lint1/msg_247_portable.c:1.4
--- src/tests/usr.bin/xlint/lint1/msg_247_portable.c:1.3	Sat Jul  8 15:26:25 2023
+++ src/tests/usr.bin/xlint/lint1/msg_247_portable.c	Sat Jul  8 16:13:00 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_247_portable.c,v 1.3 2023/07/08 15:26:25 rillig Exp $	*/
+/*	$NetBSD: msg_247_portable.c,v 1.4 2023/07/08 16:13:00 rillig Exp $	*/
 # 3 "msg_247_portable.c"
 
 // Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
@@ -427,6 +427,7 @@ all_casts(void)
 	long_ptr = (typeof(long_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long' may be troublesome [247] */
 	long_ptr = (typeof(long_ptr))double_ptr;
@@ -474,6 +475,7 @@ all_casts(void)
 	ulong_ptr = (typeof(ulong_ptr))llong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))ullong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))float_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long' may be troublesome [247] */
 	ulong_ptr = (typeof(ulong_ptr))double_ptr;
@@ -523,9 +525,11 @@ all_casts(void)
 	llong_ptr = (typeof(llong_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))dcomplex_ptr;
@@ -542,6 +546,7 @@ all_casts(void)
 	llong_ptr = (typeof(llong_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long long' may be troublesome [247] */
 	llong_ptr = (typeof(llong_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long long' is questionable [229] */
 	llong_ptr = (typeof(llong_ptr))func_ptr;
@@ -568,9 +573,11 @@ all_casts(void)
 	ullong_ptr = (typeof(ullong_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))dcomplex_ptr;
@@ -587,6 +594,7 @@ all_casts(void)
 	ullong_ptr = (typeof(ullong_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long long' may be troublesome [247] */
 	ullong_ptr = (typeof(ullong_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long long' is questionable [229] */
 	ullong_ptr = (typeof(ullong_ptr))func_ptr;
@@ -605,7 +613,9 @@ all_casts(void)
 	float_ptr = (typeof(float_ptr))int_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))uint_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))long_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))ulong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float' may be troublesome [247] */
 	float_ptr = (typeof(float_ptr))llong_ptr;
@@ -656,13 +666,16 @@ all_casts(void)
 	double_ptr = (typeof(double_ptr))long_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))float_ptr;
 	double_ptr = (typeof(double_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to double' may be troublesome [247] */
 	double_ptr = (typeof(double_ptr))dcomplex_ptr;
@@ -749,10 +762,13 @@ all_casts(void)
 	fcomplex_ptr = (typeof(fcomplex_ptr))long_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))float_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))ldouble_ptr;
@@ -772,6 +788,7 @@ all_casts(void)
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_union_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))enum_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float _Complex' may be troublesome [247] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))double_array_ptr;
 	/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float _Complex' is questionable [229] */
 	fcomplex_ptr = (typeof(fcomplex_ptr))func_ptr;
@@ -1160,13 +1177,16 @@ all_casts(void)
 	double_array_ptr = (typeof(double_array_ptr))long_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ulong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))llong_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ullong_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))float_ptr;
 	double_array_ptr = (typeof(double_array_ptr))double_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))ldouble_ptr;
+	/* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))fcomplex_ptr;
 	/* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
 	double_array_ptr = (typeof(double_array_ptr))dcomplex_ptr;

Index: src/usr.bin/xlint/common/inittyp.c
diff -u src/usr.bin/xlint/common/inittyp.c:1.38 src/usr.bin/xlint/common/inittyp.c:1.39
--- src/usr.bin/xlint/common/inittyp.c:1.38	Sat Jul  8 09:35:35 2023
+++ src/usr.bin/xlint/common/inittyp.c	Sat Jul  8 16:13:00 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: inittyp.c,v 1.38 2023/07/08 09:35:35 rillig Exp $	*/
+/*	$NetBSD: inittyp.c,v 1.39 2023/07/08 16:13:00 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: inittyp.c,v 1.38 2023/07/08 09:35:35 rillig Exp $");
+__RCSID("$NetBSD: inittyp.c,v 1.39 2023/07/08 16:13:00 rillig Exp $");
 #endif
 
 #if defined(IS_LINT1)
@@ -46,12 +46,17 @@ __RCSID("$NetBSD: inittyp.c,v 1.38 2023/
 #include "lint2.h"
 #endif
 
-#define INT_RSIZE	(/*CONSTCOND*/INTPTR_TSPEC == LONG ? 3 : 4)
+#define INT_RANK	(/*CONSTCOND*/INTPTR_TSPEC == LONG ? 4 : 5)
 
 #ifdef IS_LINT1
-#define typeinfo(name, signed_type, unsigned_type, size_in_bits, rank, c) \
+#define typeinfo(name, signed_type, unsigned_type, size_in_bits, rv, c) \
 	{ /*CONSTCOND*/ \
-		size_in_bits, rank, \
+		size_in_bits, \
+		(c) == 'u' || (c) == 's' || (c) == 'p' ? RK_INTEGER : \
+		    (c) == 'f' ? RK_FLOATING : \
+		    (c) == 'c' ? RK_COMPLEX : \
+		    RK_NONE, \
+		rv, \
 		signed_type, unsigned_type, \
 		(c) == 's' || (c) == 'u', \
 		(c) == 'u' || (c) == 'p', \
@@ -78,41 +83,44 @@ ttab_t	ttab[NTSPEC] = {
 	typeinfo("signed", SIGNED, UNSIGN, 0, 0, ' '),
 	typeinfo("unsigned", SIGNED, UNSIGN, 0, 0, ' '),
 	typeinfo("_Bool", BOOL, BOOL, CHAR_SIZE, 1, 'u'),
-	typeinfo("char", SCHAR, UCHAR, CHAR_SIZE, 8,
+	typeinfo("char", SCHAR, UCHAR, CHAR_SIZE, 2,
 	    TARG_CHAR_MIN == 0 ? 'u' : 's'),
-	typeinfo("signed char", SCHAR, UCHAR, CHAR_SIZE, 8, 's'),
-	typeinfo("unsigned char", SCHAR, UCHAR, CHAR_SIZE, 8, 'u'),
-	typeinfo("short", SHORT, USHORT, SHORT_SIZE, 16, 's'),
-	typeinfo("unsigned short", SHORT, USHORT, SHORT_SIZE, 16, 'u'),
-	typeinfo("int", INT, UINT, INT_SIZE, INT_RSIZE * 8, 's'),
-	typeinfo("unsigned int", INT, UINT, INT_SIZE, INT_RSIZE * 8, 'u'),
-	typeinfo("long", LONG, ULONG, LONG_SIZE, 32, 's'),
-	typeinfo("unsigned long", LONG, ULONG, LONG_SIZE, 32, 'u'),
-	typeinfo("long long", LLONG, ULLONG, LLONG_SIZE, 64, 's'),
-	typeinfo("unsigned long long", LLONG, ULLONG, LLONG_SIZE, 64, 'u'),
+	typeinfo("signed char", SCHAR, UCHAR, CHAR_SIZE, 2, 's'),
+	typeinfo("unsigned char", SCHAR, UCHAR, CHAR_SIZE, 2, 'u'),
+	typeinfo("short", SHORT, USHORT, SHORT_SIZE, 3, 's'),
+	typeinfo("unsigned short", SHORT, USHORT, SHORT_SIZE, 3, 'u'),
+	typeinfo("int", INT, UINT, INT_SIZE, INT_RANK, 's'),
+	typeinfo("unsigned int", INT, UINT, INT_SIZE, INT_RANK, 'u'),
+	typeinfo("long", LONG, ULONG, LONG_SIZE, 5, 's'),
+	typeinfo("unsigned long", LONG, ULONG, LONG_SIZE, 5, 'u'),
+	typeinfo("long long", LLONG, ULLONG, LLONG_SIZE, 6, 's'),
+	typeinfo("unsigned long long", LLONG, ULLONG, LLONG_SIZE, 6, 'u'),
 #ifdef INT128_SIZE
-	typeinfo("__int128_t", INT128, UINT128, INT128_SIZE, 128, 's'),
-	typeinfo("__uint128_t", INT128, UINT128, INT128_SIZE, 128, 'u'),
+	typeinfo("__int128_t", INT128, UINT128, INT128_SIZE, 7, 's'),
+	typeinfo("__uint128_t", INT128, UINT128, INT128_SIZE, 7, 'u'),
 #endif
-	typeinfo("float", FLOAT, FLOAT, FLOAT_SIZE, 32, 'f'),
-	typeinfo("double", DOUBLE, DOUBLE, DOUBLE_SIZE, 64, 'f'),
-	typeinfo("long double", LDOUBLE, LDOUBLE, LDOUBLE_SIZE, 80, 'f'),
+	typeinfo("float", FLOAT, FLOAT, FLOAT_SIZE, 1, 'f'),
+	typeinfo("double", DOUBLE, DOUBLE, DOUBLE_SIZE, 2, 'f'),
+	typeinfo("long double", LDOUBLE, LDOUBLE, LDOUBLE_SIZE, 3, 'f'),
 #ifdef DEBUG
 	typeinfo("_Complex", NO_TSPEC, NO_TSPEC, 0, 0, ' '),
 #else
 	typeinfo(NULL, NO_TSPEC, NO_TSPEC, 0, 0, ' '),
 #endif
 	typeinfo("float _Complex", FCOMPLEX, FCOMPLEX,
-	    FLOAT_SIZE * 2, 32 * 2, 'c'),
+	    FLOAT_SIZE * 2, 1, 'c'),
 	typeinfo("double _Complex", DCOMPLEX, DCOMPLEX,
-	    DOUBLE_SIZE * 2, 64 * 2, 'c'),
+	    DOUBLE_SIZE * 2, 2, 'c'),
 	typeinfo("long double _Complex", LCOMPLEX, LCOMPLEX,
-	    LDOUBLE_SIZE * 2, 80 * 2, 'c'),
+	    LDOUBLE_SIZE * 2, 3, 'c'),
 	typeinfo("void", VOID, VOID, 0, 0, ' '),
 	typeinfo("struct", STRUCT, STRUCT, 0, 0, ' '),
 	typeinfo("union", UNION, UNION, 0, 0, ' '),
-	typeinfo("enum", ENUM, ENUM, ENUM_SIZE, 24, 's'),
-	typeinfo("pointer", PTR, PTR, PTR_SIZE, 32, 'p'),
+	// Will become more complicated in C23, which allows to choose the
+	// underlying type.
+	typeinfo("enum", ENUM, ENUM, ENUM_SIZE, INT_RANK, 's'),
+	// Same as 'unsigned long', which matches all supported platforms.
+	typeinfo("pointer", PTR, PTR, PTR_SIZE, 5, 'p'),
 	typeinfo("array", ARRAY, ARRAY, 0, 0, ' '),
 	typeinfo("function", FUNC, FUNC, 0, 0, ' '),
 };

Index: src/usr.bin/xlint/common/lint.h
diff -u src/usr.bin/xlint/common/lint.h:1.40 src/usr.bin/xlint/common/lint.h:1.41
--- src/usr.bin/xlint/common/lint.h:1.40	Sat Jul  8 09:35:35 2023
+++ src/usr.bin/xlint/common/lint.h	Sat Jul  8 16:13:00 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: lint.h,v 1.40 2023/07/08 09:35:35 rillig Exp $	*/
+/*	$NetBSD: lint.h,v 1.41 2023/07/08 16:13:00 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -95,9 +95,14 @@ typedef enum {
 typedef	struct {
 #ifdef IS_LINT1
 	unsigned int tt_size_in_bits;
-	unsigned int tt_rank;	/* relative size of the type; depends on
-				 * portable mode, as well as on whether sizeof
-				 * has type 'int' or 'long' */
+	enum rank_kind {
+		RK_NONE,
+		RK_INTEGER,
+		RK_FLOATING,
+		RK_COMPLEX,
+	} tt_rank_kind;
+	unsigned int tt_rank_value;	/* relative size of the type; depends
+					 * on pflag and PTRDIFF_TSPEC */
 #endif
 	tspec_t	tt_signed_counterpart;
 	tspec_t	tt_unsigned_counterpart;

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.344 src/usr.bin/xlint/lint1/decl.c:1.345
--- src/usr.bin/xlint/lint1/decl.c:1.344	Sat Jul  8 09:35:35 2023
+++ src/usr.bin/xlint/lint1/decl.c	Sat Jul  8 16:13:00 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.344 2023/07/08 09:35:35 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.345 2023/07/08 16:13:00 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: decl.c,v 1.344 2023/07/08 09:35:35 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.345 2023/07/08 16:13:00 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -99,8 +99,13 @@ initdecl(void)
 	dcs->d_last_dlsym = &dcs->d_first_dlsym;
 
 	if (!pflag) {
-		for (size_t i = 0; i < NTSPEC; i++)
-			ttab[i].tt_rank = ttab[i].tt_size_in_bits;
+		for (size_t i = 0; i < NTSPEC; i++) {
+			if (ttab[i].tt_rank_kind != RK_NONE)
+				ttab[i].tt_rank_value =
+				    ttab[i].tt_size_in_bits;
+		}
+		ttab[BOOL].tt_rank_kind = RK_INTEGER;
+		ttab[BOOL].tt_rank_value = 1;
 	}
 
 	if (Tflag) {

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.553 src/usr.bin/xlint/lint1/tree.c:1.554
--- src/usr.bin/xlint/lint1/tree.c:1.553	Sat Jul  8 15:26:25 2023
+++ src/usr.bin/xlint/lint1/tree.c	Sat Jul  8 16:13:00 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.553 2023/07/08 15:26:25 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.554 2023/07/08 16:13:00 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.553 2023/07/08 15:26:25 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.554 2023/07/08 16:13:00 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -100,9 +100,11 @@ width_in_bits(const type_t *tp)
 
 static int
 portable_rank_cmp(tspec_t t1, tspec_t t2) {
-	unsigned int r1 = type_properties(t1)->tt_rank;
-	unsigned int r2 = type_properties(t2)->tt_rank;
-	return (int)r1 - (int)r2;
+	const ttab_t *p1 = type_properties(t1), *p2 = type_properties(t2);
+	lint_assert(p1->tt_rank_kind == p2->tt_rank_kind);
+	lint_assert(p1->tt_rank_value > 0);
+	lint_assert(p2->tt_rank_value > 0);
+	return (int)p1->tt_rank_value - (int)p2->tt_rank_value;
 }
 
 static bool
@@ -3541,8 +3543,6 @@ should_warn_about_pointer_cast(const typ
 
 	/* Allow cast between pointers to sockaddr variants. */
 	if (nst == STRUCT && ost == STRUCT) {
-		debug_type(nstp);
-		debug_type(ostp);
 		const sym_t *nmem = nstp->t_sou->sou_first_member;
 		const sym_t *omem = ostp->t_sou->sou_first_member;
 		while (nmem != NULL && omem != NULL &&
@@ -3564,7 +3564,12 @@ should_warn_about_pointer_cast(const typ
 			return false;
 	}
 
-	if (is_struct_or_union(nst) && nstp->t_sou != ostp->t_sou)
+	if (is_struct_or_union(nst) && is_struct_or_union(ost))
+		return nstp->t_sou != ostp->t_sou;
+
+	enum rank_kind rk1 = type_properties(nst)->tt_rank_kind;
+	enum rank_kind rk2 = type_properties(ost)->tt_rank_kind;
+	if (rk1 != rk2 || rk1 == RK_NONE)
 		return true;
 
 	return portable_rank_cmp(nst, ost) != 0;

Reply via email to