.. contents:: :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 DO
GOTO
s 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.GOTO
s into the DO
s inclusive scope, error/warn of invalid transfer of controlEND DO
or a CONTINUE
Semantics 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 FORMAT
FORMAT
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)