/* addCast - adds casts to a type specified by RESULT_TYPE */
/*-----------------------------------------------------------------*/
static void
-addCast (ast **tree, RESULT_TYPE resultType)
+addCast (ast **tree, RESULT_TYPE resultType, bool upcast)
{
sym_link *newLink;
break;
case RESULT_TYPE_INT:
#if 0
- /* casting from long to int costs additional 4 bytes dram! */
- if (getSize ((*tree)->etype) <= INTSIZE)
+ if (getSize ((*tree)->etype) > INTSIZE)
+ {
+ /* warn ("Loosing significant digits"); */
+ return;
+ }
+#endif
+ /* char: promote to int */
+ if (!upcast ||
+ getSize ((*tree)->etype) >= INTSIZE)
+ return;
+ newLink = newIntLink();
+ break;
+ case RESULT_TYPE_OTHER:
+ if (!upcast)
+ return;
+ /* long, float: promote to int */
+ if (getSize ((*tree)->etype) >= INTSIZE)
return;
newLink = newIntLink();
break;
-#else
- /* warn ("Loosing significant digits"); */
- return;
-#endif
default:
return;
}
if (getenv ("SDCC_NEWTYPEFLOW"))
{
- addCast (&tree->left, resultType);
- addCast (&tree->right, resultType);
+ addCast (&tree->left, resultType, FALSE);
+ addCast (&tree->right, resultType, FALSE);
}
TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), FALSE);
TETYPE (tree) = getSpec (TTYPE (tree));
LRVAL (tree) = RRVAL (tree) = 1;
if (getenv ("SDCC_NEWTYPEFLOW"))
{
- addCast (&tree->left, resultType);
- addCast (&tree->right, resultType);
+ addCast (&tree->left, resultType, FALSE);
+ addCast (&tree->right, resultType, FALSE);
}
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
TRUE));
else
{
- addCast (&tree->left, resultType);
- addCast (&tree->right, resultType);
+ addCast (&tree->left, resultType, FALSE);
+ addCast (&tree->right, resultType, FALSE);
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
FALSE));
else
{
- addCast (&tree->left, resultType);
- addCast (&tree->right, resultType);
+ addCast (&tree->left, resultType, TRUE);
+ addCast (&tree->right, resultType, TRUE);
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
FALSE));
else
{
- addCast (&tree->left, resultType);
- addCast (&tree->right, resultType);
+ addCast (&tree->left, resultType, TRUE);
+ addCast (&tree->right, resultType, TRUE);
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
TRUE));
else
{
- addCast (&tree->left, resultType);
+ addCast (&tree->left, resultType, TRUE);
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),