1
[A block_statement encloses a handled_sequence_of_statements optionally preceded by a declarative_part.]
2
block_statement::=
[block_statement_identifier:]
[declare
declarative_part]
begin
handled_sequence_of_statements
end [block_identifier];
3
If a block_statement has a block_statement_identifier, then the identifier shall be repeated after the end; otherwise, there shall not be an identifier after the end.
4
A block_statement that has no explicit declarative_part has an implicit empty declarative_part.
4.a
Ramification: Thus, other rules can always refer to the declarative_part of a block_statement.
5
{execution (block_statement) [partial]} The execution of a block_statement consists of the elaboration of its declarative_part followed by the execution of its handled_sequence_of_statements.
6
Example of a block statement with a local variable:
7
Swap: declare Temp : Integer; begin Temp := V; V := U; U := Temp; end Swap;
7.a
Ramification: If task objects are declared within a block_statement whose execution is completed, the block_statement is not left until all its dependent tasks are terminated (see 7.6). This rule applies to completion caused by a transfer of control.
7.b
Within a block_statement, the block name can be used in expanded names denoting local entities such as Swap.Temp in the above example (see 4.1.3).
7.c
The syntax rule for block_statement now uses the syntactic category handled_sequence_of_statements.