/* initPointer - pointer initialization code massaging */
/*-----------------------------------------------------------------*/
value *
-initPointer (initList * ilist)
+initPointer (initList * ilist, sym_link *toType)
{
value *val;
ast *expr = list2expr (ilist);
if ((val = constExprValue (expr, FALSE)))
return val;
+ /* (char *)&a */
+ if (IS_AST_OP(expr) && expr->opval.op==CAST &&
+ IS_AST_OP(expr->right) && expr->right->opval.op=='&') {
+ if (compareType(toType, expr->left->ftype)!=1) {
+ werror (W_INIT_WRONG);
+ printFromToType(expr->left->ftype, toType);
+ }
+ // skip the cast ???
+ expr=expr->right;
+ }
+
/* no then we have to do these cludgy checks */
/* pointers can be initialized with address of
a variable or address of an array element */
val = list2val (ilist);
+ if (!val) {
+ // an error has been thrown allready
+ val=constVal("0");
+ }
+
if (IS_LITERAL(val->etype)) {
if (compareType(type,val->etype)==0) {
werror (E_INCOMPAT_TYPES);
return;
}
- if (!(val = initPointer (ilist)))
+ if (!(val = initPointer (ilist, type)))
return;
/* if character pointer */
return;
/* check the type */
- if (compareType (type, val->type) == 0)
+ if (compareType (type, val->type) == 0) {
werror (W_INIT_WRONG);
+ printFromToType (val->type, from);
+ }
/* if val is literal */
if (IS_LITERAL (val->etype))
if (!ilist)
return;
+ /* update line number for error msgs */
+ lineno=sym->lineDef;
+
/* if structure then */
if (IS_STRUCT (type))
{
/* create the overlay segments */
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; overlayable items in internal ram \n");
- fprintf (asmFile, "%s", iComments2);
- copyFile (asmFile, ovrFile);
+ if (overlay) {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; overlayable items in internal ram \n");
+ fprintf (asmFile, "%s", iComments2);
+ copyFile (asmFile, ovrFile);
+ }
/* create the stack segment MOF */
if (mainf && IFFUNC_HASBODY(mainf->type))
}
/* create the idata segment */
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; indirectly addressable internal ram data\n");
- fprintf (asmFile, "%s", iComments2);
- copyFile (asmFile, idata->oFile);
+ if (idata) {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; indirectly addressable internal ram data\n");
+ fprintf (asmFile, "%s", iComments2);
+ copyFile (asmFile, idata->oFile);
+ }
/* copy the bit segment */
fprintf (asmFile, "%s", iComments2);