return s;
}
+/*------------------------------------------------------------------*/
+/* copyStruct - copies a structdef including the fields-list */
+/*------------------------------------------------------------------*/
+static structdef *
+copyStruct (structdef *src)
+{
+ structdef *dest;
+
+ dest = newStruct ("");
+ memcpy (dest, src, sizeof (structdef));
+ dest->fields = copySymbolChain (src->fields);
+ return dest;
+}
+
/*------------------------------------------------------------------*/
/* sclsFromPtr - Return the storage class a pointer points into. */
/* S_FIXED is returned for generic pointers or other */
/* change it to a unsigned bit */
SPEC_NOUN (loop->etype) = V_BITFIELD;
- SPEC_USIGN (loop->etype) = 1;
+ /* ISO/IEC 9899 J.3.9 implementation defined behaviour: */
+ /* a "plain" int bitfield is unsigned */
+ if (!loop->etype->select.s.b_signed)
+ SPEC_USIGN(loop->etype) = 1;
+
SPEC_BLEN (loop->etype) = loop->bitVar;
if (loop->bitVar == BITVAR_PAD) {
while (curr)
{
memcpy (loop, curr, sizeof (sym_link)); /* copy it */
+if (getenv ("SDCCCOPYSTRUCT")) // this breaks regression test bug-221220??
+ if (IS_STRUCT (loop))
+ SPEC_STRUCT (loop) = copyStruct (SPEC_STRUCT (loop));
loop->next = (curr->next ? newLink (curr->next->class) : (void *) NULL);
loop = loop->next;
curr = curr->next;
/* which ever is greater in size */
if (IS_FLOAT (etype1) || IS_FLOAT (etype2))
rType = newFloatLink ();
- else
- /* if both are fixed16x16 then result is float */
- if (IS_FIXED16X16(etype1) && IS_FIXED16X16(etype2))
+ /* if both are fixed16x16 then result is float */
+ else if (IS_FIXED16X16(etype1) && IS_FIXED16X16(etype2))
rType = newFixed16x16Link();
- else
- if (IS_FIXED16X16(etype1) && IS_FLOAT (etype2))
+ else if (IS_FIXED16X16(etype1) && IS_FLOAT (etype2))
rType = newFloatLink ();
- if (IS_FLOAT (etype1) && IS_FIXED16X16 (etype2) )
+ else if (IS_FLOAT (etype1) && IS_FIXED16X16 (etype2) )
rType = newFloatLink ();
- else
- /* if both are bitvars choose the larger one */
- if (IS_BITVAR (etype1) && IS_BITVAR (etype2))
- {
- rType = SPEC_BLEN (etype1) >= SPEC_BLEN (etype2) ?
- copyLinkChain (type1) : copyLinkChain (type1);
- }
- /* if only one of them is a bit variable
- then the other one prevails */
+
+ /* if both are bitvars choose the larger one */
+ else if (IS_BITVAR (etype1) && IS_BITVAR (etype2))
+ rType = SPEC_BLEN (etype1) >= SPEC_BLEN (etype2) ?
+ copyLinkChain (type1) : copyLinkChain (type1);
+
+ /* if only one of them is a bit variable then the other one prevails */
else if (IS_BITVAR (etype1) && !IS_BITVAR (etype2))
{
rType = copyLinkChain (type2);
if (getSize (etype2) > 1)
SPEC_NOUN (getSpec (rType)) = V_INT;
}
- else
- /* if one of them is a pointer or array then that
- prevails */
- if (IS_PTR (type1) || IS_ARRAY (type1))
+ /* if one of them is a pointer or array then that
+ prevails */
+ else if (IS_PTR (type1) || IS_ARRAY (type1))
rType = copyLinkChain (type1);
else if (IS_PTR (type2) || IS_ARRAY (type2))
rType = copyLinkChain (type2);
SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) = bit;
else
SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) =
- (options.model != MODEL_SMALL ? xdata : data);
+ port->mem.default_local_map;
#if 0
/* ?? static functions shouldn't imply static parameters - EEP */
}
#endif
}
+ if (SPEC_OCLS (val->sym->etype) == pdata)
+ val->sym->iaccess = 1;
if (!isinSet(operKeyReset, val->sym)) {
addSet (&operKeyReset, val->sym);
applyToSet (operKeyReset, resetParmKey);
}
if (n1s > 1 || nshifts == 0)
- return 0;
+ return -1;
return nshifts - 1;
}