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; +}