Module Name:    src
Committed By:   rillig
Date:           Tue Aug 31 18:15:56 UTC 2021

Modified Files:
        src/tests/usr.bin/xlint/lint1: msg_259.c msg_259.exp

Log Message:
tests/lint: add missing test cases for integer conversions

While adding the missing test cases, I re-read the comments and
discarded several of them, since converting a signed value to an
unsigned type can be lossy as well, which warrants a warning.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/tests/usr.bin/xlint/lint1/msg_259.c
cvs rdiff -u -r1.10 -r1.11 src/tests/usr.bin/xlint/lint1/msg_259.exp

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_259.c
diff -u src/tests/usr.bin/xlint/lint1/msg_259.c:1.13 src/tests/usr.bin/xlint/lint1/msg_259.c:1.14
--- src/tests/usr.bin/xlint/lint1/msg_259.c:1.13	Mon Aug 30 18:33:37 2021
+++ src/tests/usr.bin/xlint/lint1/msg_259.c	Tue Aug 31 18:15:56 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_259.c,v 1.13 2021/08/30 18:33:37 rillig Exp $	*/
+/*	$NetBSD: msg_259.c,v 1.14 2021/08/31 18:15:56 rillig Exp $	*/
 # 3 "msg_259.c"
 
 // Test for message: argument #%d is converted from '%s' to '%s' due to prototype [259]
@@ -6,67 +6,133 @@
 /* lint1-only-if: lp64 */
 /* lint1-extra-flags: -h */
 
-void farg_char(char);
-void farg_int(int);
-void farg_long(long);
+void plain_char(char);
+void signed_int(int);
+void unsigned_int(unsigned int);
+void signed_long(long);
+void unsigned_long(unsigned long);
+void signed_long_long(long long);
+void unsigned_long_long(unsigned long long);
 
 void
-example(char c, int i, long l)
+change_in_type_width(char c, int i, long l)
 {
-	farg_char(c);
-	farg_int(c);
+	plain_char(c);
+	signed_int(c);
 	/* No warning 259 on LP64, only on ILP32 */
-	farg_long(c);
+	signed_long(c);
 
-	farg_char(i);		/* XXX: why no warning? */
-	farg_int(i);
+	plain_char(i);		/* XXX: why no warning? */
+	signed_int(i);
 	/* No warning 259 on LP64, only on ILP32 */
-	farg_long(i);
+	signed_long(i);
 
-	farg_char(l);		/* XXX: why no warning? */
+	plain_char(l);		/* XXX: why no warning? */
 	/* expect+1: from 'long' to 'int' due to prototype [259] */
-	farg_int(l);
-	farg_long(l);
+	signed_int(l);
+	signed_long(l);
 }
 
-void farg_unsigned_int(unsigned int);
-void farg_unsigned_long(unsigned long);
-void farg_unsigned_long_long(unsigned long long);
-
 /*
  * Converting a signed integer type to its corresponding unsigned integer
- * type (C99 6.2.5p6) is usually not a problem.  A common case where it
- * occurs is when the difference of two pointers is converted to size_t.
+ * type (C99 6.2.5p6) is usually not a problem since the actual values of the
+ * expressions are usually not anywhere near the maximum signed value.  From
+ * a technical standpoint, it is correct to warn here since even small
+ * negative numbers may result in very large positive numbers.
+ *
+ * A common case where it occurs is when the difference of two pointers is
+ * converted to size_t.  The type ptrdiff_t is defined to be signed, but in
+ * many practical cases, the expression is '(end - start)', which makes the
+ * resulting value necessarily positive.
  */
 void
-convert_to_corresponding_unsigned(int i, long l, long long ll)
+signed_to_unsigned(int si, long sl, long long sll)
 {
-	/* TODO: don't warn here. */
 	/* expect+1: warning: argument #1 is converted from 'int' to 'unsigned int' due to prototype [259] */
-	farg_unsigned_int(i);
+	unsigned_int(si);
 
-	/* TODO: don't warn here. */
-	/* expect+1: warning: argument #1 is converted from 'long' to 'unsigned long' due to prototype [259] */
-	farg_unsigned_long(l);
+	/* expect+1: warning: argument #1 is converted from 'long' to 'unsigned int' due to prototype [259] */
+	unsigned_int(sl);
 
-	/* TODO: don't warn here. */
-	/* expect+1: warning: argument #1 is converted from 'long long' to 'unsigned long long' due to prototype [259] */
-	farg_unsigned_long_long(ll);
+	/* expect+1: warning: argument #1 is converted from 'long long' to 'unsigned int' due to prototype [259] */
+	unsigned_int(sll);
 
 	/*
 	 * XXX: Why no warning?  Even though 'unsigned long' is 64 bits
 	 * wide, it cannot represent negative 32-bit values.
 	 */
-	farg_unsigned_long(i);
+	unsigned_long(si);
+
+	/* expect+1: warning: argument #1 is converted from 'long' to 'unsigned long' due to prototype [259] */
+	unsigned_long(sl);
+
+	unsigned_long(si);
 
 	/*
 	 * XXX: Why no warning?  Even though 'unsigned long long' is 64 bits
 	 * wide, it cannot represent negative 32-bit values.
 	 */
-	farg_unsigned_long_long(i);
+	unsigned_long_long(si);
 
 	/* expect+1: warning: argument #1 is converted from 'long' to 'unsigned long long' due to prototype [259] */
-	farg_unsigned_long_long(l);
+	unsigned_long_long(sl);
+
+	/* expect+1: warning: argument #1 is converted from 'long long' to 'unsigned long long' due to prototype [259] */
+	unsigned_long_long(sll);
+}
+
+void
+unsigned_to_signed(unsigned int ui, unsigned long ul, unsigned long long ull)
+{
+	/* expect+1: warning: argument #1 is converted from 'unsigned int' to 'int' due to prototype [259] */
+	signed_int(ui);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long' to 'int' due to prototype [259] */
+	signed_int(ul);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long long' to 'int' due to prototype [259] */
+	signed_int(ull);
+	signed_long(ui);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long' to 'long' due to prototype [259] */
+	signed_long(ul);
+	signed_long(ui);
+	signed_long_long(ui);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long' to 'long long' due to prototype [259] */
+	signed_long_long(ul);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long long' to 'long long' due to prototype [259] */
+	signed_long_long(ull);
+}
+
+void
+signed_to_signed(signed int si, signed long sl, signed long long sll)
+{
+	signed_int(si);
+	/* expect+1: warning: argument #1 is converted from 'long' to 'int' due to prototype [259] */
+	signed_int(sl);
+	/* expect+1: warning: argument #1 is converted from 'long long' to 'int' due to prototype [259] */
+	signed_int(sll);
+	signed_long(si);
+	signed_long(sl);
+	signed_long(si);
+	signed_long_long(si);
+	/* expect+1: warning: argument #1 is converted from 'long' to 'long long' due to prototype [259] */
+	signed_long_long(sl);
+	signed_long_long(sll);
+}
+
+void
+unsigned_to_unsigned(unsigned int ui, unsigned long ul, unsigned long long ull)
+{
+	unsigned_int(ui);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long' to 'unsigned int' due to prototype [259] */
+	unsigned_int(ul);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long long' to 'unsigned int' due to prototype [259] */
+	unsigned_int(ull);
+	unsigned_long(ui);
+	unsigned_long(ul);
+	unsigned_long(ui);
+	unsigned_long_long(ui);
+	/* expect+1: warning: argument #1 is converted from 'unsigned long' to 'unsigned long long' due to prototype [259] */
+	unsigned_long_long(ul);
+	unsigned_long_long(ull);
 }
 
 void
