if (!*expp)
return;
- if (oper == SIZEOF || oper == '&') return;
+ if (oper == SIZEOF || oper == ADDRESSOF) return;
switch ((*expp)->ex_type->tp_fund) {
case CHAR:
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));
*expp = new_oper(error_type,
*expp, '(', (struct expr *)0);
}
+#endif
else
*expp = new_oper(expp_tp->tp_up,
*expp, '(', expr);
(*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);
}
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,
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 */
case MINMIN:
case CAST:
case SIZEOF:
+ case ADDRESSOF:
return 2; /* monadic */
case '*':
case '/':
unop(int *oper;) :
['*' | '&' | '-' | '+' | '!' | '~' | PLUSPLUS | MINMIN]
- {*oper = DOT;}
+ { if (DOT == '&') DOT = ADDRESSOF;
+ *oper = DOT;
+ }
;
multop:
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;
{INITCOMMA, "initcomma"},
{CAST, "cast"},
{CASTAB, "castab"},
+ {ADDRESSOF,"unary &"},
{POSTINCR, "postfix ++"},
{POSTDECR, "postfix --"},