/* 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 */
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))
}
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;
/* 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;
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++;