RESTRICTIONS ON THE SYNTAX OF FORTRAN ************************************* There are some non-obvious restrictions on the syntax of FORTRAN 77 in the standard specification: 8.2.5 Restrictions on EQUIVALENCE Statements. An EQUIVALENCE statement must not specify that the same storage unit is to occur more than once in a storage sequence. For example, 1. DIMENSION A(2) 2. EQUIVALENCE (A(1),B), (A(2),B) is prohibited, because it would specify the same storage unit for A(1) and A(2). An EQUIVALENCE statement must not specify that consecutive storage units are to be nonconsecutive. For example, the following is prohibited: 1. REAL A(2) 2. DOUBLE PRECISION D(2) 3. EQUIVALENCE (A(1),D(1)), (A(2),D(2)) 8.3.6 Restrictions on Common and Equivalence. An EQUIVALENCE statement must not cause the storage sequences of two different common blocks in the same program unit to be associated. Equivalence association must not cause a common block storage sequence to be extended by adding storage units preceding the first storage unit of the first entity specified in a COMMON statement for the common block. For example, the following is not permitted: 1. COMMON /X/A 2. REAL B(2) 3. EQUIVALENCE (A,B(2)) 9.2 DATA Statement Restrictions Names of dummy arguments, functions, and entities in blank common (including entities associated with an entity in blank common) must not appear in the list nlist . Names of entities in a named common block may appear in the list nlist only within a block data subprogram. There must be the same number of items specified by each list nlist and its corresponding list clist . There is a one-to-one correspondence between the items specified by nlist and the constants specified by clist such that the first item of nlist corresponds to the first constant of clist , etc. By this correspondence, the initial value is established and the entity is initially defined. If an array name without a subscript is in the list, there must be one constant for each element of that array. The ordering of array elements is determined by the array element subscript value ( 5.2.4). The type of the nlist entity and the type of the corresponding clist constant must agree when either is of type character or logical. When the nlist entity is of type integer, real, double precision, or complex, the 1corresponding clist constant must also be of type integer, real, double precision, or complex; if necessary, the clist constant is converted to the type of the nlist entity according to the rules for arithmetic conversion (Table 4). Note that if an nlist entity is of type double precision and the clist constant is of type real, the processor may supply more precision derived from the constant than can be contained in a real datum. Any variable, array element, or substring may be initially defined except for: 1. an entity that is a dummy argument, 2. an entity in blank common, which includes an entity associated with an entity in blank common, or 3. a variable in a function subprogram whose name is also the name of the function subprogram or an entry in the function subprogram. A variable, array element, or substring must not be initially defined more than once in an executable program. If two entities are associated, only one may be initially defined in a DATA statement in the same executable program. Each subscript expression in the list nlist must be an integer constant expression except for implied-DO-variables as noted in 9.3. Each substring expression in the list nlist must be an integer constant expression. 12.2.5.2 Internal File Restrictions. An internal file has the following restrictions: 1. Reading and writing records is accomplished only by sequential access formatted input/output statements ( 12.8.1) that do not specify list-directed formatting. 2. An auxiliary input/output statement must not specify an internal file. 12.11 Restrictions on Function References and List Items A function must not be referenced within an expression appearing anywhere in an input/output statement if such a reference causes an input/output statement to be executed. Note that a restriction in the evaluation of expressions ( 6.6) prohibits certain side effects. 12.12 Restriction on Input/Output Statements If a unit, or a file connected to a unit, does not have all of the properties required for the execution of certain input/output statements, those statements must not refer to the unit. 14.2 Main Program Restrictions The PROGRAM statement may appear only as the first statement of a main program. A main program may contain any other statement except a BLOCK DATA, FUNCTION, SUBROUTINE, ENTRY, or RETURN statement. The appearance of a SAVE statement in a main program has no effect. A main program may not be referenced from a subprogram or from itself. 'bp ' 15.3.3 Intrinsic Function Restrictions. Arguments for which the result is not mathematically defined or exceeds the numeric range of the processor cause the result of the function to become undefined. Restrictions on the range of arguments and results for intrinsic functions are described in 15.10.1. 15.4.3 Statement Function Restrictions. A statement function may be referenced only in the program unit that contains the statement function statement. A statement function statement must not contain a reference to another statement function that appears following the reference in the sequence of lines in the program unit. The symbolic name used to identify a statement function must not appear as a symbolic name in any specification statement except in a type-statement (to specify the type of the function) or as the name of a common block in the same program unit. An external function reference in the expression of a statement function statement must not cause a dummy argument of the statement function to become undefined or redefined. The symbolic name of a statement function is a local name ( 18.1.2) and must not be the same as the name of any other entity in the program unit except the name of a common block. The symbolic name of a statement function may not be an actual argument. It must not appear in an EXTERNAL statement. A statement function statement in a function subprogram must not contain a function reference to the name of the function subprogram or an entry name in the function subprogram. The length specification of a character statement function or statement function dummy argument of type character must be an integer constant expression. 15.5.3 Function Subprogram Restrictions. A FUNCTION statement must appear only as the first statement of a function subprogram. A function subprogram may contain any other statement except a BLOCK DATA, SUBROUTINE, or PROGRAM statement. The symbolic name of an external function is a global name ( 18.1.1) and must not be the same as any other global name or any local name, except a variable name, in the function subprogram. Within a function subprogram, the symbolic name of a function specified by a FUNCTION or ENTRY statement must not appear in any other nonexecutable statement, except a type-statement. In an executable statement, such a name may appear only as a variable. If the type of a function is specified in a FUNCTION statement, the function name must not appear in a type-statement. Note that a name must not have its type explicitly specified more than once in a program unit. If the name of a function subprogram is of type character, each entry name in the function subprogram must be of type character. If the name of the function subprogram or any entry in the subprogram has a length of (*) declared, all such entities must have a length of (*) declared; otherwise, all such entities must have a length specification of the same integer value. In a function subprogram, the symbolic name of a dummy argument is local to the program unit and must not appear in an EQUIVALENCE, PARAMETER, SAVE, INTRINSIC, DATA, or COMMON statement, except as a common block name. A character dummy argument whose length specification is an asterisk in parentheses must not appear as an operand for concatenation, except in a character assignment statement ( 10.4). A function specified in a subprogram may be referenced within any other procedure subprogram or the main program of the executable program. A function subprogram must not reference itself, either directly or indirectly. 15.6.3 Subroutine Subprogram Restrictions. A SUBROUTINE statement must appear only as the first statement of a subroutine subprogram. A subroutine subprogram may contain any other statement except a BLOCK DATA, FUNCTION, or PROGRAM statement. The symbolic name of a subroutine is a global name ( 18.1.1) and must not be the same as any other global name or any local name in the program unit. In a subroutine subprogram, the symbolic name of a dummy argument is local to the program unit and must not appear in an EQUIVALENCE, PARAMETER, SAVE, INTRINSIC, DATA, or COMMON statement, except as a common block name. A character dummy argument whose length specification is an asterisk in parentheses must not appear as an operand for concatenation, except in a character assignment statement ( 10.4). 15.7.4 ENTRY Statement Restrictions. Within a subprogram, an entry name must not appear both as an entry name in an ENTRY statement and as a dummy argument in a FUNCTION, SUBROUTINE, or ENTRY statement and must not appear in an EXTERNAL statement. In a function subprogram, a variable name that is the same as an entry name must not appear in any statement that precedes the appearance of the entry name in an ENTRY statement, except in a type-statement. If an entry name in a function subprogram is of type character, each entry name and the name of the function subprogram must be of type character. If the name of the function subprogram or any entry in the subprogram has a length of (*) declared, all such entities must have a length of (*) declared; otherwise, all such entities must have a length specification of the same integer value. In a subprogram, a name that appears as a dummy argument in an ENTRY statement must not appear in an executable statement preceding that ENTRY statement unless it also appears in a FUNCTION, SUBROUTINE, or ENTRY statement that precedes the executable statement. In a subprogram, a name that appears as a dummy argument in an ENTRY statement must not appear in the expression of a statement function statement unless the name is also a dummy argument of the statement function, appears in a FUNCTION or SUBROUTINE statement, or appears in an ENTRY statement that precedes the statement function statement. If a dummy argument appears in an executable statement, the execution of the executable statement is permitted during the execution of a reference to the function or subroutine only if the dummy argument appears in the dummy argument list of the procedure name referenced. Note that the association of dummy arguments with actual arguments is not retained between references to a function or subroutine. 15.9.3.6 Restrictions on Association of Entities. If a subprogram reference causes a dummy argument in the referenced subprogram to become associated with another dummy argument in the referenced subprogram, neither dummy argument may become defined during execution of that subprogram. For example, if a subroutine is headed by SUBROUTINE XYZ (A,B) and is referenced by CALL XYZ (C,C) the[n the dummy arguments A and B each become associated with the same actual argument C and therefore with each other. Neither A nor B may become defined during this execution of subroutine XYZ or by any procedures referenced by XYZ. If a subprogram reference causes a dummy argument to become associated with an entity in a common block in the referenced subprogram or in a subprogram referenced by the referenced subprogram, neither the dummy argument nor the entity in the common block may become defined within the subprogram or within a subprogram referenced by the referenced subprogram. For example, if a subroutine contains the statements: 1. SUBROUTINE XYZ (A) 2. COMMON C and is referenced by a program unit that contains the statements: 1. COMMON B 2. CALL XYZ (B) then the dummy argument A becomes associated with the actual argument B, which is associated with C, which is in a common block. Neither A nor C may become defined during execution of the subroutine XYZ or by any procedures referenced by XYZ. 15.10.1 Restrictions on Range of Arguments and Results. Restrictions on the range of arguments and results for intrinsic functions when referenced by their specific names are as follows: 1. Remaindering: The result for MOD, AMOD, and DMOD is undefined when the value of the second argument is zero. 2. Transfer of Sign: If the value of the first argument of ISIGN, SIGN, or DSIGN is zero, the result is zero, which is neither positive or negative ( 4.1.3). 3. Square Root: The value of the argument of SQRT and DSQRT must be greater than or equal to zero. The result of CSQRT is the principal value with the real part greater than or equal to zero. When the real part of the result is zero, the imaginary part is greater than or equal to zero. 4. Logarithms: The value of the argument of ALOG, DLOG, ALOG10, and DLOG10 must be greater than zero. The value of the argument of CLOG must not be (0.,0.). The range of the imaginary part of the result of CLOG is: -pi < imaginary part <= pi . The imaginary part of the result is pi only when the real part of the argument is less than zero and the imaginary part of the argument is zero. 5. Sine, Cosine, and Tangent: The absolute value of the argument of SIN, DSIN, COS, DCOS, TAN, and DTAN is not restricted to be less than 2pi . 6. Arcsine: The absolute value of the argument of ASIN and DASIN must be less than or equal to one. The range of the result is: -pi/2 <= result <= pi/2 . 7. Arccosine: The absolute value of the argument of ACOS and DACOS must be less than or equal to one. The range of the result is: 0 <= result <=pi . 8. Arctangent: The range of the result for ATAN and DATAN is: -pi/2 <= result <= pi/2 . If the value of the first argument of ATAN2 or DATAN2 is positive, the result is positive. If the value of the first argument is zero, the result is zero if the second argument is positive and pi if the second argument is negative. If the value of the first argument is negative, the result is negative. If the value of the second argument is zero, the absolute value of the result is pi/2 . The arguments must not both have the value zero. The range of the result for ATAN2 and DATAN2 is: -pi < result <= pi . The above restrictions on arguments and results also apply to the intrinsic functions when referenced by their generic names. 16.2 Block Data Subprogram Restrictions The BLOCK DATA statement must appear only as the first statement of a block data subprogram. The only other statements that may appear in a block data subprogram are IMPLICIT, PARAMETER, DIMENSION, COMMON, SAVE, EQUIVALENCE, DATA, END, and type-statements. Note that comment lines are permitted. If an entity in a named common block is initially defined, all entities having storage units in the common block storage sequence must be specified even if they are not all initially defined. More than one named common block may have entities initially defined in a single block data subprogram. Only an entity in a named common block may be initially defined in a block data subprogram. Note that entities associated with an entity in a common block are considered to be in that common block. The same named common block may not be specified in more than one block data subprogram in the same executable program. There must not be more than one unnamed block data subprogram in an executable program.