Node: Transforming Block IF, 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.