Module Name: src Committed By: rillig Date: Sun Nov 14 11:23:52 UTC 2021
Modified Files: src/tests/usr.bin/xlint/lint1: d_c99_bool_strict.c d_c99_bool_strict.exp Log Message: tests/lint: demonstrate missing errors for strict bool mode Seen in bin/echo/echo.c. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c cvs rdiff -u -r1.28 -r1.29 \ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.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/d_c99_bool_strict.c diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.30 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.31 --- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.30 Sun Jul 4 07:09:39 2021 +++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c Sun Nov 14 11:23:52 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: d_c99_bool_strict.c,v 1.30 2021/07/04 07:09:39 rillig Exp $ */ +/* $NetBSD: d_c99_bool_strict.c,v 1.31 2021/11/14 11:23:52 rillig Exp $ */ # 3 "d_c99_bool_strict.c" /* @@ -776,3 +776,63 @@ initialization(void) { 1 }, /* expect: 107 */ }; } + +# 1 "stdio.h" 1 3 4 +typedef struct stdio_file { + int fd; +} FILE; +int ferror(FILE *); +FILE stdio_files[3]; +FILE *stdio_stdout; +# 788 "d_c99_bool_strict.c" 2 +# 1 "string.h" 1 3 4 +int strcmp(const char *, const char *); +# 791 "d_c99_bool_strict.c" 2 + +void +controlling_expression(FILE *f, const char *a, const char *b) +{ + /* expect+1: error: controlling expression must be bool, not 'int' [333] */ + if (ferror(f)) + return; + /* expect+1: error: controlling expression must be bool, not 'int' [333] */ + if (strcmp(a, b)) + return; + /* expect+1: error: operand of '!' must be bool, not 'int' [330] */ + if (!ferror(f)) + return; + /* expect+1: error: operand of '!' must be bool, not 'int' [330] */ + if (!strcmp(a, b)) + return; + + /* + * No warning below since the expression 'stdio_stdin' comes from a + * system header (typically via a macro), and this property is passed + * up to the expression 'ferror(stdio_stdin)'. + * + * That is wrong though since the above rule would allow a plain + * 'strcmp' without a following '== 0', as long as one of its + * arguments comes from a system header. + * + * Seen in bin/echo/echo.c, function main, call to ferror. + */ + /* TODO: Warn about type mismatch [333]. */ + if (ferror( +# 822 "d_c99_bool_strict.c" 3 4 + &stdio_files[1] +# 824 "d_c99_bool_strict.c" + )) + return; + + /* + * TODO: Why is there a difference between array access and a plain + * variable? Either both should get a warning or none of them. + */ + /* expect+5: error: controlling expression must be bool, not 'int' [333] */ + if (ferror( +# 834 "d_c99_bool_strict.c" 3 4 + stdio_stdout +# 836 "d_c99_bool_strict.c" + )) + return; +} Index: src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp:1.28 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp:1.29 --- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp:1.28 Sat Aug 14 12:46:24 2021 +++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp Sun Nov 14 11:23:52 2021 @@ -167,3 +167,8 @@ d_c99_bool_strict.c(747): error: right o d_c99_bool_strict.c(764): warning: constant in conditional context [161] d_c99_bool_strict.c(775): error: operands of 'init' have incompatible types (_Bool != int) [107] d_c99_bool_strict.c(776): error: operands of 'init' have incompatible types (_Bool != int) [107] +d_c99_bool_strict.c(796): error: controlling expression must be bool, not 'int' [333] +d_c99_bool_strict.c(799): error: controlling expression must be bool, not 'int' [333] +d_c99_bool_strict.c(802): error: operand of '!' must be bool, not 'int' [330] +d_c99_bool_strict.c(805): error: operand of '!' must be bool, not 'int' [330] +d_c99_bool_strict.c(836): error: controlling expression must be bool, not 'int' [333]