Fri Jan 1 10:55:28 2021 UTC ()
lint: split label handling into separate functions

The only thing these cases have in common is the name "label" and the
"reached = 1" assignment.  That's not reason enough to combine
completely unrelated functions.


(rillig)
diff -r1.124 -r1.125 src/usr.bin/xlint/lint1/cgram.y
diff -r1.42 -r1.43 src/usr.bin/xlint/lint1/externs1.h
diff -r1.41 -r1.42 src/usr.bin/xlint/lint1/func.c

cvs diff -r1.124 -r1.125 src/usr.bin/xlint/lint1/cgram.y (expand / switch to context diff)
--- src/usr.bin/xlint/lint1/cgram.y 2021/01/01 09:28:22 1.124
+++ src/usr.bin/xlint/lint1/cgram.y 2021/01/01 10:55:27 1.125
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.124 2021/01/01 09:28:22 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.125 2021/01/01 10:55:27 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.124 2021/01/01 09:28:22 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.125 2021/01/01 10:55:27 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -1490,19 +1490,19 @@
 label:
 	  T_NAME T_COLON {
 		symtyp = FLABEL;
-		label(T_NAME, getsym($1), NULL);
+		named_label(getsym($1));
 	  }
 	| T_CASE constant T_COLON {
-		label(T_CASE, NULL, $2);
+		case_label($2);
 		ftflg = 1;
 	}
 	| T_CASE constant T_ELLIPSE constant T_COLON {
 		/* XXX: We don't fill all cases */
-		label(T_CASE, NULL, $2);
+		case_label($2);
 		ftflg = 1;
 	}
 	| T_DEFAULT T_COLON {
-		label(T_DEFAULT, NULL, NULL);
+		default_label();
 		ftflg = 1;
 	  }
 	;

cvs diff -r1.42 -r1.43 src/usr.bin/xlint/lint1/externs1.h (expand / switch to context diff)
--- src/usr.bin/xlint/lint1/externs1.h 2020/12/30 13:17:42 1.42
+++ src/usr.bin/xlint/lint1/externs1.h 2021/01/01 10:55:28 1.43
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.42 2020/12/30 13:17:42 rillig Exp $	*/
+/*	$NetBSD: externs1.h,v 1.43 2021/01/01 10:55:28 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -248,7 +248,9 @@
 extern	void	check_statement_reachable(void);
 extern	void	funcdef(sym_t *);
 extern	void	funcend(void);
-extern	void	label(int, sym_t *, tnode_t *);
+extern	void	named_label(sym_t *);
+extern	void	case_label(tnode_t *);
+extern	void	default_label(void);
 extern	void	if1(tnode_t *);
 extern	void	if2(void);
 extern	void	if3(int);

cvs diff -r1.41 -r1.42 src/usr.bin/xlint/lint1/func.c (expand / switch to context diff)
--- src/usr.bin/xlint/lint1/func.c 2021/01/01 09:11:40 1.41
+++ src/usr.bin/xlint/lint1/func.c 2021/01/01 10:55:28 1.42
@@ -1,4 +1,4 @@
-/*	$NetBSD: func.c,v 1.41 2021/01/01 09:11:40 rillig Exp $	*/
+/*	$NetBSD: func.c,v 1.42 2021/01/01 10:55:28 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: func.c,v 1.41 2021/01/01 09:11:40 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.42 2021/01/01 10:55:28 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -399,127 +399,125 @@
 	reached = 1;
 }
 
-/*
- * Process a label.
- *
- * typ		type of the label (T_NAME, T_DEFAULT or T_CASE).
- * sym		symbol table entry of label if typ == T_NAME
- * tn		expression if typ == T_CASE
- */
 void
