Module Name: src
Committed By: rillig
Date: Tue Mar 28 20:04:52 UTC 2023
Modified Files:
src/distrib/sets/lists/tests: mi
src/tests/usr.bin/xlint/lint1: msg_090.c
src/usr.bin/xlint/lint1: decl.c err.c
Added Files:
src/tests/usr.bin/xlint/lint1: msg_352.c
Log Message:
lint: warn about 'extern' declarations inside function bodies
https://mail-index.netbsd.org/tech-userlevel/2023/03/15/msg013727.html
The previous attempt (message 351 about 'extern' declarations outside
headers) did not cover the proposal from the tech-userlevel mailing list
but instead warns about a different usage pattern of the 'extern'
keyword.
To generate a diff of this commit:
cvs rdiff -u -r1.1255 -r1.1256 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/msg_090.c
cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/xlint/lint1/msg_352.c
cvs rdiff -u -r1.306 -r1.307 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.190 -r1.191 src/usr.bin/xlint/lint1/err.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1255 src/distrib/sets/lists/tests/mi:1.1256
--- src/distrib/sets/lists/tests/mi:1.1255 Tue Mar 28 14:44:34 2023
+++ src/distrib/sets/lists/tests/mi Tue Mar 28 20:04:51 2023
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1255 2023/03/28 14:44:34 rillig Exp $
+# $NetBSD: mi,v 1.1256 2023/03/28 20:04:51 rillig Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -7342,6 +7342,7 @@
./usr/tests/usr.bin/xlint/lint1/msg_349.exp tests-obsolete obsolete,atf
./usr/tests/usr.bin/xlint/lint1/msg_350.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/xlint/lint1/msg_351.c tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/msg_352.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/xlint/lint1/op_colon.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/xlint/lint1/op_colon.exp tests-obsolete obsolete,atf
./usr/tests/usr.bin/xlint/lint1/op_shl_lp64.c tests-usr.bin-tests compattestfile,atf
Index: src/tests/usr.bin/xlint/lint1/msg_090.c
diff -u src/tests/usr.bin/xlint/lint1/msg_090.c:1.5 src/tests/usr.bin/xlint/lint1/msg_090.c:1.6
--- src/tests/usr.bin/xlint/lint1/msg_090.c:1.5 Tue Mar 28 14:44:34 2023
+++ src/tests/usr.bin/xlint/lint1/msg_090.c Tue Mar 28 20:04:52 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_090.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_090.c,v 1.6 2023/03/28 20:04:52 rillig Exp $ */
# 3 "msg_090.c"
// Test for message: inconsistent redeclaration of extern '%s' [90]
@@ -10,6 +10,7 @@ extern int random_number(void);
void
use(void)
{
+ /* expect+2: warning: nested 'extern' declaration of 'random_number' [352] */
/* expect+1: warning: inconsistent redeclaration of extern 'random_number' [90] */
extern int random_number(int);
}
Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.306 src/usr.bin/xlint/lint1/decl.c:1.307
--- src/usr.bin/xlint/lint1/decl.c:1.306 Tue Mar 28 14:44:35 2023
+++ src/usr.bin/xlint/lint1/decl.c Tue Mar 28 20:04:52 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.306 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.307 2023/03/28 20:04:52 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: decl.c,v 1.306 2023/03/28 14:44:35 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.307 2023/03/28 20:04:52 rillig Exp $");
#endif
#include <sys/param.h>
@@ -2728,6 +2728,11 @@ declare_local(sym_t *dsym, bool initflg)
dsym->s_scl = EXTERN;
}
+ if (dsym->s_scl == EXTERN) {
+ /* nested 'extern' declaration of '%s' */
+ warning(352, dsym->s_name);
+ }
+
if (dsym->s_type->t_tspec == FUNC) {
if (dsym->s_scl == STATIC) {
/* dubious static function '%s' at block level */
Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.190 src/usr.bin/xlint/lint1/err.c:1.191
--- src/usr.bin/xlint/lint1/err.c:1.190 Tue Mar 28 14:44:35 2023
+++ src/usr.bin/xlint/lint1/err.c Tue Mar 28 20:04:52 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: err.c,v 1.190 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: err.c,v 1.191 2023/03/28 20:04:52 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.190 2023/03/28 14:44:35 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.191 2023/03/28 20:04:52 rillig Exp $");
#endif
#include <limits.h>
@@ -407,6 +407,7 @@ static const char *const msgs[] = {
"non type argument to alignof is a GCC extension", /* 349 */
"'_Atomic' requires C11 or later", /* 350 */
"'extern' declaration of '%s' outside a header", /* 351 */
+ "nested 'extern' declaration of '%s'", /* 352 */
};
static bool is_suppressed[sizeof(msgs) / sizeof(msgs[0])];
Added files:
Index: src/tests/usr.bin/xlint/lint1/msg_352.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/msg_352.c:1.1
--- /dev/null Tue Mar 28 20:04:52 2023
+++ src/tests/usr.bin/xlint/lint1/msg_352.c Tue Mar 28 20:04:52 2023
@@ -0,0 +1,22 @@
+/* $NetBSD: msg_352.c,v 1.1 2023/03/28 20:04:52 rillig Exp $ */
+# 3 "msg_352.c"
+
+// Test for message 352: nested 'extern' declaration of '%s' [352]
+
+/*
+ * C allows to declare external functions or objects inside function bodies,
+ * which invites inconsistent types.
+ *
+ * Instead, any external functions or objects should be declared in headers.
+ */
+
+int
+function(void)
+{
+ /* expect+1: warning: nested 'extern' declaration of 'external_func' [352] */
+ extern int external_func(void);
+ /* expect+1: warning: nested 'extern' declaration of 'external_var' [352] */
+ extern int external_var;
+
+ return external_func() + external_var;
+}