various bug fixes & improvements

This commit is contained in:
eck 1990-04-06 15:37:16 +00:00
parent 6e685b9fcc
commit aa4de95f26
5 changed files with 18 additions and 11 deletions

View file

@ -612,7 +612,7 @@ ch3asgn(expp, oper, expr)
expr_error(exp, "operand of %s is read-only", oper_string);
} else if (fund == STRUCT || fund == UNION) {
if (recurqual(exp->ex_type, TQ_CONST))
expr_error(expr,"operand of %s contains a const-qualified member",
expr_error(exp,"operand of %s contains a const-qualified member",
oper_string);
}

View file

@ -42,9 +42,8 @@ ch3mon(oper, expp)
symbol2str((*expp)->ex_type->tp_fund));
} else {
expr = *expp;
if ((expr->ex_type->tp_fund == ARRAY
&& expr->ex_class != String)
|| expr->ex_type->tp_fund == FUNCTION)
if (is_ld_cst(expr))
/* dereference in administration only */
expr->ex_type = expr->ex_type->tp_up;
else /* runtime code */

View file

@ -255,7 +255,8 @@ dump_proto(pl)
print("%d: %s", argcnt++,
pl->pl_flag & PL_FORMAL ?
(pl->pl_flag & PL_VOID ? "void" : "formal")
: "ellipsis");
: (pl->pl_flag & PL_ELLIPSIS
? "ellipsis" : "unknown" ));
newline();
if (type = pl->pl_type){
dump_type(type);

View file

@ -597,11 +597,10 @@ check_formals(idf, dc)
if (du->du_proto) return;
if (!options['o'])
warning("'%s' old-fashioned function definition"
, dc->dc_idf->id_text);
if (pl) {
/* Don't give a warning about an old-style definition,
* since the arguments will be checked anyway.
*/
if (pl->pl_flag & PL_ELLIPSIS) {
if (!(du->du_proto) && !(pl->pl_flag & PL_ERRGIVEN))
error("ellipsis terminator in previous declaration");
@ -627,6 +626,10 @@ check_formals(idf, dc)
} else { /* make a pseudo-prototype */
register struct proto *lpl = new_proto();
if (!options['o'])
warning("'%s' old-fashioned function definition"
, dc->dc_idf->id_text);
while (fm) {
if (pl == 0) pl = lpl;
else {
@ -642,7 +645,7 @@ check_formals(idf, dc)
if (pl == 0) { /* make func(void) */
pl = lpl;
pl->pl_type = void_type;
pl->pl_flag = PL_VOID;
pl->pl_flag = PL_FORMAL | PL_VOID;
}
idf->id_def->df_type->tp_pseudoproto = pl;
}

View file

@ -79,7 +79,9 @@ add_proto(pl, ds, dc, lvl)
else {
if (idf != (struct idf *)0)
error("illegal use of void in argument list");
else pl->pl_flag = PL_VOID;
else {
pl->pl_flag |= PL_VOID;
}
}
}
@ -280,6 +282,7 @@ update_proto(tp, otp)
if (!tp || !otp) return;
while (tp->tp_fund != FUNCTION) {
if (tp->tp_fund != POINTER && tp->tp_fund != ARRAY) return;
tp = tp->tp_up;
otp = otp->tp_up;
if (!tp) return;
@ -287,6 +290,7 @@ update_proto(tp, otp)
pl = tp->tp_proto;
opl = otp->tp_proto;
if (pl == opl) return;
if (pl && opl) {
/* both have prototypes */
while (pl && opl) {