1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-28 19:29:53 +00:00

Squashed one more bug in the switch statement

git-svn-id: svn://svn.cc65.org/cc65/trunk@816 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2001-07-24 20:19:03 +00:00
parent 0b08eb0e68
commit 8cd7b15c8b

View File

@ -329,6 +329,9 @@ static void CascadeSwitch (ExprDesc* Expr)
long Val; /* Case label value */ long Val; /* Case label value */
/* Get the unqualified type of the switch expression */
type ExprType = UnqualifiedType (Expr->Type[0]);
/* Create a loop so we may break out, init labels */ /* Create a loop so we may break out, init labels */
ExitLab = GetLocalLabel (); ExitLab = GetLocalLabel ();
AddLoop (oursp, 0, ExitLab, 0, 0); AddLoop (oursp, 0, ExitLab, 0, 0);
@ -353,24 +356,24 @@ static void CascadeSwitch (ExprDesc* Expr)
if (CodeLab == 0) { if (CodeLab == 0) {
CodeLab = GetLocalLabel (); CodeLab = GetLocalLabel ();
} }
g_jump (CodeLab); g_jump (CodeLab);
} }
/* If we have a cascade label, emit it */ /* If we have a cascade label, emit it */
if (NextLab) { if (NextLab) {
g_defcodelabel (NextLab); g_defcodelabel (NextLab);
NextLab = 0; NextLab = 0;
} }
while (CurTok.Tok == TOK_CASE || CurTok.Tok == TOK_DEFAULT) { while (CurTok.Tok == TOK_CASE || CurTok.Tok == TOK_DEFAULT) {
/* Parse the selector */ /* Parse the selector */
if (CurTok.Tok == TOK_CASE) { if (CurTok.Tok == TOK_CASE) {
/* Count labels */ /* Count labels */
++lcount; ++lcount;
/* Skip the "case" token */ /* Skip the "case" token */
NextToken (); NextToken ();
/* Read the selector expression */ /* Read the selector expression */
@ -381,7 +384,7 @@ static void CascadeSwitch (ExprDesc* Expr)
/* Check the range of the expression */ /* Check the range of the expression */
Val = lval.ConstVal; Val = lval.ConstVal;
switch (*Expr->Type) { switch (ExprType) {
case T_SCHAR: case T_SCHAR:
/* Signed char */ /* Signed char */
@ -409,11 +412,11 @@ static void CascadeSwitch (ExprDesc* Expr)
break; break;
default: default:
Internal ("Invalid type: %02X", *Expr->Type & 0xFF); Internal ("Invalid type: %04X", ExprType);
} }
/* Emit a compare */ /* Emit a compare */
g_cmp (Flags, Val); g_cmp (Flags, Val);
/* If another case follows after the colon (which is /* If another case follows after the colon (which is
* currently pending and cannot be skipped since otherwise * currently pending and cannot be skipped since otherwise
@ -471,7 +474,7 @@ static void CascadeSwitch (ExprDesc* Expr)
if (CurTok.Tok != TOK_RCURLY) { if (CurTok.Tok != TOK_RCURLY) {
HaveBreak = Statement (0); HaveBreak = Statement (0);
} }
} }
/* Check if we have any labels */ /* Check if we have any labels */
if (lcount == 0 && !HaveDefault) { if (lcount == 0 && !HaveDefault) {