Module Name: src
Committed By: rillig
Date: Sat Apr 15 11:34:45 UTC 2023
Modified Files:
src/tests/usr.bin/xlint/lint1: queries.c
src/usr.bin/xlint/lint1: err.c func.c
Log Message:
lint: add query for parenthesized return value
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/xlint/lint1/queries.c
cvs rdiff -u -r1.192 -r1.193 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.152 -r1.153 src/usr.bin/xlint/lint1/func.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/queries.c
diff -u src/tests/usr.bin/xlint/lint1/queries.c:1.11 src/tests/usr.bin/xlint/lint1/queries.c:1.12
--- src/tests/usr.bin/xlint/lint1/queries.c:1.11 Fri Mar 31 13:03:05 2023
+++ src/tests/usr.bin/xlint/lint1/queries.c Sat Apr 15 11:34:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: queries.c,v 1.11 2023/03/31 13:03:05 rillig Exp $ */
+/* $NetBSD: queries.c,v 1.12 2023/04/15 11:34:45 rillig Exp $ */
# 3 "queries.c"
/*
@@ -15,7 +15,7 @@
* such as casts between arithmetic types.
*/
-/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8 -X 351 */
+/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8,9 -X 351 */
typedef unsigned char u8_t;
typedef unsigned short u16_t;
@@ -310,6 +310,49 @@ Q8(void)
u16 = 0000644;
}
+int
+Q9(int x)
+{
+ switch (x) {
+ case 0:
+ return 0;
+ case 1:
+ /* expect+1: parenthesized return value [Q9] */
+ return (0);
+ case 2:
+ return +(0);
+ case 3:
+ return -(13);
+ case 4:
+ /* expect+1: parenthesized return value [Q9] */
+ return (0), (1);
+ case 5:
+ /* expect+1: parenthesized return value [Q9] */
+ return (0, 1);
+ case 6:
+ return 0, 1;
+ case 7:
+ /* expect+1: implicit conversion from floating point 'double' to integer 'int' [Q1] */
+ return 0.0;
+ case 8:
+ /* expect+2: parenthesized return value [Q9] */
+ /* expect+1: implicit conversion from floating point 'double' to integer 'int' [Q1] */
+ return (0.0);
+ case 9:
+ return
+# 344 "queries.c" 3 4
+ ((void *)0)
+# 346 "queries.c"
+ /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */
+ ;
+ case 10:
+ /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */
+ return (void *)(0);
+ default:
+ return 0;
+ }
+}
+
/*
* Since queries do not affect the exit status, force a warning to make this
* test conform to the general expectation that a test that produces output
Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.192 src/usr.bin/xlint/lint1/err.c:1.193
--- src/usr.bin/xlint/lint1/err.c:1.192 Fri Mar 31 13:03:05 2023
+++ src/usr.bin/xlint/lint1/err.c Sat Apr 15 11:34:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: err.c,v 1.192 2023/03/31 13:03:05 rillig Exp $ */
+/* $NetBSD: err.c,v 1.193 2023/04/15 11:34:45 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: err.c,v 1.192 2023/03/31 13:03:05 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.193 2023/04/15 11:34:45 rillig Exp $");
#endif
#include <limits.h>
@@ -699,6 +699,7 @@ static const char *queries[] = {
"no-op cast from '%s' to '%s'", /* Q6 */
"redundant cast from '%s' to '%s' before assignment", /* Q7 */
"octal number '%.*s'", /* Q8 */
+ "parenthesized return value", /* Q9 */
};
bool any_query_enabled; /* for optimizing non-query scenarios */
Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.152 src/usr.bin/xlint/lint1/func.c:1.153
--- src/usr.bin/xlint/lint1/func.c:1.152 Sat Apr 15 10:32:46 2023
+++ src/usr.bin/xlint/lint1/func.c Sat Apr 15 11:34:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: func.c,v 1.152 2023/04/15 10:32:46 rillig Exp $ */
+/* $NetBSD: func.c,v 1.153 2023/04/15 11:34:45 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: func.c,v 1.152 2023/04/15 10:32:46 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.153 2023/04/15 11:34:45 rillig Exp $");
#endif
#include <stdlib.h>
@@ -1047,9 +1047,24 @@ do_continue(void)
set_reached(false);
}
+static bool
+is_parenthesized(const tnode_t *tn)
+{
+
+ while (!tn->tn_parenthesized && tn->tn_op == COMMA)
+ tn = tn->tn_right;
+ return tn->tn_parenthesized && !tn->tn_sys;
+}
+
static void
check_return_value(bool sys, tnode_t *tn)
{
+
+ if (any_query_enabled && is_parenthesized(tn)) {
+ /* parenthesized return value */
+ query_message(9);
+ }
+
/* Create a temporary node for the left side */
tnode_t *ln = expr_zero_alloc(sizeof(*ln));
ln->tn_op = NAME;