-label(int typ, sym_t *sym, tnode_t *tn)
+named_label(sym_t *sym)
 {
+
+	if (sym->s_set) {
+		/* label %s redefined */
+		error(194, sym->s_name);
+	} else {
+		mark_as_set(sym);
+	}
+
+	reached = 1;
+}
+
+void
+case_label(tnode_t *tn)
+{
 	cstk_t	*ci;
 	clst_t	*cl;
 	val_t	*v;
 	val_t	nv;
 	tspec_t	t;
 
-	switch (typ) {
+	/* find the stack entry for the innermost switch statement */
+	for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_next)
+		continue;
 
-	case T_NAME:
-		if (sym->s_set) {
-			/* label %s redefined */
-			error(194, sym->s_name);
-		} else {
-			mark_as_set(sym);
-		}
-		break;
+	if (ci == NULL) {
+		/* case not in switch */
+		error(195);
+		tn = NULL;
+	} else if (tn != NULL && tn->tn_op != CON) {
+		/* non-constant case expression */
+		error(197);
+		tn = NULL;
+	} else if (tn != NULL && !tspec_is_int(tn->tn_type->t_tspec)) {
+		/* non-integral case expression */
+		error(198);
+		tn = NULL;
+	}
 
-	case T_CASE:
+	if (tn != NULL) {
 
-		/* find the stack entry for the innermost switch statement */
-		for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_next)
-			continue;
+		lint_assert(ci->c_swtype != NULL);
 
-		if (ci == NULL) {
-			/* case not in switch */
-			error(195);
-			tn = NULL;
-		} else if (tn != NULL && tn->tn_op != CON) {
-			/* non-constant case expression */
-			error(197);
-			tn = NULL;
-		} else if (tn != NULL && !tspec_is_int(tn->tn_type->t_tspec)) {
-			/* non-integral case expression */
-			error(198);
-			tn = NULL;
+		if (reached && !ftflg) {
+			if (hflag)
+				/* fallthrough on case statement */
+				warning(220);
 		}
 
-		if (tn != NULL) {
+		t = tn->tn_type->t_tspec;
+		if (t == LONG || t == ULONG ||
+		    t == QUAD || t == UQUAD) {
+			if (tflag)
+				/* case label must be of type ... */
+				warning(203);
+		}
 
-			lint_assert(ci->c_swtype != NULL);
+		/*
+		 * get the value of the expression and convert it
+		 * to the type of the switch expression
+		 */
+		v = constant(tn, 1);
+		(void) memset(&nv, 0, sizeof nv);
+		cvtcon(CASE, 0, ci->c_swtype, &nv, v);
+		free(v);
 
-			if (reached && !ftflg) {
-				if (hflag)
-					/* fallthrough on case statement */
-					warning(220);
-			}
-
-			t = tn->tn_type->t_tspec;
-			if (t == LONG || t == ULONG ||
-			    t == QUAD || t == UQUAD) {
-				if (tflag)
-					/* case label must be of type ... */
-					warning(203);
-			}
-
+		/* look if we had this value already */
+		for (cl = ci->c_clst; cl != NULL; cl = cl->cl_next) {
+			if (cl->cl_val.v_quad == nv.v_quad)
+				break;
+		}
+		if (cl != NULL && tspec_is_uint(nv.v_tspec)) {
+			/* duplicate case in switch: %lu */
+			error(200, (u_long)nv.v_quad);
+		} else if (cl != NULL) {
+			/* duplicate case in switch: %ld */
+			error(199, (long)nv.v_quad);
+		} else {
 			/*
-			 * get the value of the expression and convert it
-			 * to the type of the switch expression
+			 * append the value to the list of
+			 * case values
 			 */
-			v = constant(tn, 1);
-			(void) memset(&nv, 0, sizeof nv);
-			cvtcon(CASE, 0, ci->c_swtype, &nv, v);
-			free(v);
-
-			/* look if we had this value already */
-			for (cl = ci->c_clst; cl != NULL; cl = cl->cl_next) {
-				if (cl->cl_val.v_quad == nv.v_quad)
-					break;
-			}
-			if (cl != NULL && tspec_is_uint(nv.v_tspec)) {
-				/* duplicate case in switch: %lu */
-				error(200, (u_long)nv.v_quad);
-			} else if (cl != NULL) {
-				/* duplicate case in switch: %ld */
-				error(199, (long)nv.v_quad);
-			} else {
-				/*
-				 * append the value to the list of
-				 * case values
-				 */
-				cl = xcalloc(1, sizeof (clst_t));
-				cl->cl_val = nv;
-				cl->cl_next = ci->c_clst;
-				ci->c_clst = cl;
-			}
+			cl = xcalloc(1, sizeof (clst_t));
+			cl->cl_val = nv;
+			cl->cl_next = ci->c_clst;
+			ci->c_clst = cl;
 		}
-		tfreeblk();
-		break;
+	}
+	tfreeblk();
 
-	case T_DEFAULT:
+	reached = 1;
+}
 
-		/* find the stack entry for the innermost switch statement */
-		for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_next)
-			continue;
+void
+default_label(void)
+{
+	cstk_t	*ci;
 
-		if (ci == NULL) {
-			/* default outside switch */
-			error(201);
-		} else if (ci->c_default) {
-			/* duplicate default in switch */
-			error(202);
-		} else {
-			if (reached && !ftflg) {
-				if (hflag)
-					/* fallthrough on default statement */
-					warning(284);
-			}
-			ci->c_default = 1;
+	/* find the stack entry for the innermost switch statement */
+	for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_next)
+		continue;
+
+	if (ci == NULL) {
+		/* default outside switch */
+		error(201);
+	} else if (ci->c_default) {
+		/* duplicate default in switch */
+		error(202);
+	} else {
+		if (reached && !ftflg) {
+			if (hflag)
+				/* fallthrough on default statement */
+				warning(284);
 		}
-		break;
-	};
+		ci->c_default = 1;
+	}
+
 	reached = 1;
 }