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