lint: extract main part of case_label into separate function

This commit is contained in:
rillig 2021-01-01 11:01:03 +00:00
parent 620f102450
commit 124253e8af
1 changed files with 76 additions and 67 deletions

View File

@ -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 * Copyright (c) 1994, 1995 Jochen Pohl
@ -37,7 +37,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint) #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 #endif
#include <stdlib.h> #include <stdlib.h>
@ -413,34 +413,31 @@ named_label(sym_t *sym)
reached = 1; reached = 1;
} }
void static void
case_label(tnode_t *tn) check_case_label(tnode_t *tn, cstk_t *ci)
{ {
cstk_t *ci;
clst_t *cl; clst_t *cl;
val_t *v; val_t *v;
val_t nv; val_t nv;
tspec_t t; 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) { if (ci == NULL) {
/* case not in switch */ /* case not in switch */
error(195); error(195);
tn = NULL; return;
} 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 && tn->tn_op != CON) {
/* non-constant case expression */
error(197);
return;
}
if (tn != NULL && !tspec_is_int(tn->tn_type->t_tspec)) {
/* non-integral case expression */
error(198);
return;
}
lint_assert(ci->c_swtype != NULL); lint_assert(ci->c_swtype != NULL);
@ -489,6 +486,18 @@ case_label(tnode_t *tn)
ci->c_clst = cl; 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(); tfreeblk();
reached = 1; reached = 1;