diff --git a/lang/cem/cemcom/ch7.c b/lang/cem/cemcom/ch7.c index c276a829a..d0997df4c 100644 --- a/lang/cem/cemcom/ch7.c +++ b/lang/cem/cemcom/ch7.c @@ -41,7 +41,9 @@ ch7sel(expp, oper, idf) exp = *expp; tp = exp->ex_type; 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; else { /* constructions like "12->selector" and "char c; c->selector" @@ -54,6 +56,8 @@ ch7sel(expp, oper, idf) sd = idf2sdef(idf, tp); tp = sd->sd_stype; break; + case POINTER: + break; default: expr_error(exp, "-> applied to %s", symbol2str(tp->tp_fund)); @@ -61,7 +65,7 @@ ch7sel(expp, oper, idf) exp->ex_type = error_type; return; } - } /* tp->tp_fund != POINTER */ + } } /* oper == ARROW */ else { /* oper == '.' */ /* filter out illegal expressions "non_lvalue.sel" */ diff --git a/lang/cem/cemcom/idf.c b/lang/cem/cemcom/idf.c index 4512dbaa7..15b3c839c 100644 --- a/lang/cem/cemcom/idf.c +++ b/lang/cem/cemcom/idf.c @@ -34,7 +34,7 @@ int idfsize = IDFSIZE; extern char options[]; 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]; /* All identifiers can in principle be reached through diff --git a/lang/cem/cemcom/util.c b/lang/cem/cemcom/util.c index c41cda4dc..0c044087f 100644 --- a/lang/cem/cemcom/util.c +++ b/lang/cem/cemcom/util.c @@ -136,9 +136,11 @@ LocalFinish() } regs[i] = 0; } + if (! options['n']) { + C_mes_begin(ms_reg); + C_mes_end(); + } #ifdef USE_TMP - C_mes_begin(ms_reg); - C_mes_end(); C_endpart(loc_id); #endif }