Next: Transforming SELECT CASE, Previous: Transforming Iterative DO, Up: Transforming Statements
Consider:
SUBROUTINE X(A,B,C)
CHARACTER*(*) A, B, C
LOGICAL LFUNC
IF (LFUNC (A//B)) THEN
CALL SUBR1
ELSE IF (LFUNC (A//C)) THEN
CALL SUBR2
ELSE
CALL SUBR3
END
The arguments to the two calls to `LFUNC'
require dynamic allocation (at run time),
but are not required during execution of the CALL statements.
So, the scopes of those temporaries must be within blocks inside
the block corresponding to the Fortran IF block.
This cannot be represented “naturally”
in vanilla C, nor in GBEL.
The if, elseif, else,
and endif constructs
provided by both languages must,
for a given if block,
share the same C/GBE block.
Therefore, any temporaries needed during evaluation of `expr'
while executing `ELSE IF(expr)'
must either have been predeclared
at the top of the corresponding IF block,
or declared within a new block for that ELSE IF—a block that,
since it cannot contain the else or else if itself
(due to the above requirement),
actually implements the rest of the IF block's
ELSE IF and ELSE statements
within an inner block.
The FFE takes the latter approach.