Module Name: src
Committed By: rillig
Date: Sat Dec 30 15:37:27 UTC 2023
Modified Files:
src/tests/usr.bin/xlint/lint1: d_c99_bool_strict.c
src/usr.bin/xlint/lint1: ckbool.c
Log Message:
lint: in strict bool mode, allow 'a & b' in controlling expressions
Previously, the expression 'a & b' was only treated as bool if 'a' had
enum type. This didn't cover cases in which bit masks were implemented
using integer types instead of enum sets.
To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c
cvs rdiff -u -r1.27 -r1.28 src/usr.bin/xlint/lint1/ckbool.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_strict.c
diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.46 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.47
--- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.46 Sat Dec 30 15:18:57 2023
+++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c Sat Dec 30 15:37:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: d_c99_bool_strict.c,v 1.46 2023/12/30 15:18:57 rillig Exp $ */
+/* $NetBSD: d_c99_bool_strict.c,v 1.47 2023/12/30 15:37:27 rillig Exp $ */
# 3 "d_c99_bool_strict.c"
/*
@@ -858,7 +858,7 @@ strict_bool_bitwise_and_enum(enum Flags
* what would fit into an unsigned char). Even if an enum could be extended
* to larger types than int, this pattern would work.
*/
-void
+bool
query_flag_from_enum_bit_set(enum Flags flags)
{
if (flags & FLAG0)
@@ -878,12 +878,20 @@ query_flag_from_enum_bit_set(enum Flags
if (flags & FLAG28)
println("FLAG28 is set");
+
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b0 = flags & FLAG0;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b1 = flags & FLAG1;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b28 = flags & FLAG28;
+ return b0 || b1 || b28;
}
-void
+bool
query_flag_from_int(int flags)
{
- /* expect+1: error: controlling expression must be bool, not 'int' [333] */
+
if (flags & FLAG0)
println("FLAG0 is set");
@@ -893,17 +901,22 @@ query_flag_from_int(int flags)
if ((flags & (FLAG0 | FLAG1)) == (FLAG0 | FLAG1))
println("FLAG0 and FLAG1 are both set");
- /* expect+2: error: left operand of '&&' must be bool, not 'int' [331] */
- /* expect+1: error: right operand of '&&' must be bool, not 'int' [332] */
if (flags & FLAG0 && flags & FLAG1)
println("FLAG0 and FLAG1 are both set");
if ((flags & (FLAG0 | FLAG1)) != 0)
println("At least one of FLAG0 and FLAG1 is set");
- /* expect+1: error: controlling expression must be bool, not 'int' [333] */
if (flags & FLAG28)
println("FLAG28 is set");
+
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b0 = flags & FLAG0;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b1 = flags & FLAG1;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b28 = flags & FLAG28;
+ return b0 || b1 || b28;
}
@@ -989,10 +1002,10 @@ typedef struct stdio_file {
int ferror(FILE *);
FILE stdio_files[3];
FILE *stdio_stdout;
-# 993 "d_c99_bool_strict.c" 2
+# 1006 "d_c99_bool_strict.c" 2
# 1 "string.h" 1 3 4
int strcmp(const char *, const char *);
-# 996 "d_c99_bool_strict.c" 2
+# 1009 "d_c99_bool_strict.c" 2
void
controlling_expression(FILE *f, const char *a, const char *b)
@@ -1026,9 +1039,9 @@ controlling_expression(FILE *f, const ch
*/
/* expect+5: error: controlling expression must be bool, not 'int' [333] */
if (ferror(
-# 1030 "d_c99_bool_strict.c" 3 4
+# 1043 "d_c99_bool_strict.c" 3 4
&stdio_files[1]
-# 1032 "d_c99_bool_strict.c"
+# 1045 "d_c99_bool_strict.c"
))
return;
@@ -1044,9 +1057,9 @@ controlling_expression(FILE *f, const ch
*/
/* expect+5: error: controlling expression must be bool, not 'int' [333] */
if (ferror(
-# 1048 "d_c99_bool_strict.c" 3 4
+# 1061 "d_c99_bool_strict.c" 3 4
stdio_stdout
-# 1050 "d_c99_bool_strict.c"
+# 1063 "d_c99_bool_strict.c"
))
return;
@@ -1059,9 +1072,9 @@ controlling_expression(FILE *f, const ch
*/
/* expect+5: error: controlling expression must be bool, not 'int' [333] */
if (ferror(
-# 1063 "d_c99_bool_strict.c" 3 4
+# 1076 "d_c99_bool_strict.c" 3 4
(stdio_stdout)
-# 1065 "d_c99_bool_strict.c"
+# 1078 "d_c99_bool_strict.c"
))
return;
@@ -1085,9 +1098,9 @@ controlling_expression(FILE *f, const ch
*/
/* expect+5: error: controlling expression must be bool, not 'int' [333] */
if (ferror(
-# 1089 "d_c99_bool_strict.c" 3 4
+# 1102 "d_c99_bool_strict.c" 3 4
stdio_stdout /* comment */
-# 1091 "d_c99_bool_strict.c"
+# 1104 "d_c99_bool_strict.c"
))
return;
}
Index: src/usr.bin/xlint/lint1/ckbool.c
diff -u src/usr.bin/xlint/lint1/ckbool.c:1.27 src/usr.bin/xlint/lint1/ckbool.c:1.28
--- src/usr.bin/xlint/lint1/ckbool.c:1.27 Sun Dec 3 12:03:38 2023
+++ src/usr.bin/xlint/lint1/ckbool.c Sat Dec 30 15:37:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: ckbool.c,v 1.27 2023/12/03 12:03:38 rillig Exp $ */
+/* $NetBSD: ckbool.c,v 1.28 2023/12/30 15:37:27 rillig Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: ckbool.c,v 1.27 2023/12/03 12:03:38 rillig Exp $");
+__RCSID("$NetBSD: ckbool.c,v 1.28 2023/12/30 15:37:27 rillig Exp $");
#endif
#include <string.h>
@@ -221,15 +221,7 @@ is_typeok_bool_compares_with_zero(const
if (tn->tn_sys && is_scalar(t))
return true;
-
- /* For enums that are used as bit sets, allow "flags & FLAG". */
- if (tn->tn_op == BITAND &&
- tn->tn_left->tn_op == CVT &&
- tn->tn_left->tn_type->t_is_enum &&
- tn->tn_right->tn_type->t_is_enum)
- return true;
-
- return false;
+ return tn->tn_op == BITAND;
}
bool