X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCast.c;h=6b384a7e77b929368aa5a4e4a4f55a84eec1466f;hb=70340b617d95cf9422675947ad299226747eb1ef;hp=4abbdc67309066ffabae0b332e8899e16e49ed04;hpb=1abbb6977824a889ca516e4e57f775eeefce3a7f;p=fw%2Fsdcc diff --git a/src/SDCCast.c b/src/SDCCast.c index 4abbdc67..6b384a7e 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -180,7 +180,6 @@ newIfxNode (ast * condAst, symbol * trueLabel, symbol * falseLabel) /* if this is a literal then we already know the result */ if (condAst->etype && IS_LITERAL (condAst->etype)) { - /* then depending on the expression value */ if (floatFromVal (condAst->opval.val)) ifxNode = newNode (GOTO, @@ -611,6 +610,14 @@ processParms (ast * func, if (!defParm && !actParm) return 0; + if (defParm) { + if (getenv("DEBUG_SANITY")) { + fprintf (stderr, "addSym: %s ", defParm->name); + } + /* make sure the type is complete and sane */ + checkTypeSanity(defParm->etype, defParm->name); + } + /* if the function is being called via a pointer & */ /* it has not been defined a reentrant then we cannot */ /* have parameters */ @@ -731,7 +738,7 @@ processParms (ast * func, } /* the parameter type must be at least castable */ - if (checkType (defParm->type, actParm->ftype) == 0) + if (compareType (defParm->type, actParm->ftype) == 0) { werror (E_TYPE_MISMATCH_PARM, *parmNumber); werror (E_CONTINUE, "defined type "); @@ -743,7 +750,7 @@ processParms (ast * func, } /* if the parameter is castable then add the cast */ - if (checkType (defParm->type, actParm->ftype) < 0) + if (compareType (defParm->type, actParm->ftype) < 0) { ast *pTree = resolveSymbols (copyAst (actParm)); @@ -1027,14 +1034,14 @@ gatherAutoInit (symbol * autoChain) symbol *newSym; // this can only be a constant - if (!IS_LITERAL(sym->ival->init.node->etype)) { + if (!inInitMode && !IS_LITERAL(sym->ival->init.node->etype)) { werror (E_CONST_EXPECTED); } /* insert the symbol into the symbol table */ /* with level = 0 & name = rname */ newSym = copySymbol (sym); - addSym (SymbolTab, newSym, newSym->name, 0, 0); + addSym (SymbolTab, newSym, newSym->name, 0, 0, 1); /* now lift the code to main */ if (IS_AGGREGATE (sym->type)) @@ -2299,19 +2306,17 @@ decorateType (ast * tree) } LRVAL (tree) = RRVAL (tree) = 1; - /* promote result to int if left & right are char / short + /* promote result to int if left & right are char this will facilitate hardware multiplies 8bit x 8bit = 16bit */ - if ((IS_CHAR(LETYPE(tree)) || IS_SHORT(LETYPE(tree))) && - (IS_CHAR(RETYPE(tree)) || IS_SHORT(RETYPE(tree)))) { - TETYPE (tree) = getSpec (TTYPE (tree) = - computeType (LTYPE (tree), - RTYPE (tree))); - SPEC_NOUN(TETYPE(tree)) = V_INT; - SPEC_SHORT(TETYPE(tree))=0; + if (IS_CHAR(LETYPE(tree)) && IS_CHAR(RETYPE(tree))) { + TETYPE (tree) = getSpec (TTYPE (tree) = + computeType (LTYPE (tree), + RTYPE (tree))); + SPEC_NOUN(TETYPE(tree)) = V_INT; } else { - TETYPE (tree) = getSpec (TTYPE (tree) = - computeType (LTYPE (tree), - RTYPE (tree))); + TETYPE (tree) = getSpec (TTYPE (tree) = + computeType (LTYPE (tree), + RTYPE (tree))); } return tree; @@ -2633,6 +2638,9 @@ decorateType (ast * tree) werror (E_CAST_ILLEGAL); goto errorTreeReturn; } + + /* make sure the type is complete and sane */ + checkTypeSanity(LETYPE(tree), "(cast)"); /* if the right is a literal replace the tree */ if (IS_LITERAL (RETYPE (tree)) && !IS_PTR (LTYPE (tree))) @@ -2716,7 +2724,7 @@ decorateType (ast * tree) /* if they are pointers they must be castable */ if (IS_PTR (LTYPE (tree)) && IS_PTR (RTYPE (tree))) { - if (checkType (LTYPE (tree), RTYPE (tree)) == 0) + if (compareType (LTYPE (tree), RTYPE (tree)) == 0) { werror (E_COMPARE_OP); fprintf (stderr, "comparing type "); @@ -2733,7 +2741,7 @@ decorateType (ast * tree) if (!((IS_PTR (LTYPE (tree)) && IS_LITERAL (RTYPE (tree))) || (IS_PTR (RTYPE (tree)) && IS_LITERAL (LTYPE (tree))))) - if (checkType (LTYPE (tree), RTYPE (tree)) == 0) + if (compareType (LTYPE (tree), RTYPE (tree)) == 0) { werror (E_COMPARE_OP); fprintf (stderr, "comparing type "); @@ -2782,14 +2790,15 @@ decorateType (ast * tree) /* conditional operator '?' */ /*----------------------------*/ case '?': - /* the type is one on the left */ - TTYPE (tree) = LTYPE (tree); + /* the type is value of the colon operator (on the right) */ + assert(IS_COLON_OP(tree->right)); + TTYPE (tree) = RTYPE(tree); // #HACK LTYPE(tree). TETYPE (tree) = getSpec (TTYPE (tree)); return tree; case ':': /* if they don't match we have a problem */ - if (checkType (LTYPE (tree), RTYPE (tree)) == 0) + if (compareType (LTYPE (tree), RTYPE (tree)) == 0) { werror (E_TYPE_MISMATCH, "conditional operator", " "); goto errorTreeReturn; @@ -2954,7 +2963,7 @@ decorateType (ast * tree) } /* they should either match or be castable */ - if (checkType (LTYPE (tree), RTYPE (tree)) == 0) + if (compareType (LTYPE (tree), RTYPE (tree)) == 0) { werror (E_TYPE_MISMATCH, "assignment", " "); fprintf (stderr, "type --> '"); @@ -3044,7 +3053,7 @@ decorateType (ast * tree) if (!tree->right) goto voidcheck; - if (checkType (currFunc->type->next, RTYPE (tree)) == 0) + if (compareType (currFunc->type->next, RTYPE (tree)) == 0) { werror (E_RETURN_MISMATCH); goto errorTreeReturn; @@ -3059,7 +3068,7 @@ decorateType (ast * tree) } /* if there is going to be a casing required then add it */ - if (checkType (currFunc->type->next, RTYPE (tree)) < 0) + if (compareType (currFunc->type->next, RTYPE (tree)) < 0) { #if 0 && defined DEMAND_INTEGER_PROMOTION if (IS_INTEGRAL (currFunc->type->next)) @@ -3167,6 +3176,9 @@ sizeofOp (sym_link * type) { char buff[10]; + /* make sure the type is complete and sane */ + checkTypeSanity(type, "(sizeof)"); + /* get the size and convert it to character */ sprintf (buff, "%d", getSize (type)); @@ -3328,7 +3340,7 @@ createLabel (symbol * label, ast * stmnt) if ((csym = findSym (LabelTab, NULL, name))) werror (E_DUPLICATE_LABEL, label->name); else - addSym (LabelTab, label, name, label->level, 0); + addSym (LabelTab, label, name, label->level, 0, 0); label->islbl = 1; label->key = labelKey++;