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;

Reply via email to