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]