Module Name:    src
Committed By:   rillig
Date:           Fri Jul  2 18:52:21 UTC 2021

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

Log Message:
lint: no special check for unary operators in strict bool mode

All interesting constellations regarding unary operators are already
covered by the simple model from ops.def.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c
cvs rdiff -u -r1.25 -r1.26 \
    src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp
cvs rdiff -u -r1.4 -r1.5 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.28 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.29
--- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.28	Mon Apr  5 01:35:34 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c	Fri Jul  2 18:52:20 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: d_c99_bool_strict.c,v 1.28 2021/04/05 01:35:34 rillig Exp $	*/
+/*	$NetBSD: d_c99_bool_strict.c,v 1.29 2021/07/02 18:52:20 rillig Exp $	*/
 # 3 "d_c99_bool_strict.c"
 
 /*
@@ -439,6 +439,8 @@ strict_bool_operand_unary_address(void)
 	b = *bp;
 }
 
+/* see strict_bool_operand_unary_all below for the other unary operators. */
+
 /*
  * strict-bool-operand-binary:
  *	Operator	left:	bool?	other?	right:	bool?	other?
@@ -512,7 +514,7 @@ strict_bool_operand_binary(bool b, int i
 }
 
 void
-strict_bool_operand_binary_all(bool b, unsigned u)
+strict_bool_operand_unary_all(bool b)
 {
 	b = !b;
 	b = ~b;			/* expect: 335 */
@@ -522,7 +524,11 @@ strict_bool_operand_binary_all(bool b, u
 	b--;			/* expect: 335 */
 	b = +b;			/* expect: 335 */
 	b = -b;			/* expect: 335 */
+}
 
