fixed a bug with setjmp.

Fixed a bug with non-struct pointers referring to structs
This commit is contained in:
ceriel 1987-08-06 14:19:06 +00:00
parent c24f960d82
commit bfd6e2061f
3 changed files with 11 additions and 5 deletions

View file

@ -41,7 +41,9 @@ ch7sel(expp, oper, idf)
exp = *expp; exp = *expp;
tp = exp->ex_type; tp = exp->ex_type;
if (oper == ARROW) { if (oper == ARROW) {
if (tp->tp_fund == POINTER) /* normal case */ if (tp->tp_fund == POINTER &&
( tp->tp_up->tp_fund == STRUCT ||
tp->tp_up->tp_fund == UNION)) /* normal case */
tp = tp->tp_up; tp = tp->tp_up;
else { /* constructions like "12->selector" and else { /* constructions like "12->selector" and
"char c; c->selector" "char c; c->selector"
@ -54,6 +56,8 @@ ch7sel(expp, oper, idf)
sd = idf2sdef(idf, tp); sd = idf2sdef(idf, tp);
tp = sd->sd_stype; tp = sd->sd_stype;
break; break;
case POINTER:
break;
default: default:
expr_error(exp, "-> applied to %s", expr_error(exp, "-> applied to %s",
symbol2str(tp->tp_fund)); symbol2str(tp->tp_fund));
@ -61,7 +65,7 @@ ch7sel(expp, oper, idf)
exp->ex_type = error_type; exp->ex_type = error_type;
return; return;
} }
} /* tp->tp_fund != POINTER */ }
} /* oper == ARROW */ } /* oper == ARROW */
else { /* oper == '.' */ else { /* oper == '.' */
/* filter out illegal expressions "non_lvalue.sel" */ /* filter out illegal expressions "non_lvalue.sel" */

View file

@ -34,7 +34,7 @@ int idfsize = IDFSIZE;
extern char options[]; extern char options[];
extern arith NewLocal(); extern arith NewLocal();
char sp_occurred[SP_TOTAL]; /* indicate occurrence of special id */ char sp_occurred[SP_TOTAL+1]; /* indicate occurrence of special id */
struct idf *idf_hashtable[HASHSIZE]; struct idf *idf_hashtable[HASHSIZE];
/* All identifiers can in principle be reached through /* All identifiers can in principle be reached through

View file

@ -136,9 +136,11 @@ LocalFinish()
} }
regs[i] = 0; regs[i] = 0;
} }
if (! options['n']) {
C_mes_begin(ms_reg);
C_mes_end();
}
#ifdef USE_TMP #ifdef USE_TMP
C_mes_begin(ms_reg);
C_mes_end();
C_endpart(loc_id); C_endpart(loc_id);
#endif #endif
} }