Module Name:    src
Committed By:   rillig
Date:           Fri Jan  1 10:55:28 UTC 2021

Modified Files:
        src/usr.bin/xlint/lint1: cgram.y externs1.h func.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.124 -r1.125 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.42 -r1.43 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.41 -r1.42 src/usr.bin/xlint/lint1/func.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/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.124 src/usr.bin/xlint/lint1/cgram.y:1.125
--- src/usr.bin/xlint/lint1/cgram.y:1.124	Fri Jan  1 09:28:22 2021
+++ src/usr.bin/xlint/lint1/cgram.y	Fri Jan  1 10:55:27 2021
@@ -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 @@ labeled_stmnt:
 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;
 	  }
 	;

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.42 src/usr.bin/xlint/lint1/externs1.h:1.43
--- src/usr.bin/xlint/lint1/externs1.h:1.42	Wed Dec 30 13:17:42 2020
+++ src/usr.bin/xlint/lint1/externs1.h	Fri Jan  1 10:55:28 2021
@@ -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	popctrl(int);
 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);

Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.41 src/usr.bin/xlint/lint1/func.c:1.42
--- src/usr.bin/xlint/lint1/func.c:1.41	Fri Jan  1 09:11:40 2021
+++ src/usr.bin/xlint/lint1/func.c	Fri Jan  1 10:55:28 2021
@@ -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,15 +399,22 @@ funcend(void)
 	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;
@@ -415,111 +422,102 @@ label(int typ, sym_t *sym, tnode_t *tn)
 	val_t	nv;
 	tspec_t	t;
 
-	switch (typ) {
-
-	case T_NAME:
-		if (sym->s_set) {
-			/* label %s redefined */
-			error(194, sym->s_name);
-		} else {
-			mark_as_set(sym);
-		}
-		break;
-
-	case T_CASE:
+	/* find the stack entry for the innermost switch statement */
+	for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_next)
+		continue;
 
-		/* 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) {
-			/* 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 (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 (tn != NULL) {
+	if (tn != NULL) {
 
-			lint_assert(ci->c_swtype != NULL);
+		lint_assert(ci->c_swtype != NULL);
 
-			if (reached && !ftflg) {
-				if (hflag)
-					/* fallthrough on case statement */
-					warning(220);
-			}
+		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);
-			}
+		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);
+		}
 
+		/*
+		 * 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);
+
+		/* 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();
+
+	reached = 1;
+}
 
-	case T_DEFAULT:
+void
+default_label(void)
+{
+	cstk_t	*ci;
 
-		/* 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);
-			}
-			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;
 }
 

Reply via email to