else
return FALSE;
}
-
- etype = getSpec(operandType(op));
+ else
+ {
+ etype = getSpec(operandType(op));
+ }
return (IN_FARSPACE(SPEC_OCLS(etype)) ? TRUE : FALSE);
}
return geniCodePtrPtrSubtract (left,right);
/* if they are both literal then we know the result */
- if (IS_LITERAL(letype) && IS_LITERAL(retype))
+ if (IS_LITERAL(letype) && IS_LITERAL(retype)
+ && left->isLiteral && right->isLiteral)
return operandFromValue (valMinus(left->operand.valOperand,
right->operand.valOperand));
operand *size ;
int isarray = 0;
LRTYPE ;
-
+
/* if left is an array then array access */
if (IS_ARRAY(ltype))
return geniCodeArray (left,right);
/* if the right side is LITERAL zero */
/* return the left side */
- if (IS_LITERAL(retype) && !floatFromVal(valFromType(retype)))
+ if (IS_LITERAL(retype) && right->isLiteral && !floatFromVal(valFromType(retype)))
return left;
/* if left is literal zero return right */
- if (IS_LITERAL(letype) && !floatFromVal(valFromType(letype)))
+ if (IS_LITERAL(letype) && left->isLiteral && !floatFromVal(valFromType(letype)))
return right ;
/* if left is an array or pointer then size */
}
/* if they are both literals then we know */
- if (IS_LITERAL(letype) && IS_LITERAL(retype))
+ if (IS_LITERAL(letype) && IS_LITERAL(retype)
+ && left->isLiteral && right->isLiteral)
return operandFromValue (valPlus(valFromType(letype),
valFromType(retype)));
ptype->next = type;
/* if the output class is generic */
if ((DCL_TYPE(ptype) = PTR_TYPE(SPEC_OCLS(etype))) == CPOINTER)
- DCL_PTR_CONST(ptype) = 1;
+ DCL_PTR_CONST(ptype) = port->mem.code_ro;
/* if the variable was declared a constant */
/* then the pointer points to a constant */
/* set the pointer depending on the storage class */
if ((DCL_TYPE(optype) = PTR_TYPE(SPEC_OCLS(opetype))) == CPOINTER)
- DCL_PTR_CONST(optype) = 1;
+ DCL_PTR_CONST(optype) = port->mem.code_ro;
/* if the variable was declared a constant */
/* set the pointer depending on the storage class */
if ((DCL_TYPE(p) = PTR_TYPE(SPEC_OCLS(opetype))) == CPOINTER)
- DCL_PTR_CONST(p) = 1;
+ DCL_PTR_CONST(p) = port->mem.code_ro;
/* make sure we preserve the const & volatile */
if (IS_CONSTANT(opetype))
}
/* if register parm then make it a send */
- if ((parms->argSym && IS_REGPARM(parms->argSym->etype)) ||
- IS_REGPARM(parms->etype)) {
+ if (((parms->argSym && IS_REGPARM(parms->argSym->etype)) ||
+ IS_REGPARM(parms->etype)) &&
+ !IS_RENT(fetype)) {
ic = newiCode(SEND,pval,NULL);
ADDTOCHAIN(ic);
} else {
(tree->opval.op == '&' && !tree->right) ||
tree->opval.op == PTR_OP) {
lvaluereq++;
- left = operandFromAst(tree->left);
- lvaluereq--;
+ if (IS_ARRAY_OP(tree->left) && IS_ARRAY_OP(tree->left->left))
+ {
+ lvaluereq--;
+ left = operandFromAst(tree->left);
+ } else {
+ left = operandFromAst(tree->left);
+ lvaluereq--;
+ }
+ if (IS_DEREF_OP(tree) && IS_DEREF_OP(tree->left))
+ left = geniCodeRValue(left,TRUE);
} else {
left = operandFromAst(tree->left);
}