@@ -78,5 +144,5 @@ pass_sizeof_as_smaller_type(void)
 	 * that it would even fit into a 3-bit bit-field.
 	 */
 	/* expect+1: warning: argument #1 is converted from 'unsigned long' to 'unsigned int' due to prototype [259] */
-	farg_unsigned_int(sizeof(int));
+	unsigned_int(sizeof(int));
 }

Index: src/tests/usr.bin/xlint/lint1/msg_259.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_259.exp:1.10 src/tests/usr.bin/xlint/lint1/msg_259.exp:1.11
--- src/tests/usr.bin/xlint/lint1/msg_259.exp:1.10	Mon Aug 30 18:33:37 2021
+++ src/tests/usr.bin/xlint/lint1/msg_259.exp	Tue Aug 31 18:15:56 2021
@@ -1,6 +1,20 @@
-msg_259.c(28): warning: argument #1 is converted from 'long' to 'int' due to prototype [259]
-msg_259.c(46): warning: argument #1 is converted from 'int' to 'unsigned int' due to prototype [259]
-msg_259.c(50): warning: argument #1 is converted from 'long' to 'unsigned long' due to prototype [259]
-msg_259.c(54): warning: argument #1 is converted from 'long long' to 'unsigned long long' due to prototype [259]
-msg_259.c(69): warning: argument #1 is converted from 'long' to 'unsigned long long' due to prototype [259]
-msg_259.c(81): warning: argument #1 is converted from 'unsigned long' to 'unsigned int' due to prototype [259]
+msg_259.c(32): warning: argument #1 is converted from 'long' to 'int' due to prototype [259]
+msg_259.c(52): warning: argument #1 is converted from 'int' to 'unsigned int' due to prototype [259]
+msg_259.c(55): warning: argument #1 is converted from 'long' to 'unsigned int' due to prototype [259]
+msg_259.c(58): warning: argument #1 is converted from 'long long' to 'unsigned int' due to prototype [259]
+msg_259.c(67): warning: argument #1 is converted from 'long' to 'unsigned long' due to prototype [259]
+msg_259.c(78): warning: argument #1 is converted from 'long' to 'unsigned long long' due to prototype [259]
+msg_259.c(81): warning: argument #1 is converted from 'long long' to 'unsigned long long' due to prototype [259]
+msg_259.c(88): warning: argument #1 is converted from 'unsigned int' to 'int' due to prototype [259]
+msg_259.c(90): warning: argument #1 is converted from 'unsigned long' to 'int' due to prototype [259]
+msg_259.c(92): warning: argument #1 is converted from 'unsigned long long' to 'int' due to prototype [259]
+msg_259.c(95): warning: argument #1 is converted from 'unsigned long' to 'long' due to prototype [259]
+msg_259.c(99): warning: argument #1 is converted from 'unsigned long' to 'long long' due to prototype [259]
+msg_259.c(101): warning: argument #1 is converted from 'unsigned long long' to 'long long' due to prototype [259]
+msg_259.c(109): warning: argument #1 is converted from 'long' to 'int' due to prototype [259]
+msg_259.c(111): warning: argument #1 is converted from 'long long' to 'int' due to prototype [259]
+msg_259.c(117): warning: argument #1 is converted from 'long' to 'long long' due to prototype [259]
+msg_259.c(126): warning: argument #1 is converted from 'unsigned long' to 'unsigned int' due to prototype [259]
+msg_259.c(128): warning: argument #1 is converted from 'unsigned long long' to 'unsigned int' due to prototype [259]
+msg_259.c(134): warning: argument #1 is converted from 'unsigned long' to 'unsigned long long' due to prototype [259]
+msg_259.c(147): warning: argument #1 is converted from 'unsigned long' to 'unsigned int' due to prototype [259]

Reply via email to