Module Name:    src
Committed By:   rillig
Date:           Sun Aug  1 14:42:21 UTC 2021

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

Log Message:
tests/lint: fully cover the usual arithmetic conversions


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/expr_binary.c \
    src/tests/usr.bin/xlint/lint1/expr_binary.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/expr_binary.c
diff -u src/tests/usr.bin/xlint/lint1/expr_binary.c:1.3 src/tests/usr.bin/xlint/lint1/expr_binary.c:1.4
--- src/tests/usr.bin/xlint/lint1/expr_binary.c:1.3	Sun Aug  1 13:49:17 2021
+++ src/tests/usr.bin/xlint/lint1/expr_binary.c	Sun Aug  1 14:42:21 2021
@@ -1,13 +1,10 @@
-/*	$NetBSD: expr_binary.c,v 1.3 2021/08/01 13:49:17 rillig Exp $	*/
+/*	$NetBSD: expr_binary.c,v 1.4 2021/08/01 14:42:21 rillig Exp $	*/
 # 3 "expr_binary.c"
 
 /*
- * Test binary operators, in particular the usual arithmetic conversions.
- *
- * C99 6.3.1.8 "Usual arithmetic conversions"
+ * Test binary operators.
  */
 
-/* lint1-extra-flags: -Ac11 */
 /* lint1-only-if: lp64 */
 
 struct incompatible {		/* just to generate the error message */
@@ -15,39 +12,109 @@ struct incompatible {		/* just to genera
 };
 void sink(struct incompatible);
 
+/*
+ * Test the usual arithmetic conversions.
+ *
+ * C99 6.3.1.8 "Usual arithmetic conversions"
+ */
 void
 cover_balance(void)
 {
-	/* expect+1: 'int' */
-	sink(1 + '\0');
+	/* expect+1: 'pointer to void' */
+	sink((void *)0 + 0);
+
+	/* expect+1: 'pointer to void' */
+	sink(0 + (void *)0);
 
 	/* expect+1: 'int' */
-	sink((char)'\0' + (char)'\0');
+	sink(1 + 1);
 
-	/* expect+1: 'float' */
-	sink(1 + 1.0f);
+	/* expect+1: 'const int' */
+	sink((const int)1 + (volatile int)1);
+
+	/* expect+1: 'volatile int' */
+	sink((volatile int)1 + (const int)1);
 
+	long double _Complex cldbl = 0.0;
+	double _Complex cdbl = 0.0;
+	float _Complex cflt = 0.0f;
+	/* expect+1: error: invalid type for _Complex [308] */
+	_Complex invalid = 0.0;
+
+	/* expect+1: 'long double _Complex' */
+	sink(cldbl + 0);
+	/* expect+1: 'long double _Complex' */
+	sink(0 + cldbl);
+	/* expect+1: 'long double _Complex' */
+	sink(cldbl + cdbl);
+	/* expect+1: 'long double _Complex' */
+	sink(cdbl + cldbl);
+
+	/* expect+1: 'double _Complex' */
+	sink(cdbl + 0);
+	/* expect+1: 'double _Complex' */
+	sink(0 + cdbl);
+	/* expect+1: 'double _Complex' */
+	sink(cdbl + cflt);
+	/* expect+1: 'double _Complex' */
+	sink(cflt + cdbl);
+
+	/* expect+1: 'float _Complex' */
+	sink(cflt + 0);
+	/* expect+1: 'float _Complex' */
+	sink(0 + cflt);
+	/* expect+1: 'float _Complex' */
+	sink(cflt + (__uint128_t)0);
+	/* expect+1: 'float _Complex' */
+	sink((__uint128_t)0 + cflt);
+
+	/*
+	 * The type specifier '_Complex' is only used during parsing, it does
+	 * not make it to the expression.
+	 */
+	/* expect+1: 'double _Complex' */
+	sink(invalid + 0);
+
+	/* expect+1: 'long double' */
+	sink(0.0L + 0);
+	/* expect+1: 'long double' */
+	sink(0 + 0.0L);
+	/* expect+1: 'long double' */
+	sink(0.0L + 0.0);
+	/* expect+1: 'long double' */
+	sink(0.0 + 0.0L);
+
+	/* expect+1: 'double' */
+	sink(0.0 + 0);
+	/* expect+1: 'double' */
+	sink(0 + 0.0);
 	/* expect+1: 'double' */
-	sink(1 + 1.0);
+	sink(0.0 + 0.0f);
+	/* expect+1: 'double' */
+	sink(0.0f + 0.0);
 
 	/* expect+1: 'float' */
-	sink((long long)1 + 1.0f);
-
+	sink(0.0f + 0);
 	/* expect+1: 'float' */
-	sink((long long)1 + 1.0f);
-
+	sink(0 + 0.0f);
 	/* expect+1: 'float' */
-	sink((__uint128_t)1 + 1.0f);
-
-	/* expect+1: '__uint128_t' */
-	sink((__uint128_t)1 + 1);
-
-	/* expect+1: '__int128_t' */
-	sink((__int128_t)1 + 1);
-
-	/* expect+1: '__uint128_t' */
-	sink((__uint128_t)1 + (__int128_t)1);
+	sink(0.0f + (__uint128_t)0);
+	/* expect+1: 'float' */
+	sink((__uint128_t)0 + 0.0f);
 
-	/* expect+1: '__uint128_t' */
-	sink((__int128_t)1 + (__uint128_t)1);
+	/* expect+1: 'unsigned long long' */
+	sink(0ULL + 0);
+	/* expect+1: 'unsigned long long' */
+	sink(0 + 0ULL);
+
+	/* expect+1: 'unsigned long long' */
+	sink(0ULL + 0LL);
+	/* expect+1: 'unsigned long long' */
+	sink(0LL + 0ULL);
+
+	/* If the bit-width is the same, prefer the unsigned variant. */
+	/* expect+1: 'unsigned long long' */
+	sink(0UL + 0LL);
+	/* expect+1: 'unsigned long long' */
+	sink(0LL + 0UL);
 }
Index: src/tests/usr.bin/xlint/lint1/expr_binary.exp
diff -u src/tests/usr.bin/xlint/lint1/expr_binary.exp:1.3 src/tests/usr.bin/xlint/lint1/expr_binary.exp:1.4
--- src/tests/usr.bin/xlint/lint1/expr_binary.exp:1.3	Sun Aug  1 13:49:17 2021
+++ src/tests/usr.bin/xlint/lint1/expr_binary.exp	Sun Aug  1 14:42:21 2021
@@ -1,11 +1,37 @@
-expr_binary.c(22): warning: passing 'int' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(25): warning: passing 'int' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(28): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(31): warning: passing 'double' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(34): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(37): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(40): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(43): warning: passing '__uint128_t' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(46): warning: passing '__int128_t' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(49): warning: passing '__uint128_t' to incompatible 'struct incompatible', arg #1 [155]
-expr_binary.c(52): warning: passing '__uint128_t' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(24): warning: passing 'pointer to void' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(27): warning: passing 'pointer to void' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(30): warning: passing 'int' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(33): warning: passing 'const int' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(36): warning: passing 'volatile int' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(42): error: invalid type for _Complex [308]
+expr_binary.c(45): warning: passing 'long double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(47): warning: passing 'long double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(49): warning: passing 'long double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(51): warning: passing 'long double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(54): warning: passing 'double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(56): warning: passing 'double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(58): warning: passing 'double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(60): warning: passing 'double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(63): warning: passing 'float _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(65): warning: passing 'float _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(67): warning: passing 'float _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(69): warning: passing 'float _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(76): warning: passing 'double _Complex' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(79): warning: passing 'long double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(81): warning: passing 'long double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(83): warning: passing 'long double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(85): warning: passing 'long double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(88): warning: passing 'double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(90): warning: passing 'double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(92): warning: passing 'double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(94): warning: passing 'double' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(97): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(99): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(101): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(103): warning: passing 'float' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(106): warning: passing 'unsigned long long' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(108): warning: passing 'unsigned long long' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(111): warning: passing 'unsigned long long' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(113): warning: passing 'unsigned long long' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(117): warning: passing 'unsigned long long' to incompatible 'struct incompatible', arg #1 [155]
+expr_binary.c(119): warning: passing 'unsigned long long' to incompatible 'struct incompatible', arg #1 [155]

Reply via email to