--- local: ---
After the Fortran input file(s) has been parsed into a syntax tree, the compiler must check that the program checks semantically. Target labels must be checked and violations of legal semantics should be reported to the user.
This is the detailed design document on how these labels will be semantically checked. Legal semantics may result in rewrite operations on the syntax tree. Semantics violations will be reported as errors to the user.
Enforcement of the general label constraints. There are three sorts of label usage. Labels can serve
FORMAT statements) for data transfer statements (I/O constructs)Labels are related to the standard definition of inclusive scope. For example, control-flow arcs are not allowed to originate from one inclusive scope and target statements outside of that inclusive scope.
Inclusive scope is defined as a tree structure of nested scoping constructs. A statement, s, is said to be in the same inclusive scope as another statement, t, if and only if s and t are in the same scope or t is in one of the enclosing scopes of s, otherwise s is not in the same inclusive scope as t. (Inclusive scope is unidirectional and is always from innermost scopes to outermost scopes.)
DO Loop RangingA label-do-stmt is a control construct that results in the iterative execution of a number of statements. A label-do-stmt has a (possibly shared, nonblock-do-construct) label that will be called the loop target label. The statements to be executed will be the range from the label-do-stmt to the statement identified by the loop target label, inclusive. This range of statements will be called the loop's body and logically forms a do-block.
A label-do-stmt is quite similar to a block-do-construct in semantics, but the parse tree is different in that the parser does not impose a do-block structure on the loop body.
In F18, the nonblock DO construct has been removed. For legacy support (through F08), we will need to handle nonblock DO constructs. In F18, the following legacy code is an error.
DO 100 I = 1, 100 DO 100 J = 1, 100 ... 100 CONTINUE
DO, error of malformed DOGOTOs from the loop body to “extended ranges” and back again (PGI & gfortan appear to allow, NAG & Intel do not.)DO CONCURRENT or loops annotated with OpenACC or OpenMP directives.GOTOs into the DOs inclusive scope, error/warn of invalid transfer of controlEND DO or a CONTINUESemantics for F08 and earlier that support sharing the loop terminating statement in a nonblock-do-construct between multiple loops
DO loop term position100 continue)If the DO loop is a DO CONCURRENT construct, there are additional constraints (11.1.7.5).
DO CONCURRENT (C1138)IEEE_GET_FLAG, IEEE_SET_HALTING_MODE, and IEEE_GET_HALTING_MODE cannot appear in the body of a DO CONCURRENT (C1141)ADVANCE= specifier by an I/O statement in the body of a DO CONCURRENT is not allowed (11.1.7.5, para 5)A GOTO statement is a simple, direct transfer of control from the GOTO to the labelled statement.
GOTO (11.2.1 constraints)GOTO statement (C1169)The computed GOTO statement is analogous to a switch statement in C++.
GOTO ( label-list ) [,] scalar-int-expr
GOTO)GOTO statement (C1170)INTEGER typeThis control-flow construct is deleted in F18.
IF (scalar-numeric-expr) label1,label2,label3
The arithmetic if statement is like a three-way branch operator. If the scalar numeric expression is less than zero goto label-1, else if the variable is equal to zero goto label-2, else if the variable is greater than zero goto label-3.
COMPLEX (F08:C849)These are a Fortran control-flow construct for combining a return from a subroutine with a branch to a labelled statement in the calling routine all in one operation. A typical implementation is for the subroutine to return a hidden integer, which is used as a key in the calling code to then, possibly, branch to a labelled statement in inclusive scope.
The labels are passed by the calling routine. We want to check those labels at the call-site, that is instances of alt-return-spec.
GOTO)CALL statementThese specifiers can appear in I/O statements and can transfer control to specific labelled statements under exceptional conditions like end-of-file, end-of-record, and other error conditions. (The PGI compiler adds code to test the results from the runtime routines to determine if these branches should take place.)
GOTO)Deleted feature since Fortran 95.
The assigned-goto-stmt and assign-stmt were action-stmt in the Fortran 90 standard. They are included here for completeness. This pair of obsolete statements can (will) be enabled as part of the compiler's legacy Fortran support.
The assign-stmt stores a label in an integer variable. The assigned-goto-stmt will then transfer control to the label stored in that integer variable.
ASSIGN 10 TO i ... GOTO i (10,20,30)
i in the example above) must be named and of type default integerASSIGN statementSome interpretation is needed as the terms of the older standard are different.
A “scoping unit” is defined as
This is a more lax definition of scope than inclusive scope.
A named variable distinguishes a variable such as, i, from an element of an array, a(i), for example.
In data transfer (I/O) statements (e.g., READ), the user can specify a FMT= specifier that can take a label as its argument. (R1215)
FMT= specifier has a label as its argument (C1230)FORMAT statementFORMAT, error statement must be a FORMATFORMAT statement must be in the same inclusive scope as the originating data transfer statement (also in 2008)FORMAT statements may appear in a host procedureFORMAT statement may be ignored, allowing a FORMAT to be referenced from any scope in the compilation.Various Fortran constructs can have names. These include
WHERE construct (10.2.3)FORALL construct (10.2.4)ASSOCIATE construct (11.1.3)BLOCK construct (11.1.4)CHANGE TEAM construct (11.1.5)CRITICAL construct (11.1.6)DO construct (11.1.7)IF construct (11.1.8)SELECT CASE construct (11.1.9)SELECT RANK construct (11.1.10)SELECT TYPE construct (11.1.11)A construct name is a name formed under 6.2.2. A name is an identifier. Identifiers are parsed by the parser.
Names must either not be given for the construct or used throughout when specified.
END statement must also specify the same name (WHERE C1033, FORALL C1035, ...)WHERE has additional ELSEWHERE clausesIF has additional ELSE IF and ELSE clausesSELECT CASE has additional CASE clausesSELECT RANK has additional RANK clausesSELECT TYPE has additional type-guard-stmt These additional statements must meet the same constraint as the END of the construct. Names must match, if present, or there must be no names for any of the clauses.CYCLE statement (11.1.7.4.4)The CYCLE statement takes an optional do-construct-name.
CYCLE has a construct-name, then the CYCLE statement must appear within that named do-construct (C1134)CYCLE does not have a do-construct-name, the CYCLE statement must appear within a do-construct (C1134)EXIT statement (11.1.12)The EXIT statement takes an optional construct-name.
EXIT has a construct-name, then the EXIT statement must appear within that named construct (C1166)EXIT does not have a construct-name, the EXIT statement must appear within a do-construct (C1166)DO CONCURRENT if the EXIT belongs to the DO CONCURRENT or an outer construct enclosing the DO CONCURRENT (C1167)CHANGE TEAM (CRITICAL) if the EXIT belongs to an outer construct enclosing the CHANGE TEAM (CRITICAL) (C1168)