if (func->type != EX_VALUE && !IFFUNC_ISREENT (functype) && !options.stackAuto)
{
werror (W_NONRENT_ARGS);
+ fatalError++;
return 1;
}
}
if (iloop) {
- werrorfl (filename, sym->opval.val->sym->lineDef,
+ werrorfl (sym->opval.val->sym->fileDef, sym->opval.val->sym->lineDef,
W_EXCESS_INITIALIZERS, "struct",
sym->opval.val->sym->name);
}
// Array size was specified, and we have more initializers than needed.
char *name=sym->opval.val->sym->name;
int lineno=sym->opval.val->sym->lineDef;
+ char *filename=sym->opval.val->sym->fileDef;
werrorfl (filename, lineno, W_EXCESS_INITIALIZERS, "array", name);
}
// there has to be a better way
char *name=sym->opval.val->sym->name;
int lineno=sym->opval.val->sym->lineDef;
+ char *filename=sym->opval.val->sym->fileDef;
werrorfl (filename, lineno, W_EXCESS_INITIALIZERS, "array", name);
break;
work = initAggregates (sym, sym->ival, NULL);
} else {
if (getNelements(sym->type, sym->ival)>1) {
- werrorfl (filename, sym->lineDef,
+ werrorfl (sym->fileDef, sym->lineDef,
W_EXCESS_INITIALIZERS, "scalar",
sym->name);
}
work = initAggregates (sym, sym->ival, NULL);
} else {
if (getNelements(sym->type, sym->ival)>1) {
- werrorfl (filename, sym->lineDef,
+ werrorfl (sym->fileDef, sym->lineDef,
W_EXCESS_INITIALIZERS, "scalar",
sym->name);
}
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)
upCasted = TRUE;
break;
case RESULT_TYPE_CHAR:
- if (getSize (tree->etype) <= 1)
+ if (IS_CHAR (tree->etype))
return tree;
newLink = newCharLink();
break;
}
tree->decorated = 0;
tree = newNode (CAST, newAst_LINK (newLink), tree);
+ tree->lineno = tree->right->lineno;
/* keep unsigned type during cast to smaller type,
but not when promoting from char to int */
if (!upCasted)
case ':':
case '|':
case '^':
+ case '*':
+ case '+':
+ case '-':
+ case LABEL:
return resultType;
case '&':
if (!tree->right)
return RESULT_TYPE_NONE;
else
return resultType;
+ case IFX:
+ return RESULT_TYPE_IFX;
default:
return RESULT_TYPE_NONE;
}
upon tree->opval.op, if resultType can be propagated */
resultTypeProp = resultTypePropagate (tree, resultType);
- dtl = decorateType (tree->left, resultTypeProp);
+ if (tree->opval.op == '?')
+ dtl = decorateType (tree->left, RESULT_TYPE_IFX);
+ else
+ dtl = decorateType (tree->left, resultTypeProp);
/* if an array node, we may need to swap branches */
if (tree->opval.op == '[')
return decorateType (otree, RESULT_CHECK);
}
- 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 */
}
LRVAL (tree) = RRVAL (tree) = 1;
- tree->left = addCast (tree->left, resultType, FALSE);
- tree->right = addCast (tree->right, resultType, FALSE);
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
- FALSE));
+ resultType,
+ tree->opval.op));
return tree;
}
LRVAL (tree) = RRVAL (tree) = 1;
+
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
- ! (IS_UNSIGNED (LTYPE (tree)) && IS_UNSIGNED (RTYPE (tree)))));
+ resultType,
+ tree->opval.op));
/* if right is a literal and */
/* left is also a division by a literal then */
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
- ! (IS_UNSIGNED (LTYPE (tree)) && IS_UNSIGNED (RTYPE (tree)))));
+ resultType,
+ tree->opval.op));
return tree;
/*------------------------------------------------------------------*/
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
- resultType == RESULT_TYPE_CHAR ? FALSE : TRUE));
-
+ resultType,
+ tree->opval.op));
+
return tree;
/*------------------------------------------------------------------*/
if (IS_LITERAL (RTYPE (tree)) && IS_LITERAL (LTYPE (tree)))
{
tree->type = EX_VALUE;
+ tree->left = addCast (tree->left, resultType, TRUE);
+ tree->right = addCast (tree->right, resultType, TRUE);
tree->opval.val = valPlus (valFromType (LETYPE (tree)),
valFromType (RETYPE (tree)));
tree->right = tree->left = NULL;
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;
if (IS_LITERAL (RTYPE (tree)) && IS_LITERAL (LTYPE (tree)))
{
tree->type = EX_VALUE;
+ tree->left = addCast (tree->left, resultType, TRUE);
+ tree->right = addCast (tree->right, resultType, TRUE);
tree->opval.val = valMinus (valFromType (LETYPE (tree)),
valFromType (RETYPE (tree)));
tree->right = tree->left = NULL;
{
tree->left = addCast (tree->left, resultType, TRUE);
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;
goto errorTreeReturn;
}
+ /* make smaller type only if it's a LEFT_OP */
+ if (tree->opval.op == LEFT_OP)
+ tree->left = addCast (tree->left, resultType, TRUE);
+
/* if they are both literal then */
/* rewrite the tree */
if (IS_LITERAL (RTYPE (tree)) && IS_LITERAL (LTYPE (tree)))
LRVAL (tree) = RRVAL (tree) = 1;
if (tree->opval.op == LEFT_OP)
{
- tree->left = addCast (tree->left, resultType, TRUE);
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
- RTYPE (tree),
- resultType == RESULT_TYPE_CHAR ? FALSE : TRUE));
+ NULL,
+ resultType,
+ tree->opval.op));
}
else /* RIGHT_OP */
{
}
if (tree->opval.op == '>')
{
- /* if the parent is an ifx, then we could do */
- /* return tree->left; */
+ if (resultType == RESULT_TYPE_IFX)
+ {
+ /* the parent is an ifx: */
+ /* if (unsigned value) */
+ return tree->left;
+ }
+
+ /* (unsigned value) ? 1 : 0 */
tree->opval.op = '?';
tree->right = newNode (':',
newAst_VALUE (constVal ("1")),
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;
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, "-=");
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, "+=");