From d50600e263c69b6263b60b82bcc5fa31a3995973 Mon Sep 17 00:00:00 2001 From: eck Date: Wed, 22 Nov 1989 16:41:09 +0000 Subject: [PATCH] fixed unary & and indirect calls --- lang/cem/cemcom.ansi/arith.c | 2 +- lang/cem/cemcom.ansi/ch3bin.c | 14 ++++++++++++++ lang/cem/cemcom.ansi/ch3mon.c | 4 ++-- lang/cem/cemcom.ansi/eval.c | 4 +++- lang/cem/cemcom.ansi/expr.c | 1 + lang/cem/cemcom.ansi/expression.g | 4 +++- lang/cem/cemcom.ansi/ival.g | 5 ++++- lang/cem/cemcom.ansi/tokenname.c | 1 + 8 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lang/cem/cemcom.ansi/arith.c b/lang/cem/cemcom.ansi/arith.c index 514a49639..ece5613a3 100644 --- a/lang/cem/cemcom.ansi/arith.c +++ b/lang/cem/cemcom.ansi/arith.c @@ -495,7 +495,7 @@ any2opnd(expp, oper) if (!*expp) return; - if (oper == SIZEOF || oper == '&') return; + if (oper == SIZEOF || oper == ADDRESSOF) return; switch ((*expp)->ex_type->tp_fund) { case CHAR: diff --git a/lang/cem/cemcom.ansi/ch3bin.c b/lang/cem/cemcom.ansi/ch3bin.c index 5e7806f71..10a9a45c2 100644 --- a/lang/cem/cemcom.ansi/ch3bin.c +++ b/lang/cem/cemcom.ansi/ch3bin.c @@ -70,12 +70,25 @@ ch3bin(expp, oper, expr) break; case '(': /* 3.3.2.2 */ +#if 1 if ( expp_tp->tp_fund == POINTER && expp_tp->tp_up->tp_fund == FUNCTION ) { ch3mon('*', expp); expp_tp = (*expp)->ex_type; } +#else + if (expp_tp->tp_fund != POINTER + || expp->tp_up->tp_fund != FUNCTION) { + expr_error(*expp, "call of non-function (%s)", + symbol2str(expp_tp->tp_fund)); + /* leave the expression; it may still serve */ + free_expression(expr); /* there go the parameters */ + *expp = new_oper(error_type, + *expp, '(', (struct expr *)0); + } +#endif +#if 1 if (expp_tp->tp_fund != FUNCTION) { expr_error(*expp, "call of non-function (%s)", symbol2str(expp_tp->tp_fund)); @@ -84,6 +97,7 @@ ch3bin(expp, oper, expr) *expp = new_oper(error_type, *expp, '(', (struct expr *)0); } +#endif else *expp = new_oper(expp_tp->tp_up, *expp, '(', expr); diff --git a/lang/cem/cemcom.ansi/ch3mon.c b/lang/cem/cemcom.ansi/ch3mon.c index 6543e97b1..e3ed3287a 100644 --- a/lang/cem/cemcom.ansi/ch3mon.c +++ b/lang/cem/cemcom.ansi/ch3mon.c @@ -56,7 +56,7 @@ ch3mon(oper, expp) (*expp)->ex_flags &= ~EX_ILVALUE; } break; - case '&': + case ADDRESSOF: if ((*expp)->ex_type->tp_fund == ARRAY) { (*expp)->ex_type = pointer_to((*expp)->ex_type, 0); } @@ -87,7 +87,7 @@ ch3mon(oper, expp) if (def->df_sc == REGISTER) { expr_error(*expp, "& on register variable not allowed"); - break; /* break case '&' */ + break; /* break case ADDRESSOF */ } } (*expp)->ex_type = pointer_to((*expp)->ex_type, diff --git a/lang/cem/cemcom.ansi/eval.c b/lang/cem/cemcom.ansi/eval.c index e4eff9127..4f192ea3e 100644 --- a/lang/cem/cemcom.ansi/eval.c +++ b/lang/cem/cemcom.ansi/eval.c @@ -70,7 +70,9 @@ EVAL(expr, val, code, true_label, false_label) int val, code; label true_label, false_label; { - register int gencode = (code == TRUE && expr->ex_type->tp_size > 0); + register int gencode = (code == TRUE + && (expr->ex_type->tp_size > 0 + || expr->ex_type->tp_fund == FUNCTION)); switch (expr->ex_class) { case Value: /* just a simple value */ diff --git a/lang/cem/cemcom.ansi/expr.c b/lang/cem/cemcom.ansi/expr.c index eba15bce3..8a46fbe4b 100644 --- a/lang/cem/cemcom.ansi/expr.c +++ b/lang/cem/cemcom.ansi/expr.c @@ -48,6 +48,7 @@ rank_of(oper) case MINMIN: case CAST: case SIZEOF: + case ADDRESSOF: return 2; /* monadic */ case '*': case '/': diff --git a/lang/cem/cemcom.ansi/expression.g b/lang/cem/cemcom.ansi/expression.g index f06506fd9..2aad3bbcb 100644 --- a/lang/cem/cemcom.ansi/expression.g +++ b/lang/cem/cemcom.ansi/expression.g @@ -283,7 +283,9 @@ expression(struct expr **expp;) unop(int *oper;) : ['*' | '&' | '-' | '+' | '!' | '~' | PLUSPLUS | MINMIN] - {*oper = DOT;} + { if (DOT == '&') DOT = ADDRESSOF; + *oper = DOT; + } ; multop: diff --git a/lang/cem/cemcom.ansi/ival.g b/lang/cem/cemcom.ansi/ival.g index 2d1229fae..487d71e58 100644 --- a/lang/cem/cemcom.ansi/ival.g +++ b/lang/cem/cemcom.ansi/ival.g @@ -61,7 +61,10 @@ initial_value(register struct type **tpp; register struct expr **expp;) : if ((*expp)->ex_type->tp_fund == ARRAY) array2pointer(*expp); if (tpp) { - if (is_ld_cst(*expp) || is_fp_cst(*expp) || level >= L_LOCAL) { + if (level >= L_LOCAL + || is_ld_cst(*expp) + || is_fp_cst(*expp) + || (*expp)->ex_class == String) { gen_simple_exp(tpp, expp); free_expression(*expp); *expp = 0; diff --git a/lang/cem/cemcom.ansi/tokenname.c b/lang/cem/cemcom.ansi/tokenname.c index ea22e1ca6..1610f6b9f 100644 --- a/lang/cem/cemcom.ansi/tokenname.c +++ b/lang/cem/cemcom.ansi/tokenname.c @@ -120,6 +120,7 @@ struct tokenname tkfunny[] = { /* internal keywords */ {INITCOMMA, "initcomma"}, {CAST, "cast"}, {CASTAB, "castab"}, + {ADDRESSOF,"unary &"}, {POSTINCR, "postfix ++"}, {POSTDECR, "postfix --"}, -- 2.34.1