Module Name: src
Committed By: rillig
Date: Sat Sep 4 12:05:54 UTC 2021
Modified Files:
src/usr.bin/xlint/lint1: decl.c
Log Message:
lint: split declare_local into smaller functions
To generate a diff of this commit:
cvs rdiff -u -r1.228 -r1.229 src/usr.bin/xlint/lint1/decl.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.228 src/usr.bin/xlint/lint1/decl.c:1.229
--- src/usr.bin/xlint/lint1/decl.c:1.228 Sun Aug 29 15:49:04 2021
+++ src/usr.bin/xlint/lint1/decl.c Sat Sep 4 12:05:54 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.228 2021/08/29 15:49:04 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.229 2021/09/04 12:05:54 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: decl.c,v 1.228 2021/08/29 15:49:04 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.229 2021/09/04 12:05:54 rillig Exp $");
#endif
#include <sys/param.h>
@@ -2656,6 +2656,66 @@ check_prototype_declaration(sym_t *arg,
return msg;
}
+static void
+check_local_hiding(const sym_t *dsym)
+{
+ switch (dsym->s_scl) {
+ case AUTO:
+ /* automatic hides external declaration: %s */
+ warning(86, dsym->s_name);
+ break;
+ case STATIC:
+ /* static hides external declaration: %s */
+ warning(87, dsym->s_name);
+ break;
+ case TYPEDEF:
+ /* typedef hides external declaration: %s */
+ warning(88, dsym->s_name);
+ break;
+ case EXTERN:
+ /* Already checked in declare_external_in_block. */
+ break;
+ default:
+ lint_assert(/*CONSTCOND*/false);
+ }
+}
+
+static void
+check_local_redeclaration(const sym_t *dsym, sym_t *rsym)
+{
+ if (rsym->s_block_level == 0) {
+ if (hflag)
+ check_local_hiding(dsym);
+
+ } else if (rsym->s_block_level == block_level) {
+
+ /* no hflag, because it's illegal! */
+ if (rsym->s_arg) {
+ /*
+ * if !tflag, a "redeclaration of %s" error
+ * is produced below
+ */
+ if (tflag) {
+ if (hflag)
+ /* decl. hides parameter: %s */
+ warning(91, dsym->s_name);
+ rmsym(rsym);
+ }
+ }
+
+ } else if (rsym->s_block_level < block_level) {
+ if (hflag)
+ /* declaration hides earlier one: %s */
+ warning(95, dsym->s_name);
+ }
+
+ if (rsym->s_block_level == block_level) {
+ /* redeclaration of %s */
+ error(27, dsym->s_name);
+ rmsym(rsym);
+ }
+}
+
/*
* Completes a single local declaration/definition.
*/
@@ -2717,71 +2777,8 @@ declare_local(sym_t *dsym, bool initflg)
}
}
- if (dcs->d_redeclared_symbol != NULL) {
-
- if (dcs->d_redeclared_symbol->s_block_level == 0) {
-
- switch (dsym->s_scl) {
- case AUTO:
- if (hflag)
- /* automatic hides external decl.: %s */
- warning(86, dsym->s_name);
- break;
- case STATIC:
- if (hflag)
- /* static hides external decl.: %s */
- warning(87, dsym->s_name);
- break;
- case TYPEDEF:
- if (hflag)
- /* typedef hides external decl.: %s */
- warning(88, dsym->s_name);
- break;
- case EXTERN:
- /*
- * Warnings and errors are printed in
- * declare_external_in_block()
- */
- break;
- default:
- lint_assert(/*CONSTCOND*/false);
- }
-
- } else if (dcs->d_redeclared_symbol->s_block_level ==
- block_level) {
-
- /* no hflag, because it's illegal! */
- if (dcs->d_redeclared_symbol->s_arg) {
- /*
- * if !tflag, a "redeclaration of %s" error
- * is produced below
- */
- if (tflag) {
- if (hflag)
- /* decl. hides parameter: %s */
- warning(91, dsym->s_name);
- rmsym(dcs->d_redeclared_symbol);
- }
- }
-
- } else if (dcs->d_redeclared_symbol->s_block_level <
- block_level) {
-
- if (hflag)
- /* declaration hides earlier one: %s */
- warning(95, dsym->s_name);
-
- }
-
- if (dcs->d_redeclared_symbol->s_block_level == block_level) {
-
- /* redeclaration of %s */
- error(27, dsym->s_name);
- rmsym(dcs->d_redeclared_symbol);
-
- }
-
- }
+ if (dcs->d_redeclared_symbol != NULL)
+ check_local_redeclaration(dsym, dcs->d_redeclared_symbol);
if (initflg && !check_init(dsym)) {
dsym->s_def = DEF;