Copyright (C) 2000-2012 |
GNU Info (g77-300.info)Transforming Block IFTransforming Block IF --------------------- 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. automatically generated by info2www version 1.2.2.9 |