X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCast.c;h=8e20910cf1c505dae56081cc9e485c210bbe0a52;hb=67613b6eceb41c8a242c2556a0f59311adb0b388;hp=3b422b8f1e0cf48c5c65d53421fa09d8a5f274b4;hpb=987d1d292f2bd086d656325a759f7c22ca6c1a40;p=fw%2Fsdcc diff --git a/src/SDCCast.c b/src/SDCCast.c index 3b422b8f..8e20910c 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -2019,10 +2019,18 @@ RESULT_TYPE getResultTypeFromType (sym_link *type) { /* type = getSpec (type); */ - if (IS_BITVAR (type)) + if (IS_BIT (type)) return RESULT_TYPE_BIT; if (IS_BITFIELD (type)) - return RESULT_TYPE_CHAR; + { + int blen = SPEC_BLEN (type); + + if (blen <= 1) + return RESULT_TYPE_BIT; + if (blen <= 8) + return RESULT_TYPE_CHAR; + return RESULT_TYPE_INT; + } if (IS_CHAR (type)) return RESULT_TYPE_CHAR; if ( IS_INT (type) @@ -2288,7 +2296,7 @@ decorateType (ast * tree, RESULT_TYPE resultType) resultTypeProp = resultTypePropagate (tree, resultType); if (tree->opval.op == '?') - dtl = decorateType (tree->left, RESULT_TYPE_NONE); + dtl = decorateType (tree->left, RESULT_TYPE_IFX); else dtl = decorateType (tree->left, resultTypeProp); @@ -2556,7 +2564,10 @@ decorateType (ast * tree, RESULT_TYPE resultType) tree->left = addCast (tree->left, resultType, FALSE); tree->right = addCast (tree->right, resultType, FALSE); - TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), FALSE); + TTYPE (tree) = computeType (LTYPE (tree), + RTYPE (tree), + resultType, + tree->opval.op); TETYPE (tree) = getSpec (TTYPE (tree)); /* if left is a literal exchange left & right */ @@ -2774,7 +2785,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), - FALSE)); + resultType, + tree->opval.op)); return tree; @@ -2794,8 +2806,7 @@ decorateType (ast * tree, RESULT_TYPE resultType) { tree->type = EX_VALUE; tree->opval.val = valDiv (valFromType (LETYPE (tree)), - valFromType (RETYPE (tree)), - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE); + valFromType (RETYPE (tree))); tree->right = tree->left = NULL; TETYPE (tree) = getSpec (TTYPE (tree) = tree->opval.val->type); @@ -2807,7 +2818,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE)); + resultType, + tree->opval.op)); /* if right is a literal and */ /* left is also a division by a literal then */ @@ -2873,7 +2885,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE)); + resultType, + tree->opval.op)); return tree; /*------------------------------------------------------------------*/ @@ -2950,8 +2963,7 @@ decorateType (ast * tree, RESULT_TYPE resultType) { tree->type = EX_VALUE; tree->opval.val = valMult (valFromType (LETYPE (tree)), - valFromType (RETYPE (tree)), - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE); + valFromType (RETYPE (tree))); tree->right = tree->left = NULL; TETYPE (tree) = getSpec (TTYPE (tree) = tree->opval.val->type); @@ -2989,7 +3001,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE)); + resultType, + tree->opval.op)); return tree; @@ -3123,8 +3136,9 @@ decorateType (ast * tree, RESULT_TYPE resultType) tree->right = addCast (tree->right, resultType, TRUE); TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), - RTYPE (tree), - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE)); + RTYPE (tree), + resultType, + tree->opval.op)); } return tree; @@ -3228,8 +3242,9 @@ decorateType (ast * tree, RESULT_TYPE resultType) tree->right = addCast (tree->right, resultType, TRUE); TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), - RTYPE (tree), - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE)); + RTYPE (tree), + resultType, + tree->opval.op)); } LRVAL (tree) = RRVAL (tree) = 1; @@ -3376,8 +3391,9 @@ decorateType (ast * tree, RESULT_TYPE resultType) tree->left = addCast (tree->left, resultType, TRUE); TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), - NULL, - resultType == RESULT_TYPE_CHAR ? FALSE : TRUE)); + NULL, + resultType, + tree->opval.op)); } else /* RIGHT_OP */ { @@ -3860,7 +3876,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) goto errorTreeReturn; } - TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), FALSE); + TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), + resultType, tree->opval.op); TETYPE (tree) = getSpec (TTYPE (tree)); return tree; @@ -3943,7 +3960,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), - FALSE)); + RESULT_TYPE_NOPROM, + tree->opval.op)); if (!tree->initMode && IS_CONSTANT (LETYPE (tree))) werror (E_CODE_WRITE, "-="); @@ -3985,7 +4003,8 @@ decorateType (ast * tree, RESULT_TYPE resultType) TETYPE (tree) = getSpec (TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), - FALSE)); + RESULT_TYPE_NOPROM, + tree->opval.op)); if (!tree->initMode && IS_CONSTANT (LETYPE (tree))) werror (E_CODE_WRITE, "+=");