Show quoted text 9 lines
Hello,
I have just a little question about expressions and types/cast management
in FreePascal.
if I have a mixed expression with:
i, j, n : byte
k : word
n := i + k - j;
IMO the compiler converts operands to the "bigger" (wider) of the involved operand types, for every single operator. Possible overflows usually are ignored, i.e. the coder would have to cast one operand to an type, that allows to compute even intermediate results without overflows. Only the *detection* of actual overflows can be enforced by the overflow check compiler directive.
Furthermore the compiler is free in the order of evaluation, i.e. might here produce word(i-j)+k (not sure about the concrete FPC implementation and optimization options).
Finally a range check can be enforced, before the calculated value is stored in (truncated to the type-size of) the result variable.
What I mean, does the compiler handle types locally by casting at each
node, and force the cast at assignment node?
or does it do like C compiler, i.e. check the LValue at left of the
assignement, take its type, and cast each BinOp node to this type
I doubt that a C compiler behaves as you describe. Consider the obvious case of boolean expressions, where it doesn't make sense to convert the *operands* of "if (a<b)" into something like a bit or byte, only because the result of the comparison can be represented by a single bit or CPU status flag. A compiler typically is allowed only to *widen" the operand types automatically, but not to narrow them down. AFAIR implicit downcasts can occur with assignment operators (in C), where the intermediate result is truncated to the size of the assignment variable, and evaluation continues with the type of that variable.
DoDi