+void
+strict_bool_operand_binary_all(bool b, unsigned u)
+{
 	b = b * b;		/* expect: 336 *//* expect: 337 */
 	b = b / b;		/* expect: 336 *//* expect: 337 */
 	b = b % b;		/* expect: 336 *//* expect: 337 */

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.25 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp:1.26
--- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp:1.25	Fri Apr  9 20:12:00 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.exp	Fri Jul  2 18:52:20 2021
@@ -71,98 +71,98 @@ d_c99_bool_strict.c(424): error: operand
 d_c99_bool_strict.c(425): error: operand of '!' must be bool, not 'int' [330]
 d_c99_bool_strict.c(426): error: operand of '!' must be bool, not 'int' [330]
 d_c99_bool_strict.c(427): error: operand of '!' must be bool, not 'int' [330]
-d_c99_bool_strict.c(480): error: operands of '=' have incompatible types (_Bool != int) [107]
-d_c99_bool_strict.c(486): error: operands of '=' have incompatible types (_Bool != int) [107]
-d_c99_bool_strict.c(502): error: operand of '!' must be bool, not 'int' [330]
-d_c99_bool_strict.c(503): error: left operand of '&&' must be bool, not 'int' [331]
-d_c99_bool_strict.c(503): error: right operand of '&&' must be bool, not 'int' [332]
-d_c99_bool_strict.c(504): error: left operand of '||' must be bool, not 'int' [331]
-d_c99_bool_strict.c(504): error: right operand of '||' must be bool, not 'int' [332]
-d_c99_bool_strict.c(506): error: right operand of '&&' must be bool, not 'int' [332]
-d_c99_bool_strict.c(507): error: left operand of '&&' must be bool, not 'int' [331]
-d_c99_bool_strict.c(508): error: right operand of '||' must be bool, not 'int' [332]
-d_c99_bool_strict.c(509): error: left operand of '||' must be bool, not 'int' [331]
-d_c99_bool_strict.c(518): error: operand of '~' must not be bool [335]
-d_c99_bool_strict.c(519): error: operand of '++x' must not be bool [335]
-d_c99_bool_strict.c(520): error: operand of '--x' must not be bool [335]
-d_c99_bool_strict.c(521): error: operand of 'x++' must not be bool [335]
-d_c99_bool_strict.c(522): error: operand of 'x--' must not be bool [335]
-d_c99_bool_strict.c(523): error: operand of '+' must not be bool [335]
-d_c99_bool_strict.c(524): error: operand of '-' must not be bool [335]
-d_c99_bool_strict.c(526): error: left operand of '*' must not be bool [336]
-d_c99_bool_strict.c(526): error: right operand of '*' must not be bool [337]
-d_c99_bool_strict.c(527): error: left operand of '/' must not be bool [336]
-d_c99_bool_strict.c(527): error: right operand of '/' must not be bool [337]
-d_c99_bool_strict.c(528): error: left operand of '%' must not be bool [336]
-d_c99_bool_strict.c(528): error: right operand of '%' must not be bool [337]
-d_c99_bool_strict.c(529): error: left operand of '+' must not be bool [336]
-d_c99_bool_strict.c(529): error: right operand of '+' must not be bool [337]
-d_c99_bool_strict.c(530): error: left operand of '-' must not be bool [336]
-d_c99_bool_strict.c(530): error: right operand of '-' must not be bool [337]
-d_c99_bool_strict.c(531): error: left operand of '<<' must not be bool [336]
-d_c99_bool_strict.c(531): error: right operand of '<<' must not be bool [337]
-d_c99_bool_strict.c(532): error: left operand of '>>' must not be bool [336]
-d_c99_bool_strict.c(532): error: right operand of '>>' must not be bool [337]
-d_c99_bool_strict.c(534): error: left operand of '<' must not be bool [336]
-d_c99_bool_strict.c(534): error: right operand of '<' must not be bool [337]
-d_c99_bool_strict.c(535): error: left operand of '<=' must not be bool [336]
-d_c99_bool_strict.c(535): error: right operand of '<=' must not be bool [337]
-d_c99_bool_strict.c(536): error: left operand of '>' must not be bool [336]
-d_c99_bool_strict.c(536): error: right operand of '>' must not be bool [337]
-d_c99_bool_strict.c(537): error: left operand of '>=' must not be bool [336]
-d_c99_bool_strict.c(537): error: right operand of '>=' must not be bool [337]
-d_c99_bool_strict.c(549): error: left operand of '*=' must not be bool [336]
-d_c99_bool_strict.c(549): error: right operand of '*=' must not be bool [337]
-d_c99_bool_strict.c(550): error: left operand of '/=' must not be bool [336]
-d_c99_bool_strict.c(550): error: right operand of '/=' must not be bool [337]
-d_c99_bool_strict.c(551): error: left operand of '%=' must not be bool [336]
-d_c99_bool_strict.c(551): error: right operand of '%=' must not be bool [337]
-d_c99_bool_strict.c(552): error: left operand of '+=' must not be bool [336]
-d_c99_bool_strict.c(552): error: right operand of '+=' must not be bool [337]
-d_c99_bool_strict.c(553): error: left operand of '-=' must not be bool [336]
-d_c99_bool_strict.c(553): error: right operand of '-=' must not be bool [337]
-d_c99_bool_strict.c(554): error: left operand of '<<=' must not be bool [336]
-d_c99_bool_strict.c(554): error: right operand of '<<=' must not be bool [337]
-d_c99_bool_strict.c(555): error: left operand of '>>=' must not be bool [336]
-d_c99_bool_strict.c(555): error: right operand of '>>=' must not be bool [337]
-d_c99_bool_strict.c(561): error: left operand of '*' must not be bool [336]
-d_c99_bool_strict.c(562): error: right operand of '*' must not be bool [337]
-d_c99_bool_strict.c(563): error: left operand of '/' must not be bool [336]
-d_c99_bool_strict.c(564): error: right operand of '/' must not be bool [337]
-d_c99_bool_strict.c(565): error: left operand of '%' must not be bool [336]
-d_c99_bool_strict.c(566): error: right operand of '%' must not be bool [337]
-d_c99_bool_strict.c(567): error: left operand of '+' must not be bool [336]
-d_c99_bool_strict.c(568): error: right operand of '+' must not be bool [337]
-d_c99_bool_strict.c(569): error: left operand of '-' must not be bool [336]
-d_c99_bool_strict.c(570): error: right operand of '-' must not be bool [337]
-d_c99_bool_strict.c(571): error: left operand of '<<' must not be bool [336]
-d_c99_bool_strict.c(572): error: right operand of '<<' must not be bool [337]
-d_c99_bool_strict.c(573): error: left operand of '>>' must not be bool [336]
-d_c99_bool_strict.c(574): error: right operand of '>>' must not be bool [337]
-d_c99_bool_strict.c(576): error: operands of ':' have incompatible types (_Bool != unsigned int) [107]
-d_c99_bool_strict.c(577): error: operands of ':' have incompatible types (unsigned int != _Bool) [107]
-d_c99_bool_strict.c(583): warning: expression has null effect [129]
-d_c99_bool_strict.c(584): warning: expression has null effect [129]
-d_c99_bool_strict.c(597): error: operands of '=' have incompatible types (char != _Bool) [107]
-d_c99_bool_strict.c(598): error: operands of '=' have incompatible types (int != _Bool) [107]
-d_c99_bool_strict.c(599): error: operands of '=' have incompatible types (double != _Bool) [107]
-d_c99_bool_strict.c(600): error: operands of '=' have incompatible types (pointer != _Bool) [107]
-d_c99_bool_strict.c(617): error: operands of '=' have incompatible types (int != _Bool) [107]
-d_c99_bool_strict.c(618): error: operands of '=' have incompatible types (int != _Bool) [107]
-d_c99_bool_strict.c(619): error: operands of '=' have incompatible types (int != _Bool) [107]
-d_c99_bool_strict.c(620): error: operands of '=' have incompatible types (int != _Bool) [107]
-d_c99_bool_strict.c(621): error: operands of '=' have incompatible types (int != _Bool) [107]
-d_c99_bool_strict.c(622): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(482): error: operands of '=' have incompatible types (_Bool != int) [107]
+d_c99_bool_strict.c(488): error: operands of '=' have incompatible types (_Bool != int) [107]
+d_c99_bool_strict.c(504): error: operand of '!' must be bool, not 'int' [330]
+d_c99_bool_strict.c(505): error: left operand of '&&' must be bool, not 'int' [331]
+d_c99_bool_strict.c(505): error: right operand of '&&' must be bool, not 'int' [332]
+d_c99_bool_strict.c(506): error: left operand of '||' must be bool, not 'int' [331]
+d_c99_bool_strict.c(506): error: right operand of '||' must be bool, not 'int' [332]
+d_c99_bool_strict.c(508): error: right operand of '&&' must be bool, not 'int' [332]
+d_c99_bool_strict.c(509): error: left operand of '&&' must be bool, not 'int' [331]
+d_c99_bool_strict.c(510): error: right operand of '||' must be bool, not 'int' [332]
+d_c99_bool_strict.c(511): error: left operand of '||' must be bool, not 'int' [331]
+d_c99_bool_strict.c(520): error: operand of '~' must not be bool [335]
+d_c99_bool_strict.c(521): error: operand of '++x' must not be bool [335]
+d_c99_bool_strict.c(522): error: operand of '--x' must not be bool [335]
+d_c99_bool_strict.c(523): error: operand of 'x++' must not be bool [335]
+d_c99_bool_strict.c(524): error: operand of 'x--' must not be bool [335]
+d_c99_bool_strict.c(525): error: operand of '+' must not be bool [335]
+d_c99_bool_strict.c(526): error: operand of '-' must not be bool [335]
+d_c99_bool_strict.c(532): error: left operand of '*' must not be bool [336]
+d_c99_bool_strict.c(532): error: right operand of '*' must not be bool [337]
+d_c99_bool_strict.c(533): error: left operand of '/' must not be bool [336]
+d_c99_bool_strict.c(533): error: right operand of '/' must not be bool [337]
+d_c99_bool_strict.c(534): error: left operand of '%' must not be bool [336]
+d_c99_bool_strict.c(534): error: right operand of '%' must not be bool [337]
+d_c99_bool_strict.c(535): error: left operand of '+' must not be bool [336]
+d_c99_bool_strict.c(535): error: right operand of '+' must not be bool [337]
+d_c99_bool_strict.c(536): error: left operand of '-' must not be bool [336]
+d_c99_bool_strict.c(536): error: right operand of '-' must not be bool [337]
+d_c99_bool_strict.c(537): error: left operand of '<<' must not be bool [336]
+d_c99_bool_strict.c(537): error: right operand of '<<' must not be bool [337]
+d_c99_bool_strict.c(538): error: left operand of '>>' must not be bool [336]
+d_c99_bool_strict.c(538): error: right operand of '>>' must not be bool [337]
+d_c99_bool_strict.c(540): error: left operand of '<' must not be bool [336]
+d_c99_bool_strict.c(540): error: right operand of '<' must not be bool [337]
+d_c99_bool_strict.c(541): error: left operand of '<=' must not be bool [336]
+d_c99_bool_strict.c(541): error: right operand of '<=' must not be bool [337]
+d_c99_bool_strict.c(542): error: left operand of '>' must not be bool [336]
+d_c99_bool_strict.c(542): error: right operand of '>' must not be bool [337]
+d_c99_bool_strict.c(543): error: left operand of '>=' must not be bool [336]
+d_c99_bool_strict.c(543): error: right operand of '>=' must not be bool [337]
+d_c99_bool_strict.c(555): error: left operand of '*=' must not be bool [336]
+d_c99_bool_strict.c(555): error: right operand of '*=' must not be bool [337]
+d_c99_bool_strict.c(556): error: left operand of '/=' must not be bool [336]
+d_c99_bool_strict.c(556): error: right operand of '/=' must not be bool [337]
+d_c99_bool_strict.c(557): error: left operand of '%=' must not be bool [336]
+d_c99_bool_strict.c(557): error: right operand of '%=' must not be bool [337]
+d_c99_bool_strict.c(558): error: left operand of '+=' must not be bool [336]
+d_c99_bool_strict.c(558): error: right operand of '+=' must not be bool [337]
+d_c99_bool_strict.c(559): error: left operand of '-=' must not be bool [336]
+d_c99_bool_strict.c(559): error: right operand of '-=' must not be bool [337]
+d_c99_bool_strict.c(560): error: left operand of '<<=' must not be bool [336]
+d_c99_bool_strict.c(560): error: right operand of '<<=' must not be bool [337]
+d_c99_bool_strict.c(561): error: left operand of '>>=' must not be bool [336]
+d_c99_bool_strict.c(561): error: right operand of '>>=' must not be bool [337]
+d_c99_bool_strict.c(567): error: left operand of '*' must not be bool [336]
+d_c99_bool_strict.c(568): error: right operand of '*' must not be bool [337]
+d_c99_bool_strict.c(569): error: left operand of '/' must not be bool [336]
+d_c99_bool_strict.c(570): error: right operand of '/' must not be bool [337]
+d_c99_bool_strict.c(571): error: left operand of '%' must not be bool [336]
+d_c99_bool_strict.c(572): error: right operand of '%' must not be bool [337]
+d_c99_bool_strict.c(573): error: left operand of '+' must not be bool [336]
+d_c99_bool_strict.c(574): error: right operand of '+' must not be bool [337]
+d_c99_bool_strict.c(575): error: left operand of '-' must not be bool [336]
+d_c99_bool_strict.c(576): error: right operand of '-' must not be bool [337]
+d_c99_bool_strict.c(577): error: left operand of '<<' must not be bool [336]
+d_c99_bool_strict.c(578): error: right operand of '<<' must not be bool [337]
+d_c99_bool_strict.c(579): error: left operand of '>>' must not be bool [336]
+d_c99_bool_strict.c(580): error: right operand of '>>' must not be bool [337]
+d_c99_bool_strict.c(582): error: operands of ':' have incompatible types (_Bool != unsigned int) [107]
+d_c99_bool_strict.c(583): error: operands of ':' have incompatible types (unsigned int != _Bool) [107]
+d_c99_bool_strict.c(589): warning: expression has null effect [129]
+d_c99_bool_strict.c(590): warning: expression has null effect [129]
+d_c99_bool_strict.c(603): error: operands of '=' have incompatible types (char != _Bool) [107]
+d_c99_bool_strict.c(604): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(605): error: operands of '=' have incompatible types (double != _Bool) [107]
+d_c99_bool_strict.c(606): error: operands of '=' have incompatible types (pointer != _Bool) [107]
 d_c99_bool_strict.c(623): error: operands of '=' have incompatible types (int != _Bool) [107]
 d_c99_bool_strict.c(624): error: operands of '=' have incompatible types (int != _Bool) [107]
 d_c99_bool_strict.c(625): error: operands of '=' have incompatible types (int != _Bool) [107]
-d_c99_bool_strict.c(663): error: operands of '=' have incompatible types (_Bool != int) [107]
-d_c99_bool_strict.c(671): error: operands of '=' have incompatible types (_Bool != int) [107]
-d_c99_bool_strict.c(678): error: operands of '=' have incompatible types (_Bool != int) [107]
-d_c99_bool_strict.c(653): warning: argument 'flags' unused in function 'strict_bool_bitwise_and_enum' [231]
-d_c99_bool_strict.c(717): error: operands of '==' have incompatible types (_Bool != int) [107]
-d_c99_bool_strict.c(729): warning: expression has null effect [129]
-d_c99_bool_strict.c(741): error: right operand of '+' must not be bool [337]
-d_c99_bool_strict.c(758): warning: constant in conditional context [161]
-d_c99_bool_strict.c(769): error: operands of 'init' have incompatible types (_Bool != int) [107]
-d_c99_bool_strict.c(770): error: operands of 'init' have incompatible types (_Bool != int) [107]
+d_c99_bool_strict.c(626): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(627): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(628): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(629): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(630): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(631): error: operands of '=' have incompatible types (int != _Bool) [107]
+d_c99_bool_strict.c(669): error: operands of '=' have incompatible types (_Bool != int) [107]
+d_c99_bool_strict.c(677): error: operands of '=' have incompatible types (_Bool != int) [107]
+d_c99_bool_strict.c(684): error: operands of '=' have incompatible types (_Bool != int) [107]
+d_c99_bool_strict.c(659): warning: argument 'flags' unused in function 'strict_bool_bitwise_and_enum' [231]
+d_c99_bool_strict.c(723): error: operands of '==' have incompatible types (_Bool != int) [107]
+d_c99_bool_strict.c(735): warning: expression has null effect [129]
+d_c99_bool_strict.c(747): error: right operand of '+' must not be bool [337]
+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]

