Module Name: src Committed By: rillig Date: Fri Jan 1 11:01:03 UTC 2021
Modified Files: src/usr.bin/xlint/lint1: func.c Log Message: lint: extract main part of case_label into separate function To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.43 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/func.c diff -u src/usr.bin/xlint/lint1/func.c:1.42 src/usr.bin/xlint/lint1/func.c:1.43 --- src/usr.bin/xlint/lint1/func.c:1.42 Fri Jan 1 10:55:28 2021 +++ src/usr.bin/xlint/lint1/func.c Fri Jan 1 11:01:03 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: func.c,v 1.42 2021/01/01 10:55:28 rillig Exp $ */ +/* $NetBSD: func.c,v 1.43 2021/01/01 11:01:03 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.42 2021/01/01 10:55:28 rillig Exp $"); +__RCSID("$NetBSD: func.c,v 1.43 2021/01/01 11:01:03 rillig Exp $"); #endif #include <stdlib.h> @@ -413,82 +413,91 @@ named_label(sym_t *sym) reached = 1; } -void -case_label(tnode_t *tn) +static void +check_case_label(tnode_t *tn, cstk_t *ci) { - cstk_t *ci; clst_t *cl; val_t *v; val_t nv; tspec_t t; - /* 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) { + return; + } + + 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)) { + return; + } + + if (tn != NULL && !tspec_is_int(tn->tn_type->t_tspec)) { /* non-integral case expression */ error(198); - tn = NULL; + return; } - 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; } +} + +void +case_label(tnode_t *tn) +{ + 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; + + check_case_label(tn, ci); + tfreeblk(); reached = 1;