Module Name: src Committed By: rillig Date: Mon Jul 3 09:37:14 UTC 2023
Modified Files: src/tests/usr.bin/xlint/lint1: d_c99_bool.c d_c99_bool_strict.c Log Message: tests/lint: clean up tests for C99 bool To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/tests/usr.bin/xlint/lint1/d_c99_bool.c cvs rdiff -u -r1.40 -r1.41 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.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/d_c99_bool.c diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool.c:1.10 src/tests/usr.bin/xlint/lint1/d_c99_bool.c:1.11 --- src/tests/usr.bin/xlint/lint1/d_c99_bool.c:1.10 Tue Mar 28 14:44:34 2023 +++ src/tests/usr.bin/xlint/lint1/d_c99_bool.c Mon Jul 3 09:37:14 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: d_c99_bool.c,v 1.10 2023/03/28 14:44:34 rillig Exp $ */ +/* $NetBSD: d_c99_bool.c,v 1.11 2023/07/03 09:37:14 rillig Exp $ */ # 3 "d_c99_bool.c" /* @@ -11,114 +11,78 @@ /* lint1-extra-flags: -X 351 */ -/* Below, each false statement produces "negative array dimension" [20]. */ +/* expect+1: error: negative array dimension (-2) [20] */ +int int_0[(_Bool)0 ? -1 : -2]; -int int_0_converts_to_false[(_Bool)0 ? -1 : 1]; /* expect+1: error: negative array dimension (-1) [20] */ -int int_0_converts_to_true_[(_Bool)0 ? 1 : -1]; +int int_1[(_Bool)1 ? -1 : -2]; /* expect+1: error: negative array dimension (-1) [20] */ -int int_1_converts_to_false[(_Bool)1 ? -1 : 1]; -int int_1_converts_to_true_[(_Bool)1 ? 1 : -1]; +int int_2[(_Bool)2 ? -1 : -2]; /* expect+1: error: negative array dimension (-1) [20] */ -int int_2_converts_to_false[(_Bool)2 ? -1 : 1]; -int int_2_converts_to_true_[(_Bool)2 ? 1 : -1]; +int int_256[(_Bool)256 ? -1 : -2]; -/* expect+1: error: negative array dimension (-1) [20] */ -int int_256_converts_to_false[(_Bool)256 ? -1 : 1]; -int int_256_converts_to_true_[(_Bool)256 ? 1 : -1]; - -int null_pointer_converts_to_false[(_Bool)(void *)0 ? -1 : 1]; -/* expect+1: error: negative array dimension (-1) [20] */ -int null_pointer_converts_to_true_[(_Bool)(void *)0 ? 1 : -1]; +/* expect+1: error: negative array dimension (-2) [20] */ +int null_pointer[(_Bool)(void *)0 ? -1 : -2]; /* - * XXX: lint does not treat the address of a global variable as a constant - * expression. This goes against C99 6.6p7 but is probably not too relevant - * in practice. + * XXX: In initializers for global variables, taking the address of a variable + * is allowed and may be modified by a constant offset. This is not a constant + * expression though. * - * In such a case, to_int_constant(tn, false) in cgram.y:array_size_opt - * returns 1 for the array size. This is why neither of the following array - * declarations generates an error message. + * In such a case, the grammar rule array_size_opt calls to_int_constant, which + * returns 1 for the array size without reporting an error. This is why + * neither of the following array declarations generates an error message. */ char ch; int nonnull_pointer_converts_to_false[(_Bool)&ch ? -1 : 1]; int nonnull_pointer_converts_to_true_[(_Bool)&ch ? 1 : -1]; /* expect+1: error: negative array dimension (-1) [20] */ -int double_minus_1_0_converts_to_false[(_Bool)-1.0 ? -1 : 1]; -int double_minus_1_0_converts_to_true_[(_Bool)-1.0 ? 1 : -1]; +int double_minus_1_0[(_Bool)-1.0 ? -1 : -2]; /* expect+1: error: negative array dimension (-1) [20] */ -int double_minus_0_5_converts_to_false[(_Bool)-0.5 ? -1 : 1]; -int double_minus_0_5_converts_to_true_[(_Bool)-0.5 ? 1 : -1]; +int double_minus_0_5[(_Bool)-0.5 ? -1 : -2]; -int double_minus_0_0_converts_to_false[(_Bool)-0.0 ? -1 : 1]; -/* expect+1: error: negative array dimension (-1) [20] */ -int double_minus_0_0_converts_to_true_[(_Bool)-0.0 ? 1 : -1]; +/* expect+1: error: negative array dimension (-2) [20] */ +int double_minus_0_0[(_Bool)-0.0 ? -1 : -2]; -int double_0_0_converts_to_false[(_Bool)0.0 ? -1 : 1]; -/* expect+1: error: negative array dimension (-1) [20] */ -int double_0_0_converts_to_true_[(_Bool)0.0 ? 1 : -1]; +/* expect+1: error: negative array dimension (-2) [20] */ +int double_0_0[(_Bool)0.0 ? -1 : -2]; /* The C99 rationale explains in 6.3.1.2 why (_Bool)0.5 is true. */ /* expect+1: error: negative array dimension (-1) [20] */ -int double_0_5_converts_to_false[(_Bool)0.5 ? -1 : 1]; -int double_0_5_converts_to_true_[(_Bool)0.5 ? 1 : -1]; +int double_0_5_converts_to_false[(_Bool)0.5 ? -1 : -2]; /* expect+1: error: negative array dimension (-1) [20] */ -int double_1_0_converts_to_false[(_Bool)1.0 ? -1 : 1]; -int double_1_0_converts_to_true_[(_Bool)1.0 ? 1 : -1]; - -_Bool -bool_to_bool(_Bool b) -{ - return b; -} - -_Bool -char_to_bool(char c) -{ - return c; -} - -_Bool -int_to_bool(int i) -{ - return i; -} - -_Bool -double_to_bool(double d) -{ - return d; -} - -enum color { - RED -}; - -_Bool -enum_to_bool(enum color e) -{ - return e; -} - -_Bool -pointer_to_bool(const char *p) -{ - return p; -} - -_Bool -function_pointer_to_bool(void (*f)(void)) -{ - return f; -} +int double_1_0_converts_to_false[(_Bool)1.0 ? -1 : -2]; _Bool -complex_to_bool(double _Complex c) +convert_to_bool(int selector) { - return c; + static struct variant { + _Bool b; + char c; + int i; + double d; + enum color { + RED + } e; + const char *pcc; + void (*f)(void); + double _Complex dc; + } v = { .i = 0 }; + + switch (selector) { + case 0: return v.b; + case 1: return v.c; + case 2: return v.i; + case 3: return v.d; + case 4: return v.e; + case 5: return v.pcc; + case 6: return v.f; + case 7: return v.dc; + default: return v.b; + } } Index: src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.40 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.41 --- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.40 Tue Mar 28 14:44:34 2023 +++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c Mon Jul 3 09:37:14 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: d_c99_bool_strict.c,v 1.40 2023/03/28 14:44:34 rillig Exp $ */ +/* $NetBSD: d_c99_bool_strict.c,v 1.41 2023/07/03 09:37:14 rillig Exp $ */ # 3 "d_c99_bool_strict.c" /* @@ -1065,3 +1065,8 @@ controlling_expression(FILE *f, const ch )) return; } + +// In strict bool mode, the identifiers '__lint_false' and '__lint_true' are +// predefined, but not any others. +/* expect+1: error: '__lint_unknown' undefined [99] */ +int unknown = sizeof __lint_unknown;