Index: src/usr.bin/xlint/lint1/ckbool.c
diff -u src/usr.bin/xlint/lint1/ckbool.c:1.4 src/usr.bin/xlint/lint1/ckbool.c:1.5
--- src/usr.bin/xlint/lint1/ckbool.c:1.4	Sun Jun 20 20:32:42 2021
+++ src/usr.bin/xlint/lint1/ckbool.c	Fri Jul  2 18:52:20 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ckbool.c,v 1.4 2021/06/20 20:32:42 rillig Exp $ */
+/* $NetBSD: ckbool.c,v 1.5 2021/07/02 18:52:20 rillig Exp $ */
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 #include <sys/cdefs.h>
 
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: ckbool.c,v 1.4 2021/06/20 20:32:42 rillig Exp $");
+__RCSID("$NetBSD: ckbool.c,v 1.5 2021/07/02 18:52:20 rillig Exp $");
 #endif
 
 #include <string.h>
@@ -82,13 +82,10 @@ is_int_constant_zero(const tnode_t *tn, 
 }
 
 static bool
-is_typeok_strict_bool(op_t op,
-		      const tnode_t *ln, tspec_t lt,
-		      const tnode_t *rn, tspec_t rt)
+is_typeok_strict_bool_binary(op_t op,
+			     const tnode_t *ln, tspec_t lt,
+			     const tnode_t *rn, tspec_t rt)
 {
-	if (rn == NULL)
-		return true;	/* TODO: check unary operators as well. */
-
 	if ((lt == BOOL) == (rt == BOOL))
 		return true;
 
@@ -113,12 +110,11 @@ is_typeok_strict_bool(op_t op,
  * behavior.
  */
 static bool
-typeok_strict_bool_compatible(op_t op, int arg,
-			      const tnode_t *ln, tspec_t lt,
-			      const tnode_t *rn, tspec_t rt)
+typeok_strict_bool_binary_compatible(op_t op, int arg,
+				     const tnode_t *ln, tspec_t lt,
+				     const tnode_t *rn, tspec_t rt)
 {
-
-	if (is_typeok_strict_bool(op, ln, lt, rn, rt))
+	if (is_typeok_strict_bool_binary(op, ln, lt, rn, rt))
 		return true;
 
 	if (op == FARG) {
@@ -157,7 +153,8 @@ typeok_scalar_strict_bool(op_t op, const
 		rt = NOTSPEC;
 	}
 
-	if (!typeok_strict_bool_compatible(op, arg, ln, lt, rn, rt))
+	if (rn != NULL &&
+	    !typeok_strict_bool_binary_compatible(op, arg, ln, lt, rn, rt))
 		return false;
 
 	if (mp->m_requires_bool || op == QUEST) {

Reply via email to