X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCast.c;h=979dcfe225868fb1da8d4f06c920330caf1c503f;hb=8ca3f40b43c15b0903435e340163ddca7f5d8b15;hp=7cb2e49bb65f86c95a5f2f4be39bca762272bd6f;hpb=f3946e669d77d841b638d798c3e09429cd3338c6;p=fw%2Fsdcc diff --git a/src/SDCCast.c b/src/SDCCast.c index 7cb2e49b..979dcfe2 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -2027,7 +2027,7 @@ getResultTypeFromType (sym_link *type) /* 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; @@ -2040,15 +2040,26 @@ addCast (ast **tree, RESULT_TYPE resultType) 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; } @@ -2508,8 +2519,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) 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)); @@ -2726,8 +2737,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) 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), @@ -2946,8 +2957,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) 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), @@ -3088,8 +3099,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) 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), @@ -3199,8 +3210,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) 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), @@ -3356,7 +3367,7 @@ decorateType (ast * tree, RESULT_TYPE resultType) TRUE)); else { - addCast (&tree->left, resultType); + addCast (&tree->left, resultType, TRUE); TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree),