/* 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,
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 */
}
/* 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 ");
}
/* 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));
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))
return decorateType (otree);
}
+#if 0
+ // we can't do this because of "(int & 0xff) << 3"
+
/* if right or left is literal then result of that type */
if (IS_LITERAL (RTYPE (tree)))
{
TETYPE (tree) = getSpec (TTYPE (tree));
}
}
+#else
+ TTYPE (tree) =
+ computeType (LTYPE (tree), RTYPE (tree));
+ TETYPE (tree) = getSpec (TTYPE (tree));
+#endif
LRVAL (tree) = RRVAL (tree) = 1;
return 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 ");
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 ");
/* 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;
}
/* 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 --> '");
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;
}
/* 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))
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++;
addSet (&operKeyReset, name);
applyToSet (operKeyReset, resetParmKey);
- if (options.debug && !options.nodebug)
+ if (options.debug)
cdbStructBlock (1, cdbFile);
cleanUpLevel (LabelTab, 0);