int nArgs , int rent)
{
symbol *sym;
-
+ int argStack = 0;
/* create the symbol */
sym = newSymbol (name,0);
args = sym->args = newValue();
while (nArgs--) {
+ argStack += getSize(type);
args->type = copyLinkChain(argType);
args->etype = getSpec(args->type);
if (!nArgs)
/* save it */
addSymChain(sym);
sym->cdef = 1;
+ sym->argStack = (rent ? argStack : 0);
allocVariables (sym);
return sym;
ilist = ilist->init.deep ;
iExpr = decorateType(resolveSymbols(list2expr(ilist)));
- return newNode('=',sym,iExpr);
+ return decorateType(newNode('=',sym,iExpr));
}
/*-----------------------------------------------------------------*/
if (!iloop)
break;
sflds->implicit = 1;
- lAst = decorateType(resolveSymbols(newNode('.',sym,
- newAst(EX_VALUE,symbolVal(sflds)))));
+ lAst = newNode(PTR_OP,newNode('&',sym,NULL),newAst(EX_VALUE,symbolVal(sflds)));
+ lAst = decorateType(resolveSymbols(lAst));
rast = createIval (lAst, sflds->type, iloop,rast);
}
return rast ;
}
/*-----------------------------------------------------------------*/
-/* initAggregates - initialises aggregate variables with initv */
+/* initAggregates - initialises aggregate variables with initv */
/*-----------------------------------------------------------------*/
ast *initAggregates ( symbol *sym, initList *ival, ast *wid)
{
return FALSE;
else
return isConformingBody(pbody->left,sym,body) ;
- }
+ } else {
+ if (astHasSymbol(pbody->left,sym) ||
+ astHasSymbol(pbody->right,sym))
+ return FALSE;
+ }
+
/*------------------------------------------------------------------*/
case '|':
TTYPE(tree) = TETYPE(tree) =
tree->opval.val->type = tree->opval.val->sym->type =
tree->opval.val->etype = tree->opval.val->sym->etype =
- copyLinkChain(intType);
+ copyLinkChain(INTTYPE);
}
else {
if (SPEC_SCLS(tree->left->etype) == S_IDATA)
DCL_TYPE(p) = IPOINTER ;
else
- DCL_TYPE(p) = POINTER ;
+ if (SPEC_SCLS(tree->left->etype) == S_EEPROM)
+ DCL_TYPE(p) = EEPPOINTER ;
+ else
+ DCL_TYPE(p) = POINTER ;
if (IS_AST_SYM_VALUE(tree->left)) {
AST_SYMBOL(tree->left)->addrtaken = 1;
return tree;
}
LRVAL(tree) = RRVAL(tree) = 1;
- COPYTYPE(TTYPE(tree),TETYPE(tree),LTYPE(tree));
+ if (IS_LITERAL(LTYPE(tree)) && !IS_LITERAL(RTYPE(tree))) {
+ COPYTYPE(TTYPE(tree),TETYPE(tree),RTYPE(tree));
+ } else {
+ COPYTYPE(TTYPE(tree),TETYPE(tree),LTYPE(tree));
+ }
return tree ;
/*------------------------------------------------------------------*/
/* change not */
if (IS_NOT(tree)) {
- tree->left = backPatchLabels (tree->left,trueLabel,falseLabel);
+ tree->left = backPatchLabels (tree->left,falseLabel,trueLabel);
/* if the left is already a IFX */
if ( ! IS_IFX(tree->left) )
/* vanilla for statement */
condExpr = backPatchLabels(condExpr,trueLabel,falseLabel);
- if (!IS_IFX(condExpr))
+ if (condExpr && !IS_IFX(condExpr))
condExpr = newIfxNode(condExpr,trueLabel,falseLabel);