Module Name:    src
Committed By:   rillig
Date:           Tue Apr  6 21:59:58 UTC 2021

Modified Files:
        src/tests/usr.bin/xlint/lint1: msg_118.c
        src/usr.bin/xlint/lint1: tree.c

Log Message:
lint: for shift in C99 mode, do not warn about difference to pre-C90

C99 is too far away from traditional C to make this warning useful.
There are 3 different situations in which this warning is generated:

For '1 << (unsigned char)1', the result type is 'unsigned int' in
traditional C.  The result type is unsigned because at least 1 of the
operators is unsigned, and it is 'unsigned int' because the usual
arithmetic promotions are applied.

For '1 >> (long)1', as well as for '1 << (long)1', the result type is
'long' in traditional C since the usual arithmetic promotions are
applied.

Omitting this warning in C99 mode reduces the amount of lint warnings in
a typical NetBSD release build by approximately 6800 of 107000 total.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_118.c
cvs rdiff -u -r1.270 -r1.271 src/usr.bin/xlint/lint1/tree.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/msg_118.c
diff -u src/tests/usr.bin/xlint/lint1/msg_118.c:1.3 src/tests/usr.bin/xlint/lint1/msg_118.c:1.4
--- src/tests/usr.bin/xlint/lint1/msg_118.c:1.3	Sun Feb 28 01:22:02 2021
+++ src/tests/usr.bin/xlint/lint1/msg_118.c	Tue Apr  6 21:59:58 2021
@@ -1,9 +1,9 @@
-/*	$NetBSD: msg_118.c,v 1.3 2021/02/28 01:22:02 rillig Exp $	*/
+/*	$NetBSD: msg_118.c,v 1.4 2021/04/06 21:59:58 rillig Exp $	*/
 # 3 "msg_118.c"
 
-// Test for message: semantics of '%s' change in ANSI C; use explicit cast [118]
+/* Test for message: semantics of '%s' change in ANSI C; use explicit cast [118] */
 
-/* lint1-extra-flags: -h */
+/* lint1-flags: -hsw */
 
 int
 int_shl_uint(int i, unsigned int u)

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.270 src/usr.bin/xlint/lint1/tree.c:1.271
--- src/usr.bin/xlint/lint1/tree.c:1.270	Tue Apr  6 21:35:25 2021
+++ src/usr.bin/xlint/lint1/tree.c	Tue Apr  6 21:59:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.270 2021/04/06 21:35:25 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.271 2021/04/06 21:59:58 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.270 2021/04/06 21:35:25 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.271 2021/04/06 21:59:58 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -855,7 +855,7 @@ typeok_shr(const mod_t *mp,
 		 * The left operand would become unsigned in
 		 * traditional C.
 		 */
-		if (hflag &&
+		if (hflag && !Sflag &&
 		    (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
 			/* semantics of '%s' change in ANSI C; use ... */
 			warning(118, mp->m_name);
@@ -866,7 +866,7 @@ typeok_shr(const mod_t *mp,
 		 * In traditional C the left operand would be extended,
 		 * possibly with 1, and then shifted.
 		 */
-		if (hflag &&
+		if (hflag && !Sflag &&
 		    (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
 			/* semantics of '%s' change in ANSI C; use ... */
 			warning(118, mp->m_name);
@@ -891,7 +891,7 @@ typeok_shl(const mod_t *mp, tspec_t lt, 
 		 * that there is really a difference between
 		 * ANSI C and traditional C.
 		 */
-		if (hflag)
+		if (hflag && !Sflag)
 			/* semantics of '%s' change in ANSI C; use ... */
 			warning(118, mp->m_name);
 	}

Reply via email to