fixed unary & and indirect calls
This commit is contained in:
parent
96da16ce33
commit
d50600e263
8 changed files with 29 additions and 6 deletions
|
@ -495,7 +495,7 @@ any2opnd(expp, oper)
|
||||||
if (!*expp)
|
if (!*expp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (oper == SIZEOF || oper == '&') return;
|
if (oper == SIZEOF || oper == ADDRESSOF) return;
|
||||||
|
|
||||||
switch ((*expp)->ex_type->tp_fund) {
|
switch ((*expp)->ex_type->tp_fund) {
|
||||||
case CHAR:
|
case CHAR:
|
||||||
|
|
|
@ -70,12 +70,25 @@ ch3bin(expp, oper, expr)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '(': /* 3.3.2.2 */
|
case '(': /* 3.3.2.2 */
|
||||||
|
#if 1
|
||||||
if ( expp_tp->tp_fund == POINTER &&
|
if ( expp_tp->tp_fund == POINTER &&
|
||||||
expp_tp->tp_up->tp_fund == FUNCTION
|
expp_tp->tp_up->tp_fund == FUNCTION
|
||||||
) {
|
) {
|
||||||
ch3mon('*', expp);
|
ch3mon('*', expp);
|
||||||
expp_tp = (*expp)->ex_type;
|
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) {
|
if (expp_tp->tp_fund != FUNCTION) {
|
||||||
expr_error(*expp, "call of non-function (%s)",
|
expr_error(*expp, "call of non-function (%s)",
|
||||||
symbol2str(expp_tp->tp_fund));
|
symbol2str(expp_tp->tp_fund));
|
||||||
|
@ -84,6 +97,7 @@ ch3bin(expp, oper, expr)
|
||||||
*expp = new_oper(error_type,
|
*expp = new_oper(error_type,
|
||||||
*expp, '(', (struct expr *)0);
|
*expp, '(', (struct expr *)0);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
*expp = new_oper(expp_tp->tp_up,
|
*expp = new_oper(expp_tp->tp_up,
|
||||||
*expp, '(', expr);
|
*expp, '(', expr);
|
||||||
|
|
|
@ -56,7 +56,7 @@ ch3mon(oper, expp)
|
||||||
(*expp)->ex_flags &= ~EX_ILVALUE;
|
(*expp)->ex_flags &= ~EX_ILVALUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '&':
|
case ADDRESSOF:
|
||||||
if ((*expp)->ex_type->tp_fund == ARRAY) {
|
if ((*expp)->ex_type->tp_fund == ARRAY) {
|
||||||
(*expp)->ex_type = pointer_to((*expp)->ex_type, 0);
|
(*expp)->ex_type = pointer_to((*expp)->ex_type, 0);
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ ch3mon(oper, expp)
|
||||||
if (def->df_sc == REGISTER) {
|
if (def->df_sc == REGISTER) {
|
||||||
expr_error(*expp,
|
expr_error(*expp,
|
||||||
"& on register variable not allowed");
|
"& on register variable not allowed");
|
||||||
break; /* break case '&' */
|
break; /* break case ADDRESSOF */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(*expp)->ex_type = pointer_to((*expp)->ex_type,
|
(*expp)->ex_type = pointer_to((*expp)->ex_type,
|
||||||
|
|
|
@ -70,7 +70,9 @@ EVAL(expr, val, code, true_label, false_label)
|
||||||
int val, code;
|
int val, code;
|
||||||
label true_label, false_label;
|
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) {
|
switch (expr->ex_class) {
|
||||||
case Value: /* just a simple value */
|
case Value: /* just a simple value */
|
||||||
|
|
|
@ -48,6 +48,7 @@ rank_of(oper)
|
||||||
case MINMIN:
|
case MINMIN:
|
||||||
case CAST:
|
case CAST:
|
||||||
case SIZEOF:
|
case SIZEOF:
|
||||||
|
case ADDRESSOF:
|
||||||
return 2; /* monadic */
|
return 2; /* monadic */
|
||||||
case '*':
|
case '*':
|
||||||
case '/':
|
case '/':
|
||||||
|
|
|
@ -283,7 +283,9 @@ expression(struct expr **expp;)
|
||||||
|
|
||||||
unop(int *oper;) :
|
unop(int *oper;) :
|
||||||
['*' | '&' | '-' | '+' | '!' | '~' | PLUSPLUS | MINMIN]
|
['*' | '&' | '-' | '+' | '!' | '~' | PLUSPLUS | MINMIN]
|
||||||
{*oper = DOT;}
|
{ if (DOT == '&') DOT = ADDRESSOF;
|
||||||
|
*oper = DOT;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
multop:
|
multop:
|
||||||
|
|
|
@ -61,7 +61,10 @@ initial_value(register struct type **tpp; register struct expr **expp;) :
|
||||||
if ((*expp)->ex_type->tp_fund == ARRAY)
|
if ((*expp)->ex_type->tp_fund == ARRAY)
|
||||||
array2pointer(*expp);
|
array2pointer(*expp);
|
||||||
if (tpp) {
|
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);
|
gen_simple_exp(tpp, expp);
|
||||||
free_expression(*expp);
|
free_expression(*expp);
|
||||||
*expp = 0;
|
*expp = 0;
|
||||||
|
|
|
@ -120,6 +120,7 @@ struct tokenname tkfunny[] = { /* internal keywords */
|
||||||
{INITCOMMA, "initcomma"},
|
{INITCOMMA, "initcomma"},
|
||||||
{CAST, "cast"},
|
{CAST, "cast"},
|
||||||
{CASTAB, "castab"},
|
{CASTAB, "castab"},
|
||||||
|
{ADDRESSOF,"unary &"},
|
||||||
{POSTINCR, "postfix ++"},
|
{POSTINCR, "postfix ++"},
|
||||||
{POSTDECR, "postfix --"},
|
{POSTDECR, "postfix --"},
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue